Вы когда-нибудь создавали контроллер, в котором вам приходилось проделывать много работы по подготовке переменных для передачи в представление? Вы можете перенести такую работу в так называемую модель представления. По сути, модели представлений — это простые классы, которые принимают некоторые данные и преобразуют их во что-то, что можно использовать в представлении.
Более подробное объяснение и несколько хороших примеров вы найдете в этом блоге на Stitcher.io.
Собственные композиторы представлений Laravel отличаются от моделей представлений, предоставляемых этим пакетом. Чтобы узнать больше о различиях, прочтите этот пост в блоге на Stitcher.io.
Мы вкладываем много ресурсов в создание лучших в своем классе пакетов с открытым исходным кодом. Вы можете поддержать нас, купив один из наших платных продуктов.
Мы очень признательны вам за отправку нам открытки из вашего родного города с указанием того, какой из наших пакетов вы используете. Наш адрес вы найдете на странице контактов. Все полученные открытки мы публикуем на нашей виртуальной стене открыток.
Вы можете установить пакет через композитор:
composer require spatie/laravel-view-models
Модель представления — это класс, в который вы можете поместить сложную логику для своих представлений. Это сделает ваши контроллеры немного легче. Вы можете создать модель представления, расширив предоставленный SpatieViewModelsViewModel
.
class PostViewModel extends ViewModel
{
public $ user ;
public $ post ;
public $ indexUrl = null ;
public function __construct ( User $ user , Post $ post = null )
{
$ this -> user = $ user ;
$ this -> post = $ post ;
$ this -> indexUrl = action ([PostsController::class, ' index ' ]);
}
public function post (): Post
{
return $ this -> post ?? new Post ();
}
public function categories (): Collection
{
return Category:: canBeUsedBy ( $ this -> user )-> get ();
}
}
Затем вы можете использовать класс модели представления в своем контроллере следующим образом:
class PostsController
{
public function create ()
{
$ viewModel = new PostViewModel (
current_user ()
);
return view ( ' blog.form ' , $ viewModel );
}
public function edit ( Post $ post )
{
$ viewModel = new PostViewModel (
current_user (),
$ post
);
return view ( ' blog.form ' , $ viewModel );
}
}
В представлении вы можете сделать это:
< input type = " text " value = " {{ $post -> title } } " />
< input type = " text " value = " {{ $post -> body } } " />
< select >
@foreach ( $categories as $category )
< option value = " {{ $category -> id } } " > {{ $category -> name } } </ option >
@endforeach
</ select >
< a href = " {{ $indexUrl } } " >Back</ a >
Все общедоступные методы и свойства в модели представления автоматически предоставляются представлению. Если вы не хотите, чтобы определенный метод был доступен в вашем представлении, вы можете его игнорировать.
class PostViewModel extends ViewModel
{
protected $ ignore = [ ' ignoredMethod ' ];
/ / …
public function ignoredMethod () { / * … * / }
}
Все встроенные в PHP магические методы автоматически игнорируются.
Можно напрямую вернуть модель представления из контроллера. По умолчанию возвращается ответ JSON с данными.
class PostsController
{
public function update ( Request $ request , Post $ post )
{
/ / …
return new PostViewModel ( $ post );
}
}
Этот подход может быть полезен при работе с формами, отправляемыми AJAX.
Также возможно вернуть представление напрямую:
class PostsController
{
public function update ( Request $ request , Post $ post )
{
/ / …
return ( new PostViewModel ( $ post ))-> view ( ' post.form ' );
}
}
Обратите внимание: если для заголовка Content-Type
запроса установлено значение JSON, этот подход также вернет данные JSON вместо визуализированного представления.
Модели представлений могут предоставлять функции, требующие дополнительных параметров.
class PostViewModel extends ViewModel
{
public function formatDate ( Carbon $ date ): string
{
return $ date -> format ( ' Y-m-d ' );
}
}
Вы можете использовать эти функции в представлении следующим образом:
{{ $ formatDate ( $post -> created_at ) } }
В пакет включена ремесленная команда для создания новой модели представления.
php artisan make:view-model HomepageViewModel
Эта модель представления будет иметь пространство имен AppViewModels
и будет сохранена в app/ViewModels
.
или в собственное пространство имен, скажем, AppBlog
php artisan make:view-model " Blog/PostsViewModel "
Эта модель представления будет иметь пространство имен AppBlogViewModels
и будет сохранена в app/Blog/ViewModels
.
Пожалуйста, посетите CHANGELOG для получения дополнительной информации о том, что изменилось за последнее время.
Пожалуйста, смотрите ВКЛАД для получения подробной информации.
Если вы обнаружили ошибку, связанную с безопасностью, отправьте электронное письмо по адресу [email protected] вместо использования системы отслеживания проблем.
Лицензия MIT (MIT). Дополнительную информацию см. в файле лицензии.