【问题标题】:Dependency Injection through a setter通过 setter 进行依赖注入
【发布时间】:2018-01-27 11:47:49
【问题描述】:

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;
}

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

if ($class instanceof DoctrineWorkable) {
    $class->setEntityManager(new EntityManager());
}

附言抱歉英语不好))

【问题讨论】:

标签: php laravel design-patterns


【解决方案1】:

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

1.构造函数注入

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

2。方法注入

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

如果您阅读laravel doctrine docs,您会发现另一个选项,它使用外观:

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

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

关于// Other work with $manager

您可以在服务提供商级别扩展您的实体管理器。关于如何做到这一点,还有几个选项。您可以在documentation 中找到它们。

【讨论】:

    猜你喜欢
    • 2019-10-18
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    相关资源
    最近更新 更多