如何在php-di中注册calss以在实例化时自动调用某些方法

时间:2019-06-06 02:57:51

标签: php dependency-injection php-di

我以这种方式运行控制器

$controller = $this->getContainer()->get($class);
$controller->{$method}(...array_values($vars));

现在在控制器内部,我需要使用模型 如果我尝试自动连线

这样的模型
class MyClass extends Controller
{
    public function doSmth(myModel $myModel)
    {
           $myModel->getAll());
    }
}

我收到有关错误参数类型的错误。 控制器方法不应该始终使用某些模型,因此需要在方法内部实例化模型。

好的,然后我试图 直接实例化模型

class MyClass extends Controller
{
    public function doSmth()
    {
           $myModel = new myModel();
           $myModel->getAll());
    }
}

但是我收到问题,我需要模型内部的容器实例(例如,设置DB连接,并且这些设置在容器内部注册)。 我可以像这样将容器实例从控制器转移到模型:

class MyClass extends Controller
{
    public function doSmth()
    {
           $myModel = new myModel($this->container);
           $myModel->getAll());
    }
}

但是每次我需要一些模型时,我都必须这样做,这很丑...

我是php-di的新手。我知道当我在方法DI中实例化时不会跟踪它... 只是不知道该如何设置?

1 个答案:

答案 0 :(得分:0)

由于Controller具有容器的实例,因此仅需要通过容器调用模型并将其包装在诸如 getModel($ modelName)

之类的方法中即可
class MyClass extends Controller
{
    public function doSmth()
    {
        $myModel = $this->getModel('MyModel');
        $myModel->getAll());
    }
}

获得模型将像:

class Controller
{
    protected $c;

    public function __construct(ContainerInterface $c)
    {
        $this->c = $c;
    }

    public function getModel(string $name)
    {
        return $this->c->get($name);
    }
}