Давайте посмотрим, что седьмая версия фреймворка привнесла в компоненты шаблонов.
Макетный способ
Сначала взглянем на макетный вариант повторного использования шаблонов. Создаем папку layout
, а в папке view
— файл app-layout.blade.php
, используемый в welcome.blade.php
.
// app-layout.blade.php <!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Laravel Blade с Компонентом</title> <link href="https://fonts.googleapis.com/css?family=Nunito:200,600" rel="stylesheet"> <style> html, body { background-color: #fff; color: #636b6f; font-family: 'Nunito', sans-serif; font-weight: 200; height: 100vh; margin: 0; } .content { text-align: center; } </style> </head> <body> <div class="content"> @yield('content') </div> </body> </html>
Файл welcome.blade.php
:
@extends('layout/app-layout'); @section('content') Это содержимое @endsection
Мы задали макет в app-layout.blade.php
и раскрыли его в шаблоне welcome.blade.php
. Это называется восходящим подходом.
Старый компонентный подход
Теперь давайте теперь рассмотрим старый компонентный подход. Файл welcome.blade.php
будет таким:
@component('layout.app-layout') С компонентным подходом @endcomponent
а в файле app-layout.blade.php
будут такие изменения:
.... <body> <div class="content"> {{ $slot }} </div> </body> ....
В итоге, мы получим тот же самый результат. Это старый способ использования компонентов, и возникает вопрос: а что нового принес Laravel 7?
Новый компонентный подход
Давайте попробуем реализуем всё тоже самое, но с помощью нового компонентного подхода.
php artisan make:component AppLayout
Эта команда создаст два файла вместе со каркасными каталогами. Модель шаблона — App\View\Components\AppLayout.php
и сам шаблон resources\views\components\app-layout.blade.php
.
Файл AppLayout.php
будет выглядеть так:
namespace App\View\Components; use Illuminate\View\Component; class AppLayout extends Component { /** * Create a new component instance. * * @param $title */ public function __construct() { } /** * Get the view / contents that represent the component. * * @return \Illuminate\View\View|string */ public function render() { return view('components.app-layout'); } }
Разберемся, как использовать эти файлы. Скопируем наш файл app-layout.blade.php
в папку components
и изменим welcome.blade.php
<x-app-layout> Мы используем кастомный тег также, как и компонент </x-app-layout>
Мы используем кастомный тег, также как и у компонентов Vue. Контент тега будет отображаться через {{ $slot }}
в файле components\app-layout.blade.php
. Здесь мы можем видеть новый способ задания имени компонента — Laravel пропарсит x-
.
Напоминание: предыдущий способ использования компонента не удаляется!! Используйте тот, который удобен вам.
Передача данных компоненту
Мы можем передавать данные или атрибуты компонентам таким образом
<x-app-layout title="Приветственная страница"> Мы используем кастомный тег также, как и компонент </x-app-layout>
в файле AppLayout.php
:
namespace App\View\Components; use Illuminate\View\Component; class AppLayout extends Component { public $title; /** * Create a new component instance. * * @param $title */ public function __construct($title) { $this->title = $title; } /** * Get the view / contents that represent the component. * * @return \Illuminate\View\View|string */ public function render() { return view('components.app-layout'); } }
Здесь мы получаем заголовок и задаем его как публичное свойство, чтобы можно было его использовать в компоненте app-layout
.
И далее используем его в app-layout.blade.php
.
<head> ... <title>{{ $title }}</title> </head>
Кастомные слоты
Зачем нам нужны кастомные слоты? Предположим, что нужно показывать условную боковую панель. Что-то вроде этого:
<div class="flex p-2"> @if(isset($sidebar)) <aside> {{$sidebar}} </aside> @endif <main class="flex-one m-l-1"> {{ $slot }} </main> </div>
И использовать внутри welcome.blade.php
как
<x-app-layout title="Приветственная страница"> <x-slot name="sidebar"> Это слот c названием </x-slot> Мы используем кастомный тег также, как и компонент </x-app-layout>
Аналогичным образом мы можем создавать компоненты и повторно использовать blade-шаблоны.
Автор: Shrijan Tripahti
Перевод: Алексей Широков
Наш Телеграм-канал — следите за новостями о Laravel.