首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在php-di中注册调用,以便在实例化时自动调用某些方法

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

Stack Overflow用户
提问于 2019-06-06 10:57:51
回答 1查看 32关注 0票数 0

我这样运行控制器

代码语言:javascript
复制
$controller = $this->getContainer()->get($class);
$controller->{$method}(...array_values($vars));

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

代码语言:javascript
复制
class MyClass extends Controller
{
    public function doSmth(myModel $myModel)
    {
           $myModel->getAll());
    }
}

我收到关于错误参数类型的错误信息。控制器方法不应该总是使用某个模型,因此需要在方法中实例化模型。

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

代码语言:javascript
复制
class MyClass extends Controller
{
    public function doSmth()
    {
           $myModel = new myModel();
           $myModel->getAll());
    }
}

但我收到的问题是,我需要模型内容器的实例(例如,设置DB连接,以及在容器内注册这些设置)。我可以将容器实例从控制器传输到模型,如下所示:

代码语言:javascript
复制
class MyClass extends Controller
{
    public function doSmth()
    {
           $myModel = new myModel($this->container);
           $myModel->getAll());
    }
}

但每次我需要模型的时候我都得这么做,这太难看了……

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

EN

回答 1

Stack Overflow用户

发布于 2019-06-07 04:41:28

因为控制器有一个容器实例,只需通过容器调用模型并将其包装在某个方法中,如getModel($modelName)

代码语言:javascript
复制
class MyClass extends Controller
{
    public function doSmth()
    {
        $myModel = $this->getModel('MyModel');
        $myModel->getAll());
    }
}

get模型将会像这样:

代码语言:javascript
复制
class Controller
{
    protected $c;

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

    public function getModel(string $name)
    {
        return $this->c->get($name);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56470379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档