ЭТОТ ПАКЕТ БЫЛ ЗАБРОШЕН
Компоненты представления — это способ помочь организовать логику, связанную с представлением, аналогично композиторам представлений.
namespace App Http ViewComponents ;
use Illuminate Http Request ;
use Illuminate Contracts Support Htmlable ;
class NavigationComponent implements Htmlable
{
/** IlluminateHttpRequest */
private $ request ;
/** @var string */
private $ backgroundColor ;
public function __construct ( Request $ request , string $ backgroundColor )
{
$ this -> request = $ request ;
$ this -> backgroundColor = $ backgroundColor ;
}
public function toHtml (): string
{
return view ( ' components.navigation ' , [
' activeUrl ' => $ this -> request -> url (),
' backgroundColor ' => $ this -> backgroundColor ,
]);
}
}
@render ( ' navigationComponent ' , [ ' backgroundColor ' => ' black ' ] )
Компонентом представления может быть что угодно, что реализует контракт Laravel Htmlable
, поэтому вам не обязательно использовать представления Blade для рендеринга компонента. Это полезно для упаковки сторонних HTML-пакетов, таких как spatie/laravel-menu.
namespace App Http ViewComponents ;
use Illuminate Contracts Support Htmlable ;
use Illuminate Contracts Auth Guard ;
use Spatie Menu Laravel Menu ;
class MainMenuComponent implements Htmlable
{
/** @var IlluminateContractsAuthGuard */
private $ guard ;
/** @var string */
private $ class ;
public function __construct ( Guard $ guard , string $ class = null )
{
$ this -> guard = $ guard ;
$ this -> class = $ class ;
}
public function toHtml (): string
{
$ menu = Menu:: new ()
-> addClass ( $ this -> class )
-> url ( ' / ' , ' Home ' )
-> url ( ' /projects ' , ' Projects ' );
if ( $ this -> guard -> check ()) {
$ menu -> url ( ' /admin ' , ' Adminland ' );
}
return $ menu ;
}
}
@render ( ' mainMenuComponent ' , [ ' class ' => ' background-green ' ] )
Преимущество по сравнению с композиторами представлений заключается в том, что данные и логика рендеринга явно связаны друг с другом в компонентах, а не соединяются впоследствии. Они также позволяют легко комбинировать свойства и внедрение зависимостей.
Этот пакет основан на книге «Введение в компоненты представления в Laravel», альтернативе View Composers Джеффа Очоа.
Мы вкладываем много ресурсов в создание лучших в своем классе пакетов с открытым исходным кодом. Вы можете поддержать нас, купив один из наших платных продуктов.
Мы очень признательны вам за отправку нам открытки из вашего родного города с указанием того, какой из наших пакетов вы используете. Наш адрес вы найдете на странице контактов. Все полученные открытки мы публикуем на нашей виртуальной стене открыток.
Вы можете установить пакет через композитор:
composer require spatie/laravel-view-components
Никакой дополнительной настройки не требуется. Laravel автоматически обнаружит и зарегистрирует поставщика услуг.
При желании вы можете опубликовать файл конфигурации с помощью:
php artisan vendor:publish --provider= " SpatieViewComponentsViewComponentsServiceProvider " --tag= " config "
Это содержимое файла по умолчанию, которое будет опубликовано в config/view-components
:
return [
/*
* The root namespace where components reside. Components can be referenced
* with camelCase & dot notation.
*
* Example: 'root_namespace' => AppHttpViewComponents::class
*
* `@render('myComponent')
* => `AppHttpViewComponentsMyComponent`
*/
' root_namespace ' => ' AppHttpViewComponents ' ,
/*
* Register alternative namespaces here, similar to custom view paths.
*
* Example: 'navigation' => AppServicesNavigation::class,
*
* `@render('navigation::mainMenu')`
* => `AppServicesNavigationMainMenu`
*/
' namespaces ' => [
// 'navigation' => AppServicesNavigation::class,
],
];
@render
Директива @render
Blade принимает два аргумента: первый — это путь или имя класса компонента представления, второй — дополнительный набор свойств (необязательный).
Вы можете выбрать между ссылкой на компонент через путь или имя класса.
@render ( ' myComponent ' )
@render ( App Http ViewComponents MyComponent :: class )
Параметры будут введены в метод __construct
компонентов представления. Компонент создается с помощью контейнера Laravel, поэтому параметры, не предоставленные при рендеринге, будут автоматически внедрены.
use Illuminate Http Request ;
class MyComponent implements Htmlable
{
public function __construct ( Request $ request , string $ color )
{
$ this -> request = $ request ;
$ this -> color = $ color ;
}
// ...
}
@render ( ' myComponent ' , [ ' color ' => ' red ' ] )
В приведенном выше примере явно задан $color
, а объект $request
будет внедрен Laravel.
Настраивая root_namespace
, вы можете определить, где находится основная часть компонентов вашего представления. По умолчанию это AppHttpViewComponents
.
app/
Http/
ViewComponents/
MyComponent.php
Nested/
NestedComponent.php
Вышеупомянутые компоненты можно визуализировать с помощью @render('myComponent')
и @render('nested.nestedComponent')
.
Вы можете зарегистрировать дополнительные пространства имен в конфигурации namespaces
, аналогично путям просмотра.
return [
' namespaces ' => [
' navigation ' => App Services Navigation::class,
],
];
app/
Services/
Navigation/
Menu.php
Вышеупомянутый компонент Menu
теперь можно визуализировать с помощью @render('navigation::menu')
.
composer test
Пожалуйста, посетите CHANGELOG для получения дополнительной информации о том, что изменилось за последнее время.
Пожалуйста, смотрите ВКЛАД для получения подробной информации.
Если вы обнаружите какие-либо проблемы, связанные с безопасностью, отправьте электронное письмо по адресу [email protected] вместо использования системы отслеживания проблем.
Лицензия MIT (MIT). Пожалуйста, смотрите файл лицензии для получения дополнительной информации.