{{TOC}} {{DOCVER 4.0=0da300f6445bec5a70d007f503834fce957b065b 16.10.2014 04:19:00, 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 05:21:00, 4.2=d7b13440c003218ed79e9d508706eca01990122f 4.12.2014 5:01:15}} == Простейшие контроллеры == Вместо того, чтобы определять всю ((docs/v4/routing маршрутизацию)) (//routing//) вашего проекта в файле %%(t)routes.php%% вы можете организовать её, используя класс %%Controller%%. Контроллеры могут группировать связанную логику в отдельные классы, а кроме того использовать дополнительные возможности Laravel, такие как автоматическое ((docs/v4/ioc внедрение зависимостей)). Контроллеры обычно хранятся в папке %%(t)app/controllers%%, а этот путь по умолчанию зарегистрирован в ((docs/v4/configuration настройке)) **classmap** вашего файла %%(t)composer.json%%. Тем не менее контроллеры технически могут жить в любом каталоге или подкаталоге. Объявления маршрутов не зависят от расположения на диске файла класса контроллера. Поэтому, пока Composer знает, как автоматически загружать класс контроллера, этот файл может быть размещён где угодно. Вот пример простейшего класса контроллера: %% class UserController extends BaseController { /** * Отобразить профиль соответствующего пользователя. */ public function showProfile($id) { $user = User::find($id); return View::make('user.profile', array('user' => $user)); } } %% Все контроллеры должны наследовать класс %%BaseController%%. Этот класс также может хранится в папке %%(t)app/controllers%% и в него можно поместить общую логику для других контроллеров. %%BaseController%% расширяет стандартный класс Laravel, %%Controller%%. Теперь, определив контроллер, мы можем зарегистрировать маршрут для его действия (//action//): %% Route::get('user/{id}', 'UserController@showProfile'); %% Если вы решили организовать ваши контроллеры в пространства имён, просто используйте полное имя класса при определении маршрута: %% Route::get('foo', 'Namespace\FooController@method'); %% .(alert) Поскольку мы используем ((http://getcomposer.org Composer)) для автозагрузки наших PHP-классов, то контроллеры могут жить где угодно в файловой системе, пока Composer знает, как их загружать. Для каталога контроллера не требуется какая-либо особая структура папок в вашем приложении. Маршрутизация контроллеров полностью отделена от файловой системы. .(tl_note) Помните, что имена класса в строках следуют обычным правилам PHP и если ваш класс начинается с **n**, **t** и других букв в нижнем регистре, то обратный слэш перед ними нужно экранировать - иначе они преобразуются в разрыв строки, табуляцию или иной спецсимвол: %%"namespace\new_controller"%% - //прим. пер.// Вы также можете присвоить имя этому маршруту: %% Route::get('foo', array('uses' => 'FooController@method', 'as' => 'name')); %% Вы можете получить URL к //действию// методом %%URL::action()%% или вспомогательный метод %%action()%%: %% $url = URL::action('FooController@method'); $url = action('FooController@method'); %% Получить имя //действия//, которое выполняется в данном запросе, можно методом %%currentRouteAction()%%: %% $action = Route::currentRouteAction(); %% == Фильтры для контроллеров == ((docs/v4/routing#фильтры Фильтры)) могут указываться для контроллеров аналогично "обычным" маршрутам: %% Route::get('profile', array('before' => 'auth', 'uses' => 'UserController@showProfile')); %% Однако вы можете указывать их и изнутри самого контроллера: %% class UserController extends BaseController { /** * Создать экземпляр класса UserController. */ public function __construct() { $this->beforeFilter('auth', array('except' => 'getLogin')); $this->beforeFilter('csrf', array('on' => 'post')); $this->afterFilter('log', array('only' => array('fooAction', 'barAction'))); } } %% Можно устанавливать фильтры в виде функции-замыкания: %% class UserController extends BaseController { /** * Создать экземпляр класса UserController. */ public function __construct() { $this->beforeFilter(function () { // }); } } %% %%(DOCNEW 4.1=efd541a0b218b1c6aafb73f0051c18ed150e3c24 25.05.2014 05:21:00) Если вы хотите использовать другой метод в качестве фильтра для контроллера, то можете использовать **@**-синтаксис для определения фильтра: ~%% class UserController extends BaseController { /** * Создание нового экземпляра UserController. */ public function __construct() { $this->beforeFilter('@filterRequests'); } /** * Фильтрация входящих запросов. */ public function filterRequests($route, $request) { // } } ~%% %% == ((#restful)) Неявные контроллеры == Laravel позволяет вам легко создавать единый маршрут для обработки всех //действий// контроллера. Для начала зарегистрируйте маршрут методом %%Route::controller()%%. %% Route::controller('users', 'UserController'); %% .(tl_note) До версии 4.2 "неявные" контроллеры назывались "((ВП:REST RESTful))" - //прим. пер.// Метод %%controller()%% принимает два аргумента. Первый - корневой ((ВП:URI)) (путь), который обрабатывает данный контроллер, а второй - имя класса самого контроллера. После регистрации просто добавьте методы в этот класс с префиксом в виде типа HTTP-запроса (//HTTP verb//), который они обрабатывают. %% class UserController extends BaseController { public function getIndex() { // GET-запрос. } public function postProfile() { // POST-запрос. } public function anyLogin() { // } } %% Методы **index** обрабатывают корневой URI контроллера - в нашем случае это %%(t)users%%. Если имя //действия// вашего контроллера состоит из нескольких слов вы можете обратиться к нему по URI, используя синтаксис с дефисами (%%(t)-%%). Например, следующее действие в нашем классе %%UserController%% будет доступно по адресу %%(t)users/admin-profile%%: %% public function getAdminProfile() {} %% == ((#ресурс)) RESTful-контроллеры ресурсов == Контроллеры ресурсов упрощают построение RESTful-контроллеров, работающих с ресурсами. Например, вы можете создать контроллер, обрабатывающий фотографии, хранимые вашим приложением. Вы можете быстро создать такой контроллер с помощью команды **controller:make** интерфейса ((docs/v4/artisan Artisan)) и метода %%Route::resource()%%. .(tl_note) До версии 4.2 эти контроллеры назывались просто ресурсными, а RESTful были те, что с этой версии стали называться "неявными" - //прим. пер.// Для создания контроллера выполните следующую консольную команду: %%(sh) php artisan controller:make PhotoController %% Теперь мы можем зарегистрировать его как контроллер ресурса: %% Route::resource('photo', 'PhotoController'); %% Этот единственный вызов создаёт множество маршрутов для обработки различных RESTful-действий на ресурсе %%(t)photo%%. Сам сгенерированный контроллер уже имеет методы-заглушки для каждого из этих маршрутов с комментариями, которые напоминают вам о том, какие типы запросов они обрабатывают. **Запросы, обрабатываемые контроллером ресурсов** %%(hvlraw)
Тип | Путь | Действие | Имя маршрута |
---|---|---|---|
GET | /resource | index | resource.index |
GET | /resource/create | create | resource.create |
POST | /resource | store | resource.store |
GET | /resource/{resource} | show | resource.show |
GET | /resource/{resource}/edit | edit | resource.edit |
PUT/PATCH | /resource/{resource} | update | resource.update |
DELETE | /resource/{resource} | destroy | resource.destroy |