Создание представлений
Представления (views), они же макеты, содержат HTML-код, передаваемый вашим приложением. Это удобный способ разделения бизнес-логики и логики отображения информации. Представления находятся в каталоге resources/views. Простое представление выглядит примерно так:
xml<!-- Представление resources/views/greeting.blade.php --> <html> <body> <h1>Hello, {{ $name }}</h1> </body> </html>
Поскольку это представление хранится в resources/views/greeting.blade.php, мы можем вернуть его в браузер при помощи глобальной вспомогательной функции PHPview()
примерно так:
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});
Как видите, первый параметр, переданный вспомогательной функции PHPview()
, соответствует имени файла представления в каталоге resources/views. Вторым параметром является массив данных, которые будут доступны для представления. В данном случае мы передаём переменную name, которая отображается в представлении с использованием синтаксиса Blade.
Конечно, представления могут быть и в поддиректориях resources/views. Для доступа к ним можно использовать «точечную» запись. Например, если ваше представление хранится в resources/views/admin/profile.blade.php, можно ссылаться на него вот так:
return view('admin.profile', $data);
Определение существования представления
Если вам нужно определить, существует ли представление, вы можете использовать фасад View. Метод PHPexists()
вернёт значение true, если представление существует:
use Illuminate\Support\Facades\View;
if (View::exists('emails.customer')) {
//
}
Передача данных в представление
В предыдущих примерах вы увидели, что можете передать массив данных в представление:
return view('greetings', ['name' => 'Victoria']);
Вы также можете передать массив данных в качестве второго параметра в функцию PHPview()
:
$view = view('greetings', $data);
Передавая данные таким способом PHP$data
должен быть массивом с парами ключ/значение. Теперь эти данные можно получить в представлении, используя соответствующий ключ, подобно PHP<?php echo $key; ?>
. Альтернативой передаче всего массива данных в функцию PHPview()
является использование метода PHPwith()
для добавления отдельных частей данных в представление:
return view('greeting')->with('name', 'Victoria');
Передача данных во все представления
Иногда вам нужно передать данные во все представления вашего приложения.
добавлено в 5.3 ()
Это можно сделать с помощью метода PHPshare()
фасада представлений. Обычно вызов PHPshare()
располагается в методе PHPboot()
сервис-провайдера. Вы можете вставить его в AppServiceProvider или создать отдельный сервис-провайдер для него:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
class AppServiceProvider extends ServiceProvider
{
/**
* Загрузка всех сервисов приложения.
*
* @return void
*/
public function boot()
{
View::share('key', 'value');
}
/**
* Регистрация сервис-провайдера.
*
* @return void
*/
public function register()
{
//
}
}
Это можно сделать с помощью метода PHPshare()
фабрики представлений. Обычно вызов PHPshare()
располагается в методе PHPboot()
сервис-провайдера. Вы можете вставить его в AppServiceProvider или создать отдельный сервис-провайдер для него:
<?php
namespace App\Providers;
class AppServiceProvider extends ServiceProvider
{
/**
* Загрузка всех сервисов приложения.
*
* @return void
*/
public function boot()
{
view()->share('key', 'value');
}
/**
* Регистрация сервис-провайдера.
*
* @return void
*/
public function register()
{
//
}
}
добавлено в 5.0 ()
У вас есть несколько способов: функция PHPview()
, контракт Illuminate\Contracts\View\Factory или шаблон построителя представлений.
Например, используя функцию PHPview()
:
view()->share('data', [1, 2, 3]);
Вы также можете использовать фасад View:
View::share('data', [1, 2, 3]);
Этот код вы можете поместить в метод PHPboot()
сервис-провайдера — либо общего сервис-провайдера приложения AppServiceProvider, либо своего собственного.
Получение представления по указанному пути файла
Вы можете взять файл представления по его полному пути в файловой системе:
return view()->file($pathToFile, $data);
Построители представлений
Построители (view composers) — функции обратного вызова или методы класса, которые вызываются, когда представление отрисовано. Если у вас есть данные, которые вы хотите привязать к представлению при каждой его отрисовке, то построители помогут вам выделить такую логику в отдельном месте.
Давайте для этого примера зарегистрируем свои построители в сервис-провайдере. В Laravel нет папки, в которой должны находится классы построителей. Вы можете создать её сами там, где вам будет удобно. Например, это может быть App\Http\ViewComposers.
добавлено в 5.3 ()
Мы воспользуемся фасадом PHPview()
для доступа к лежащей в основе реализации контракта Illuminate\Contracts\View\Factory:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
/**
* Регистрация привязок в контейнере.
*
* @return void
*/
public function boot()
{
// Использование построителей на основе класса...
View::composer(
'profile', 'App\Http\ViewComposers\ProfileComposer'
);
// Использование построителей на основе замыканий...
View::composer('dashboard', function ($view) {
//
});
}
/**
* Регистрация сервис-провайдера.
*
* @return void
*/
public function register()
{
//
}
}
Мы воспользуемся функцией PHPview()
для доступа к лежащей в основе реализации контракта Illuminate\Contracts\View\Factory:
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider
{
/**
* Регистрация привязок в контейнере.
*
* @return void
*/
public function boot()
{
// Использование построителей на основе класса...
view()->composer(
'profile', 'App\Http\ViewComposers\ProfileComposer'
);
// Использование построителей на основе замыканий...
view()->composer('dashboard', function ($view) {
//
});
}
/**
* Регистрация сервис-провайдера.
*
* @return void
*/
public function register()
{
//
}
}
добавлено в 5.0 ()
Мы будем использовать фасад View для того, чтобы получить доступ к реализации контракта Illuminate\Contracts\View\Factory:
<?php namespace App\Providers;
use View;
use Illuminate\Support\ServiceProvider;
class ComposerServiceProvider extends ServiceProvider {
/**
* Регистрация привязок в контейнере.
*
* @return void
*/
public function boot()
{
// Если построитель реализуется при помощи класса...
View::composer('profile', 'App\Http\ViewComposers\ProfileComposer');
// Если построитель реализуется в функции-замыкании...
View::composer('dashboard', function($view)
{
});
}
/**
* Регистрация сервис-провайдера
*
* @return void
*/
public function register()
{
//
}
}
Не забывайте, при создании нового сервис-провайдера для регистрации ваших построителей представлений, вам нужно будет добавить его в массив providers в конфигурационном файле config/app.php.
Теперь, когда построитель зарегистрирован, при каждой отрисовке представления profile будет вызываться метод PHPProfileComposer@compose
. Давайте определим класс построителя:
<?php
namespace App\Http\ViewComposers;
//для версии 5.2 и выше:
use Illuminate\View\View;
use App\Repositories\UserRepository;
//для версии 5.1 и ранее:
//use Illuminate\Contracts\View\View;
//use Illuminate\Users\Repository as UserRepository;
class ProfileComposer
{
/**
* Реализация пользовательского репозитория.
*
* @var UserRepository
*/
protected $users;
/**
* Создание построителя нового профиля.
*
* @param UserRepository $users
* @return void
*/
public function __construct(UserRepository $users)
{
// Зависимости автоматически извлекаются сервис-контейнером...
$this->users = $users;
}
/**
* Привязка данных к представлению.
*
* @param View $view
* @return void
*/
public function compose(View $view)
{
$view->with('count', $this->users->count());
}
}
Непосредственно перед отрисовкой представления, метод построителя PHPcompose()
вызывается с экземпляром Illuminate\View\View (для версии 5.1 и ранее Illuminate\Contracts\View\View). Вы можете использовать метод PHPwith()
, чтобы привязать данные к представлению.
Все построители извлекаются из сервис-контейнера, поэтому вы можете указать необходимые зависимости в конструкторе построителя — они будут автоматически поданы ему.
Построители представлений по маске
Вы можете присоединить построитель к нескольким представлениям сразу, передав массив в качестве первого аргумента метода PHPcomposer()
:
добавлено в 5.3 ()
View::composer(
['profile', 'dashboard'],
'App\Http\ViewComposers\MyViewComposer'
);
view()->composer(
['profile', 'dashboard'],
'App\Http\ViewComposers\MyViewComposer'
);
Метод PHPcomposer()
принимает символ * как маску, позволяя присоединить построитель ко всем представлениям:
добавлено в 5.0 ()
Назначение построителя для нескольких представлений
Метод PHPcomposer()
принимает символ * как маску, Например, вот так можно назначить построитель для всех представлений:
View::composer('*', function($view)
{
//
});
Назначение построителя для нескольких представлений
Вы можете также присоединить построитель к нескольким представлениям сразу:
View::composer(['profile', 'dashboard'], 'App\Http\ViewComposers\MyViewComposer');
Регистрация нескольких построителей
Вы можете использовать метод PHPcomposers()
, чтобы зарегистрировать несколько построителей одновременно:
View::composers([
'App\Http\ViewComposers\AdminComposer' => ['admin.index', 'admin.profile'],
'App\Http\ViewComposers\UserComposer' => 'user',
'App\Http\ViewComposers\ProductComposer' => 'product'
]);
Создатели представлений работают точно так же как построители, но выполняются сразу после создания объекта представления, не дожидаясь его отрисовки. Для регистрации создателя используйте метод PHPcreator()
:
View::creator('profile', 'App\Http\ViewCreators\ProfileCreator');
Комментарии (5)
Нужна помощь! Устанавливаю чистый проект, и хочу передать переменую во все представления, но ничего не получается. В методе boot AppServiceProvider.php прописываю die() и ничего не происходит. В чем может быть проблема?
Совсем нет описания «логики», которую можно включать во view. Например, @include
«логика» ,например @include, относится к blade-шаблонизатору,а не к представлениям напрямую
В ролике поясняет.
youtu.be
интересно, какой пример может быть эффективного использования построителя представлений? кажется проще слать ajax запрос к серверу после загрузки страницы