通过 setter 进行依赖注入

XYZ*_*XYZ 5 php design-patterns laravel

Laravel 是否有能力通过方法引入依赖?
例如,我有一个实现DoctrineWorkable接口的控制器:

interface DoctrineWorkable {
    public function setEntityManager(EntityManager $manager);
}

trait EntityManagerTrait {
   protected $manager;

    public function setEntityManager(EntityManager $manager) {
        $this->manager = $manager;
        // Other work with $manager
    }
}

class TestController implements DoctrineWorkable {
    use EntityManagerTrait;
}
Run Code Online (Sandbox Code Playgroud)

如何setEntityManager在服务容器中使用该方法?要得到这样的东西:

if ($class instanceof DoctrineWorkable) {
    $class->setEntityManager(new EntityManager());
}
Run Code Online (Sandbox Code Playgroud)

ps 抱歉英语不好 ))

sev*_*etl 2

我认为你把事情变得有点过于复杂了。控制器不是服务,因此它不会作为对象传递(至少在程序员控制的级别上)。这意味着您可以而且应该自己控制依赖注入。因此,根据docs,有三个选项可以指向您的控制器需要任何依赖项的 Laravel:

1.构造函数注入

如果您想确保某些控制器始终具有可用的实体管理器,您可以创建一个父类。但实际上我并没有看到其中的真正价值,接受也许您使用几个实体管理器,并且它们必须传递给不同的控制器。

2.方法注入

由于并非控制器中的所有操作通常都使用实体管理器,因此它可能是一个有效的选项。

如果您阅读laravel 学说文档,您可以找到另一个选项,即使用门面:

您可以使用外观来访问 EntityManager 方法

无论如何,在我看来,接口应该用来定义契约,而不是定义某些内部功能的可用性。

关于// Other work with $manager

您可以在服务提供商级别扩展您的实体管理器。关于如何执行此操作,还有多种选择。您可以在文档中找到它们。