Symfony Controllers

Создание контроллера

Предлагаю автоматизировать рутинную работу с помощью подключения рецепта генератора, хотя ничего не будет мешать создавать сущности, контроллеры и прочее руками. В консоли пишем composer require generator. После установки к генератору можно обращаться php bin/console make:генерируемая_сущность. Функционал можно посмотреть командой php bin/console list make.

Теперь, когда все необходимые компоненты подключены, создадим контроллер PostController.
Пишем php bin/console make:controller и вводим имя котроллера - Post. В папке src с ним же сгенерировались директории Controller, Entity, Migration, Repository.

Routing

Проваливаемся в контроллер PostController и видим в блоке аннотаций @Route, прямо над методом index. Это один из вариантов роутинга в Symfony, конкретно в данном случае работающий через аннотации.

        
    @Route("/post", name="post")
        
    

/post – это маршрут. То, что будет написано в адресной строке
name – это имя, по которому можно обращаться к текущему методу. Например, для генерации ссылок.

Однако, для того чтобы вся эта магия работала нам нужно подключить annotations. Снова идем в консоль и печатаем composer require annotations.

Маршруты могут быть настроены в файлах YAML, XML, PHP или аннотациях. Функционал у всех един.

Чтобы убедиться в работоспособности контроллера, просто перейдем по маршруту /post, конечно же запустив предварительно сервер. Ответ будет в формате json, то есть именно то, что возвращает метод index.

        
    return $this->json([
            'message' => 'Welcome to your new controller!',
            'path' => 'src/Controller/PostController.php',
    ]);
        
    

Очень удобной может быть команда php bin/console debug:route, которая покажет список всех маршрутов вашего приложения. Особенно пригодится, когда проект станет достаточно большим.

Для того, чтобы изменить маршрут по умолчанию, необходимо внести правки в файл config => routes.yaml, указав путь и контроллер, который нужен вам. Предлагаю дефолтным сделать маршрут /post.

        
    index:
        path: /
        controller: App\Controller\PostController::index