Контроллеры в Symfony framework (Урок 5. Контроллеры)

После создания bundle( в предыдущем уроке ) пора приступить до описания логики приложения. Для этого нам понадобится понимание принципов работы контроллеров в Symfony framework. (О том, что такое контроллер как категория MVC можно почитать здесь). Простейший контроллер выглядит следующим образом:

// src/Acme/HelloBundle/Controller/HelloController.php
namespace AcmeHelloBundleController;

use SymfonyBundleFrameworkBundleControllerController;

class HelloController extends Controller { public function indexAction($name) { //... } }

Каждый контролер вашего приложения должен иметь namespace директория_вашего_бандлаController (2 строка), иначе он не будет восприниматься как контроллер. Use делает для нас доступным базовый класс контроллера Symfony framework. Наш класс контроллера создан как наследник базового класса контроллера Symfony framework. Это не обязательно, но при написании сложного проекта нужно использовать функционал Symfony.

Обратите внимание на имя контроллера: оно обязательно должно содержать сначала имя, а потом приставку Controller.

Метод indexAction - то, что будет управлять вводом-выводом, и, как следствие, предоставлять информацию конечному пользователю. Опять же, имя должно содержать приставку Action - как в примере.

Action контроллера может иметь (или не иметь =)) входные параметры. Эти параметры определяются роутингом (об этом следующий урок). Сейчас нам важно помнить, что порядок аргументов не имеет значения - Symfony позаботилась об этом.

Дальше рассмотрим некоторые специфические задачи контроллера. Например, переадресация осуществляется следующим образом:

public function indexAction()
 {
  return $this->redirect($this->generateUrl('homepage'));
 }
По умолчанию, редирект 302. Если вы хотите 301, укажите это вторым аргументом:
public function indexAction()
 {
  return $this->redirect($this->generateUrl('homepage'), 301);
 }
Если вы хотите сделать более "хитрый" редирект - на другой контроллер (в результате чего пользователь даже не заметит подмены), то
public function indexAction($name)
 {
  $response = $this->forward('AcmeHelloBundle:Hello:fancy', array(
  'name' => $name, 
  'color' => 'green',
));

return $response; }

И, наиболее очевидна задача контроллера - отрисовка шаблона (template):
use SymfonyComponentHttpFoundationResponse;
$content = $this->renderView(
'AcmeHelloBundle:Hello:index.html.twig',
array('name' => $name)
);
return new Response($content);
О шаблонах поговорим немного позже. Сейчас важно, что контроллер передает параметры шаблону и рендерит его.

404 страница вызывается следующим образом:

throw $this->createNotFoundException('The product does not exist');
Также интересной особенностью контроллера есть работа с сессией:
$session = $this->getRequest()->getSession();

$session->set('foo', 'bar');

$foo = $session->get('foo');

У Symfony framework предусмотрена интересная возможность"мгновенных сообщений", которые хранятся в сессии только до следующего запроса:
$this->get('session')->getFlashBag()->add('notice', 'Your changes were saved!');
Подобные вещи удобно использовать для форм регистрации/авторизации.

На этой оптимистической ноте можно считать ознакомление с контроллерами в Symfony framework оконченным =)

Подробнее читайте на сайте symfony.com