我的 Slim PHP 框架中有不同的类,名为OrderController
& AddressController
。我想在AddressController
内访问OrderController
的一些函数以减少代码冗余。
但是无法找到方法,我在纯PHP设置中如何做到这一点,但是如何在 Slim PHP 框架中做到这一点?
PHP的方法如下:
class A {
private $xxx;
public function __construct() {
$this->xxx = 'Hello';
}
public function getXXX() {
return $this->xxx;
}
}
class B {
private $a;
public function __construct(A $a) {
$this->a = $a;
}
function getXXXOfA() {
return $this->a->getXXX();
}
}
$a = new A();
$b = new B($a);
$b->getXXXOfA();
如何在Slim中实现此依赖注入?
注意:我正在使用 Slim PHP v3
答案 0 :(得分:1)
我想到了两个解决方案:
您还可以尝试在单独的特征中使用常用功能。
我不会这样做 新的SecondController($ container) 在FirstController的构造函数中,除非你在每个控制器命中都需要它。 我喜欢延迟加载,因此只在需要时加载。
答案 1 :(得分:0)
如果您的AddressController
和OrderController
具有相同的父类,请将这些方法移至父级:
class AddressContoller extends Controller {
public function test() {
$this->methodFromParent();
}
}
如果没有,则创建该类的新对象并调用方法。方法必须 公开
class AddressContoller extends Controller {
public function test() {
$order = new OrderController();
$order->publicMethodInOrderClass();
}
}
答案 2 :(得分:0)
如果您的OrderController
想要从foo
调用方法AccessController
,您应该考虑将foo
移到其他地方。这是错误的SRP
有两种可能性
foo
属于/与每个控制器相关,并且与控制有关:只需将其移至父类。
foo
仅与几个类相关:将其移至类,它属于。这可能是一个辅助类,一些域模型类或其他东西。也许你必须介绍一个新的课程才能做到这一点。
答案 3 :(得分:0)
经过大量的研究,我终于找到了解决方案!如果以后任何人都可以从中获得帮助,请将其发布在此处:
class FirstController
{
protected $container;
protected $db;
protected $view;
protected $second;
// constructor receives container instance
public function __construct(\Interop\Container\ContainerInterface $container) {
$this->second = new SecondController($container);
$this->container = $container;
$this->db = $this->container->db;
$this->view = $this->container->view;
}
public function LocalFunction(){
$this->second->otherFunction();
//call the functions in other classes as above
}
}