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 抱歉英语不好 ))
我认为你把事情变得有点过于复杂了。控制器不是服务,因此它不会作为对象传递(至少在程序员控制的级别上)。这意味着您可以而且应该自己控制依赖注入。因此,根据docs,有三个选项可以指向您的控制器需要任何依赖项的 Laravel:
1.构造函数注入
如果您想确保某些控制器始终具有可用的实体管理器,您可以创建一个父类。但实际上我并没有看到其中的真正价值,接受也许您使用几个实体管理器,并且它们必须传递给不同的控制器。
2.方法注入
由于并非控制器中的所有操作通常都使用实体管理器,因此它可能是一个有效的选项。
如果您阅读laravel 学说文档,您可以找到另一个选项,即使用门面:
您可以使用外观来访问 EntityManager 方法
无论如何,在我看来,接口应该用来定义契约,而不是定义某些内部功能的可用性。
关于// Other work with $manager:
您可以在服务提供商级别扩展您的实体管理器。关于如何执行此操作,还有多种选择。您可以在文档中找到它们。