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

Содержание:


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

Представления содержат HTML и отделяет логику контроллера от логики презентации. Представления располагаются в папке resources/views. Самое просто представление может выглядеть таким образом:

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

Представления располагаются в директории resources/views/greeting.blade.php. Вернуть представление можно используя глобальную функцию-помощник view таким образом:

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

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

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

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

Проверить существует ли представление

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

use Illuminate\Support\Facades\View;

if (View::exists('emails.customer')) {
    //
}

Создание первого доступного представления

Используя метод first, вы можете создать первое представление, которое существует в массиве представлений. Этот можете быть полезно для того, чтобы ваше приложение или компонент настраивало или перезаписывало представление:

return view()->first(['custom.admin', 'admin'], $data);

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

use Illuminate\Support\Facades\View;

return View::first(['custom.admin', 'admin'], $data);

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

Как видно из предыдущего примера, вы можете передавть массив данных в представление:

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

При передаче информации таким образом, данные должны быть массивом с парама ключ / значение. Внутри представления, вы можете обращаться к значениям используя соответсвующие ключи, такие как <?php echo $key; ?>. Как альтернатива, для передачи массива данных в представление, можно использовать метод with, чтобы сформировать индивидуальные пары данных в представление:

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

Распространение данных для всех представлений

Может так случиться, что вам необходимо сделать часть данных общедоступными для всех представлений в вашем приложении. Это можно сделать используя метод share для фасада view. В стандартной ситуации вы должны расположить share внутри метода boot сервис провайдера. Вы легко можете выбрать AppServiceProvider или сгенерировать другой сервис провайдер, чтобы разместить обращения к методу share там:

namespace App\Providers;

use Illuminate\Support\Facades\View;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        View::share('key', 'value');
    }
}

Композиторы представлений

Композиторы представлений — это обратная связь или методы классов, которые вызываются при отображении представлений. Есил у вас есть данные, которые вы бы хотели передавать в представление каждый раз при генерации, композиторы представлений помогут организовать такую логику в отдельной локации.

Для примера, зарегистрируем композитор представления через сервис провайдер. Мы используем фасад View для получения доступа к реализации контракта Illuminate\Contracts\View\Factory. По умолчанию, Ларавел не содержит папки для композиторов представлений. Но вы легко можете сделать такую. Например, можно создать директорию app/Http/View/Composers:

namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class ViewServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        // Using class based composers...
        View::composer(
            'profile', 'App\Http\View\Composers\ProfileComposer'
        );

        // Using Closure based composers...
        View::composer('dashboard', function ($view) {
            //
        });
    }
}
Если для регистрации композитора представлений вы создали новый сервис провайдер, то вам необходимо добавить этот сервис провайдер в массив провайдеров в файле конфигурации config/app.php.

Теперь когда композитор зарегистрирован, метод ProfileComposer@compose будет выполняться каждый раз при отображении представления profile. Давайте определим класс композера:

namespace App\Http\View\Composers;

use Illuminate\View\View;
use App\Repositories\UserRepository;

class ProfileComposer
{
    /**
     * The user repository implementation.
     *
     * @var UserRepository
     */
    protected $users;

    /**
     * Create a new profile composer.
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        // Dependencies automatically resolved by service container...
        $this->users = $users;
    }

    /**
     * Bind data to the view.
     *
     * @param  View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $view->with('count', $this->users->count());
    }
}

До момента генерации представления, метод compose вызывается вместе с экзепляром Illuminate\View\View. Вы можете использовать метод with, чтобы привязать данные к представлению.

Все композиторы представлений работают через сервис контейнеры. Поэтому вы можете вписывать любые зависимости, которые вам нужны, через конструктор копозитора.

Прикрепление композитора к нескольким представлениям.

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

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

Метод composer также принимает символ *, который позволяет прикрепить композитор ко всем представлениям:

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

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

Создатели представлений очень похожи на композиторы представлений, но они выполняют сразу после обращения к представлению, а не ждут момента, когда представление готово к отображению. Чтобы зарегистрировать создателя представлений, используйте метод creator:

View::creator('profile', 'App\Http\View\Creators\ProfileCreator');