访问SlimPHP中其他类的功能

时间:2017-04-05 07:36:41

标签: php oop slim slim-3

我的 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 Framework

注意:我正在使用 Slim PHP v3

4 个答案:

答案 0 :(得分:1)

我想到了两个解决方案:

-1 -

您还可以尝试在单独的特征中使用常用功能。

-2 -

我不会这样做 新的SecondController($ container) 在FirstController的构造函数中,除非你在每个控制器命中都需要它。 我喜欢延迟加载,因此只在需要时加载。

答案 1 :(得分:0)

如果您的AddressControllerOrderController具有相同的父类,请将这些方法移至父级:

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

的一个很好的指标

有两种可能性

  1. foo属于/与每个控制器相关,并且与控制有关:只需将其移至父类。

  2. 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
    }

}