@semki096

Как работает эта магия роутера в Slim (на примере)?

Вот роутер
$app->get('/', 'App\Controllers\UserController:listUsers');

Вот контроллер
class UserController {

  protected $container;   

  public function __construct($container) {
        $this->container = $container;
  }
    
    public function listUsers($request, $response){       
        return $this->container->view->render($response, 'home.twig');
    }
    
}

Вопрос - мы же в роутере контейнер не передаем, как же тогда в конструктор попадает этот контейнер?
  • Вопрос задан
  • 251 просмотр
Решения вопроса 1
@smple
Это называется di (внедрение зависимостей)

в $app->get строка 'App\Controllers\UserController:listUsers' преобразуется в App\Controllers\UserController и метод listUsers с помощью explode(':', 'App\Controllers\UserController:listUsers');

После этого с помощью инструмента внедрения зависимостей (в случае со slim используется Pimple со своими загрузчиками объектов) создается объект и по умолчанию передает сам себя в конструктор (так ты в конструкторе получаешь container который по сути объект pimple который реализует psr\container

Далее идет вызов у объекта что был получен на прошлом шаге выбранного метода если он был указан с аргументами current.request и current.response которые определены внутри pimple

Ну и тут выполняется уже твой код ты у pimple запрашиваешь контейнер который отвечает за view, по умолчанию это объект Twig вроде и у него вызываешь метод render в котором у тебя вроде перепутанны аргументы (в начале имя шаблона, потом аргументы для этого шаблона в виде массива)

Рендерится шаблон на выходе получается строка, это строка помещается в response внутри app после вызова метода, если результат метода не response и далее этот response отсылается пользователю

В общих чертах примерно так, со своими нюансами и еще у slim есть несколько версий которые существенно отличаются.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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