Шаблоны
В этой статье, так же как и во всех прочих статьях документации термины шаблон («template»), вид («view») и представление («presentation») — полные синонимы и используются взаимозаменяемо — первый наиболее понятен и употребителен в русском языке, второй и третий происходят от концепции MVC. — прим. пер.
Шаблоны содержат тот самый HTML-код, отправляемый клиенту. Разделение представления и бизнес-логики позволяет сделать код понятнее и проще для поддержания. Шаблоны хранятся в папке application/views и имеют расширение .php. Класс PHPView
предоставляет удобный интерфейс для форматирования вывода и отправки его клиенту. Посмотрим на примеры.
xml<html> Файл находится в <kbd>views/home/index.php</kbd>. </html>
Возвращение шаблона из маршрута:
Route::get('/', function () {
return View::make('home.index');
});
Возвращение шаблона из контроллера:
public function action_index () {
return View::make('home.index');
});
Иногда вам нужно больше контроля за тем, что в итоге получит браузер. Например, вам может понадобиться отправить дополнительный заголовок. Вот как это делается:
Route::get('/', function () {
$headers = array('foo' => 'bar');
return Response::make('Привет, мир!', 200, $headers);
});
return Response::view('home', 200, $headers);
Привязка данных
Обычно маршрут или контроллер запрашивают данные из модели, которые затем отображаются с помощью шаблона. Таким образом, нам нужен механизм передачи данных в шаблон — для этого есть несколько способов, вы можете выбрать наиболее удобный для себя.
Route::get('/', function () {
return View::make('home')->with('name', 'Джеймс');
});
<html>
Привет, <?php echo $name; ?>.
</html>
View::make('home')
->with('name', 'Джеймс')
->with('votes', 25);
View::make('home', array('name' => 'James'));
Привязка через «магические свойства»:
$view->name = 'Джеймс';
$view->email = 'example@example.com';
Привязка через интерфейс ArrayAccess:
$view->name = 'Джеймс';
$view['email'] = 'example@example.com';
Добавление общих («разделяемых») данных для всех форматируемых шаблонов:
View::share('site_name', 'Моя страничка');
Вложенные шаблоны
Иногда вам нужно будет вложить один шаблон в другой. Вложенные шаблоны иногда называют частичными («partials») и они помогают вам поддерживать шаблоны компактными и модульными.
Вложение шаблона используя метод PHPView->nest
:
View::make('home')->nest('footer', 'partials.footer');
Передача данных вложенному шаблону:
$view = View::make('home');
$view->nest('content', 'orders', array('orders' => $orders));
Чтобы вставить шаблон изнутри другого шаблона используется функция render():
<div class="content">
<?php echo render('user.profile'); ?>
</div>
Часто один шаблон используется для отображения элемента списка. Например, можно создать шаблон для вывода инфморации об одном заказе, а в другом шаблоне пройти по списку заказов и вывести используя первый шаблон. Чтобы упростить код можно использовать функцию render_each():
<div class="orders">
<?php echo render_each('partials.order', $orders, 'order');
</div>
Первый параметр — имя шаблона для элемента, второй — массив элементов для форматирования, третий — имя переменной, которой присваивается очередной элемент списка перед передачей в частичный шаблон.
Именованные шаблоны
Шаблонам можно легко присваивать имена (так же, как и маршрутам — прим. пер.) для придания им выразительности и организованности.
Регистрация имени для шаблона:
View::name('layouts.default', 'layout');
return View::of('layout');
Привязка данных к именованному шаблону:
return View::of('layout', array('orders' => $orders));
Составители
Каждый раз, когда создаётся шаблон он вызывает событие-составитель («composer»). Это можно использовать для привязки общих данных к шаблону при каждом его создании. Один из частых случаев использования этого события — добавление панели боковой навигации со списком случайных статей в блоге. Вы можете вложить ваш частичный шаблон в шаблон страницы («layout view»), а затем зарегистрировать составитель для этого частичного шаблона, который будет получать данные из таблицы статей и передавать их в этот шаблон. Больше не нужно угадывать, какие данные должен загрузить именно этот контроллер. Составители обычно помещаются в application/routes.php.
Регистрация составителя для шаблона «home»:
View::composer('home', function ($view) {
$view->nest('footer', 'partials.footer');
});
Теперь каждый раз, когда создаётся шаблон home его экземпляр будет передан в зарегистрированную анонимную функцию (Closure), где вы можете подготовить его, как вам нужно.
Шаблон может иметь любое число составителей, не обязательно только один. Вам есть, где развернуться!
Переадресация
Важно отметить, что и маршруты, и контроллеры требуют, чтобы ответ клиенту был возвращён с помощью return — вместо простого вызова PHPRedirect::to();
вам нужно вернуть объект как PHPreturn Redirect::to();
. В этом отличительная особенность Laravel от большинства других PHP-фреймворков и из-за этого она может быть упущена из вида.
Переадресация на другой URI:
return Redirect::to('user/profile');
Переадресация с определённым HTTP-кодом:
return Redirect::to('user/profile', 301);
Переадресация на защищённый URI (через HTTPS):
return Redirect::to_secure('user/profile');
Переадресация на начальную страницу:
return Redirect::home();
Переадресация на предыдущую страницу (используя PHPRequest::referrer
):
return Redirect::back();
Переадресация на именованный маршрут:
return Redirect::to_route('profile');
Переадресация на действие контроллера:
return Redirect::to_action('home@index');
Вам может потребоваться переадресовать пользователя на именованный маршрут и в то же время заменить шаблоны в его адресе ((:any), (:hnum) и т.д. — прим. пер.) на нужные значения. Это легко сделать:
return Redirect::to_route('profile', array($username));
Переадресация к действию с подстановкой значений:**
return Redirect::to_action('user@profile', array($username));
...с одноразовыми переменными
Часто после того, как пользователь зарегистрировался или вошёл в систему, принято показывать приветственное сообщение — однако как сохранить его так, чтобы оно было доступно только для следующего запроса? Метод PHPRedirect->with
используется для переадресации с одновременным сохранением одноразовых переменных (!!(tl_note) «flash data» — значения, удаляемые после того, как клиент откроет страницу, следующую после той, на которой эти значения были сохранены — прим. пер.).
return Redirect::to('profile')->with('status', 'Добро пожаловать!');
Вы можете прочитать это значение с помощью метода PHPSession::get
:
$status = Session::get('status');
Скачивание файлов
Отправка файла на скачивание клиенту:
return Response::download('file/path.jpg');
Скачивание файла с присвоением имени:
return Response::download('file/path.jpg', 'photo.jpg');
Ошибки
Для отсылки страницы об ошибке просто укажите её HTTP-код. Нужный шаблон будет автоматически загружен из папки views/error.
Отправка ошибки 404 («Файл не найден»):
return Response::error('404');
Отправка ошибки 500 («Внутренняя ошибка сервера»):
return Response::error('500');