Может войдёшь?
Черновики Написать статью Профиль

Представления

перевод документация 5.х

  1. 1. Создание представлений
  2. 2. Передача данных в представление
  3. 3. Построители представлений
Этот перевод актуален для англоязычной документации на (ветка 5.3) , (ветка 5.2) , (ветка 5.1) и (ветка 5.0). Опечатка? Выдели и нажми Ctrl+Enter.

Создание представлений

Представления (views), они же макеты, содержат HTML-код, передаваемый вашим приложением. Это удобный способ разделения бизнес-логики и логики отображения информации. Представления находятся в каталоге resources/views. Простое представление выглядит примерно так:

xml<!-- Представление resources/views/greeting.blade.php -->

<html>
  <body>
    <h1>Hello, {{ $name }}</h1>
  </body>
</html>

Поскольку это представление хранится в resources/views/greeting.blade.php, мы можем вернуть его в браузер при помощи глобальной вспомогательной функции PHPview() примерно так:

PHP
Route::get('/', function () {
  return 
view('greeting', ['name' => 'James']);
});

In this case, we are passing the `name` variable, which is displayed in the view by executing `echo` on the variable.

In this case, we are passing the `name` variable, which is displayed in the view using [Blade syntax](/docs//blade).

Как видите, первый параметр, переданный вспомогательной функции PHPview(), соответствует имени файла представления в каталоге resources/views. Вторым параметром является массив данных, которые будут доступны для представления. В данном случае мы передаём переменную name, которая отображается в представлении с использованием синтаксиса Blade.

Конечно, представления могут быть и в поддиректориях resources/views. Для доступа к ним можно использовать «точечную» запись. Например, если ваше представление хранится в resources/views/admin/profile.blade.php, можно ссылаться на него вот так:

PHP
return view('admin.profile'$data);

Определение существования представления

Если вам нужно определить, существует ли представление, вы можете использовать фасад View. Метод PHPexists() вернёт значение true, если представление существует:

PHP
use Illuminate\Support\Facades\View;

if (
View::exists('emails.customer')) {
  
//
}
+ 5.2 5.1 5.0

добавлено в 5.2 () 5.1 () 5.0 ()

Когда функция PHPview() вызывается без аргументов, она возвращает реализацию контракта Illuminate\Contracts\View\Factory, предоставляя вам доступ ко всем его методам.

Передача данных в представление

В предыдущих примерах вы увидели, что можете передать массив данных в представление:

PHP
return view('greetings', ['name' => 'Victoria']);

Вы также можете передать массив данных в качестве второго параметра в функцию PHPview():

PHP
$view view('greetings'$data);

Передавая данные таким способом PHP$data должен быть массивом с парами ключ/значение. Теперь эти данные можно получить в представлении, используя соответствующий ключ, подобно PHP<?php echo $key?>. Альтернативой передаче всего массива данных в функцию PHPview() является использование метода PHPwith() для добавления отдельных частей данных в представление:

PHP
return view('greeting')->with('name''Victoria');

Передача данных во все представления

Иногда вам нужно передать данные во все представления вашего приложения.

+ 5.3

добавлено в 5.3 ()

Это можно сделать с помощью метода PHPshare() фасада представлений. Обычно вызов PHPshare() располагается в методе PHPboot() сервис-провайдера. Вы можете вставить его в AppServiceProvider или создать отдельный сервис-провайдер для него:

PHP
<?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()
  {
    
//
  
}
}
+ 5.2 5.1

добавлено в 5.2 () 5.1 ()

Это можно сделать с помощью метода PHPshare() фабрики представлений. Обычно вызов PHPshare() располагается в методе PHPboot() сервис-провайдера. Вы можете вставить его в AppServiceProvider или создать отдельный сервис-провайдер для него:

PHP
<?php

namespace App\Providers;

class 
AppServiceProvider extends ServiceProvider
{
  
/**
   * Загрузка всех сервисов приложения.
   *
   * @return void
   */
  
public function boot()
  {
    
view()->share('key''value');
  }

  
/**
   * Регистрация сервис-провайдера.
   *
   * @return void
   */
  
public function register()
  {
    
//
  
}
}
+ 5.0

добавлено в 5.0 ()

У вас есть несколько способов: функция PHPview(), контракт Illuminate\Contracts\View\Factory или шаблон построителя представлений.

Например, используя функцию PHPview():

PHP
view()->share('data', [123]);

Вы также можете использовать фасад View:

PHP
View::share('data', [123]);

Этот код вы можете поместить в метод PHPboot() сервис-провайдера — либо общего сервис-провайдера приложения AppServiceProvider, либо своего собственного.

Получение представления по указанному пути файла

Вы можете взять файл представления по его полному пути в файловой системе:

PHP
return view()->file($pathToFile$data);

Построители представлений

Построители (view composers) — функции обратного вызова или методы класса, которые вызываются, когда представление отрисовано. Если у вас есть данные, которые вы хотите привязать к представлению при каждой его отрисовке, то построители помогут вам выделить такую логику в отдельном месте.

Давайте для этого примера зарегистрируем свои построители в сервис-провайдере. В Laravel нет папки, в которой должны находится классы построителей. Вы можете создать её сами там, где вам будет удобно. Например, это может быть App\Http\ViewComposers.

+ 5.3

добавлено в 5.3 ()

Мы воспользуемся фасадом PHPview() для доступа к лежащей в основе реализации контракта Illuminate\Contracts\View\Factory:

PHP
<?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()
  {
    
//
  
}
}
+ 5.2 5.1

добавлено в 5.2 () 5.1 ()

Мы воспользуемся функцией PHPview() для доступа к лежащей в основе реализации контракта Illuminate\Contracts\View\Factory:

PHP
<?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

добавлено в 5.0 ()

Мы будем использовать фасад View для того, чтобы получить доступ к реализации контракта Illuminate\Contracts\View\Factory:

PHP
<?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
<?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

добавлено в 5.3 ()

PHP
View::composer(
  [
'profile''dashboard'],
  
'App\Http\ViewComposers\MyViewComposer'
);
+ 5.2 5.1

добавлено в 5.2 () 5.1 ()

PHP
view()->composer(
  [
'profile''dashboard'],
  
'App\Http\ViewComposers\MyViewComposer'
);

Метод PHPcomposer() принимает символ * как маску, позволяя присоединить построитель ко всем представлениям:

+ 5.3

добавлено в 5.3 ()

PHP
View::composer('*', function ($view) {
  
//
});
+ 5.2 5.1

добавлено в 5.2 () 5.1 ()

PHP
view()->composer('*', function ($view) {
  
//
});
+ 5.0

добавлено в 5.0 ()

Назначение построителя для нескольких представлений

Метод PHPcomposer() принимает символ * как маску, Например, вот так можно назначить построитель для всех представлений:

PHP
View::composer('*', function($view)
{
  
//
});

Назначение построителя для нескольких представлений

Вы можете также присоединить построитель к нескольким представлениям сразу:

PHP
View::composer(['profile''dashboard'], 'App\Http\ViewComposers\MyViewComposer');

Регистрация нескольких построителей

Вы можете использовать метод PHPcomposers(), чтобы зарегистрировать несколько построителей одновременно:

PHP
View::composers([
  
'App\Http\ViewComposers\AdminComposer' => ['admin.index''admin.profile'],
  
'App\Http\ViewComposers\UserComposer' => 'user',
  
'App\Http\ViewComposers\ProductComposer' => 'product'
]);

Создатели представлений

Создатели представлений работают точно так же как построители, но выполняются сразу после создания объекта представления, не дожидаясь его отрисовки. Для регистрации создателя используйте метод PHPcreator():

+ 5.3 5.0

добавлено в 5.3 () 5.0 ()

PHP
View::creator('profile''App\Http\ViewCreators\ProfileCreator');
+ 5.2 5.1

добавлено в 5.2 () 5.1 ()

PHP
view()->creator('profile''App\Http\ViewCreators\ProfileCreator');

Комментарии (4)

Alex779

Нужна помощь! Устанавливаю чистый проект, и хочу передать переменую во все представления, но ничего не получается. В методе boot AppServiceProvider.php прописываю die() и ничего не происходит. В чем может быть проблема?

tmanager

Совсем нет описания «логики», которую можно включать во view. Например, @include

kurtkaa

«логика» ,например @include, относится к blade-шаблонизатору,а не к представлениям напрямую

Artem87

В ролике поясняет.
youtu.be

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.