@slip31

А как работать с Symfony Routing отдельным компонентом?

Добрый день. Хотел на свой проект воткнуть роутинг от Symfony.
Документацию читал, начал делать по ней (без аннотаций, так как для них, очевидно, надо ставить сам симфони) и что-то я туплю дальше
Такой же алгоритм, правильно?
1) Прописываю сами роуты и привязываю контроллеры
$routes = new RouteCollection();
$routes->add('home', new Route('/', ['_controller' => [HomeController::class, 'index']]));
$routes->add('article', new Route('/article', [ '_controller' => [ArticleController::class, 'index']]));

2) Далее делаю
$context = new RequestContext();
$request = Request::createFromGlobals();
$context->fromRequest($request);
$matcher = new UrlMatcher($routes, $context);
$parameters = $matcher->match($request->getPathInfo());
  //       print_r($parameters);

Всё ок. Если на главной, то print_r выдает
Array ( [_controller] => Array ( [0] => App\controllers\HomeController [1] => index ) [_route] => home )

на site/article
Array ( [_controller] => Array ( [0] => App\lib\ArticleController [1] => index ) [_route] => article )

На тех, которых нет, выдает
ResourceNotFoundException: No routes found for ... ,что тоже, в общем, правильно.
А что непосредственно должно переводить на контроллер? Что я упустил?
class HomeController {

    public function __construct() {
        $this->actionIndex();
    }

    public function index() {
        print_r('Home Controller');      
    }

}

Не выводит "Home Controller".
Что я упустил?
  • Вопрос задан
  • 103 просмотра
Решения вопроса 1
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
Это уже зависит от вашего приложения.
Можно, к примеру, использовать https://github.com/PHP-DI/Invoker, будет что-то вроде

$parameters = $matcher->match($request->getPathInfo());
$invoker = new Invoker\Invoker(null, $container);
$invoker->call($parameters['_controller'], $parameters);


Если без контейнера, то что-то вроде
$parameters = $matcher->match($request->getPathInfo());
list($class, $action) = $parameters['_controller'];
unset($parameters['_controller']);
$controller = new $class;
$controller->$action($parameters);

Но передача аргументов через массив - не очень удобно.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы