在 SlimPHP 中访问其他 类 的函数

Access functions of other classes in SlimPHP

我必须在我的 Slim PHP 框架中使用不同的 类,命名为 OrderControllerAddressController。我想在 OrderController 中访问 AddressController 的某些功能以减少代码冗余。

但找不到方法,我知道如何在纯 PHP 设置中进行操作,但如何在 Slim PHP[= 中进行操作34=] 框架?

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

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

class AddressContoller extends Controller {
    public function test() {
        $this->methodFromParent();
    }
}

如果不是,则创建那个 class 的新对象并调用方法。方法必须public

class AddressContoller extends Controller {
    public function test() {
        $order = new OrderController();
        $order->publicMethodInOrderClass();
    }
}

如果您的 OrderController 想从 AccessController 调用方法 foo,您应该考虑将 foo 移到其他地方。这是错误 SRP

的一个很好的指标

有两种可能

  1. foo 属于 to/is 与 每个 控制器相关并且与控制有关:只需将其移动到父级 class.

  2. foo 只与几个 classes 相关:将其移至 class,它属于。这可能是一个助手 class、某个域模型 class 或其他东西。也许你必须引入一个新的 class 才能做到这一点。

经过大量研究,我终于找到了解决方案!将它张贴在这里,以便将来有人可以从中获得帮助:

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
    }

}

想到了 2 个解决方案:

-1-

您也可以尝试在单独的特征中拥有共同的功能。

-2-

我不会做 新的第二控制器($容器) 在 FirstController 的构造函数中,除非您在每次点击控制器时都需要它。 我喜欢延迟加载,所以它只在需要的时候加载。