我有一个扩展Pimple\Container的自定义类。在我看来,这个想法是用丑陋的方法来访问定义的服务(参见下面):
offsetGet($key) -> get($key)
offsetSet($key, $val) -> set($key, $val)
offsetExists($key) -> has($key)这个想法对我想要做的事情很有效。然后,我创建了一个应用程序类,我选择了继承而不是聚合,这并不是因为看起来是逻辑的原因。
现在的问题是当我有一个ServiceProvider来接受应用程序实例而不是Pimple\容器时,因为我创建了自己的ServiceProviderInterface来定义这个契约。
现在我意识到,假设Application过去是并且仍然是一种容器类型,并让它使用与父类不同类型的契约,这不是一个好主意。但是,在我看来,应用程序实例在概念上是某种容器,因为其中存储了一些关键的=>值对数据。
我原以为界面整合原则会节省我的时间,但我不确定。
简单地说,是否有可能扩展Pimple的容器,忽略库的服务提供者,并使用您的容器定义相同的契约,但参数不同?
发布于 2016-07-20 21:02:49
首先,
在我看来,这个想法是用丑陋的方法来访问定义的服务。
丑陋的方法来自ArrayAcess接口,它允许您以类似数组的形式访问属性:
$container = new Pimple();
$container['session_storage'] = function ($c) {
return new SessionStorage('SESSION_ID');
};
$container['session'] = function ($c) {
return new Session($c['session_storage']);
};然后,我继续创建了一个应用程序类,我选择继承而不是聚合,而不是出于任何特定的原因,而不是看上去是逻辑的
这是不对的。在可能的情况下,应该始终选择聚合而不是继承。
继承是一个静态的紧密耦合关系,在PHP中它仅限于一个。不能在运行时更改继承。
另一方面,构图是一种动态的,如果执行尊重坚实的原则,可能是孤立耦合的。在使用组合时,您可以在运行时完美地切换关系。
现在的问题是当我有一个ServiceProvider来接受应用程序实例而不是Pimple\容器时,因为我创建了自己的ServiceProviderInterface来定义这个契约。
这没道理!您的服务提供者为什么要依赖您的应用程序?不应该是相反的吗?提供程序是一个独立的模块。您的应用程序有几个依赖项。
关于你的问题,
Container对象替换为Application对象,而不会失去任何功能?https://stackoverflow.com/questions/38483732
复制相似问题