как зарегистрировать calss в php-di для автоматического вызова какого-либо метода при его создании - PullRequest
0 голосов
/ 06 июня 2019

я запускаю контроллер таким образом

$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());
    }
}

но я получаю проблему, что мне нужен экземпляр контейнера внутри модели (например, для настройки соединения с БД, и эти настройки зарегистрированы в контейнере). я мог бы передать экземпляр контейнера из контроллера в модель следующим образом:

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

но я должен был бы делать это каждый раз, когда мне нужна какая-то модель, и это ужасно ...

Я новичок в php-di. я знаю, что когда я создаю экземпляр внутри метода, DI не отслеживает его ... просто не знаете, как это установить?

1 Ответ

0 голосов
/ 06 июня 2019

, поскольку у 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);
    }
}

...