@semki096

Как работает передача контейнера в контроллер (Slim php фреймворк)?

Я создал 2 контейнера
$container['view'] = new \Slim\Views\PhpRenderer('../app/templates/');

$container['HomeController'] = function($container){
    $HomeController = new \App\Controllers\Homecontroller($container['view']);
    return $HomeController;
};

Далее создал роутер
//так работает
$app->get('/home', 'HomeController:home');


При переходе по ссылке /home мы обращаемя к методу home класса HomeController.
Вопрос. Правильно ли я понимаю что обращение идет через контейнер? Если я напишу так как ниже и обращусь непосредственно к функции - то это не сработает, видимо не передается объект view
//так не работает, видимо не передается объект view
$app->get('/home', '\App\Controllers\Homecontroller:home');

Буду признателен если обьясните, как это работает, как по шагам работает передача контейнера в контроллер. Вот кстати мой контроллер
namespace App\Controllers;

use \Slim\Views\PhpRenderer;

class HomeController
{
    public $view;

    public function __construct(PhpRenderer $view) {
        
        $this->view = $view;
    }
    
    public function home($request, $response) {
        
        return $this->view->render($response, 'index.phtml');
    }
}
  • Вопрос задан
  • 493 просмотра
Решения вопроса 1
delphinpro
@delphinpro
frontend developer
При передаче строки, роутер сначала посмотрит, имеется ли в контейнере такой объект, и если имеется, то вернет его. Если нет, попытается интерпретировать строку как имя контроллера с экшеном и создаст новый экземпляр.
Во втором случае в конструктор контроллера будет передан сам контейнер, из которого вы можете получить доступ к View.
В свою очередь, если вы создадите объект в контейнере так
$container['\App\Controllers\Homecontroller'] = ...

то эта запись должна работать
$app->get('/home', '\App\Controllers\Homecontroller:home');


По идее, контроллеры можно и не включать в контейнер вовсе, а доступ к зависимостям получать через переданный контейнер

public function __construct($c) {
  $this->container = $c;
  
  $this->container->get('view');
}


Но это спорный вопрос.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы