PHP 带工厂的依赖注入容器
PHP Dependency Injection Container With Factory
我正在使用 silexphp/Pimple
依赖注入容器 (DIC),但不确定如何处理 classic 工厂模式。
示例:
A parent class Animal.php
有两个 child classes 称为 DogAnimal.php
和 CatAnimal.php
。 child class 的数量 可以 增长。
在这种情况下,我想创建一个工厂来创建新的 Animal Objects 或 children 的 Animal class。 Pimple 允许为每个服务创建工厂方法。
在使用 Pimple DIC 时,我不想将每个子class(狗、猫等)添加为服务。特别是随着列表的增长。对我来说,这似乎是对 DIC 的误用,但也许我错了。
我假设我 应该 创建动物工厂服务并使用 Pimple 将依赖项注入工厂,而工厂又被用来创建新的狗或猫,我是否正确?
是的,你是对的。您可以创建一个服务 (AnimalFactory
) 来创建您要使用的对象 (DogAnimal
、CatAnimal
、...)。
一个简单的例子可以是:
class AnimalFactory
{
public function createAnimal($name)
{
// some logic here with $name
$animal = new ...();
return $animal;
}
}
$pimple['animal_factory'] = function ($c) {
return new AnimalFactory();
};
$dog = $pimple['animal_factory']->createAnimal('Dog');
我正在使用 silexphp/Pimple
依赖注入容器 (DIC),但不确定如何处理 classic 工厂模式。
示例:
A parent class Animal.php
有两个 child classes 称为 DogAnimal.php
和 CatAnimal.php
。 child class 的数量 可以 增长。
在这种情况下,我想创建一个工厂来创建新的 Animal Objects 或 children 的 Animal class。 Pimple 允许为每个服务创建工厂方法。
在使用 Pimple DIC 时,我不想将每个子class(狗、猫等)添加为服务。特别是随着列表的增长。对我来说,这似乎是对 DIC 的误用,但也许我错了。
我假设我 应该 创建动物工厂服务并使用 Pimple 将依赖项注入工厂,而工厂又被用来创建新的狗或猫,我是否正确?
是的,你是对的。您可以创建一个服务 (AnimalFactory
) 来创建您要使用的对象 (DogAnimal
、CatAnimal
、...)。
一个简单的例子可以是:
class AnimalFactory
{
public function createAnimal($name)
{
// some logic here with $name
$animal = new ...();
return $animal;
}
}
$pimple['animal_factory'] = function ($c) {
return new AnimalFactory();
};
$dog = $pimple['animal_factory']->createAnimal('Dog');