¿Alguna vez ha creado un controlador en el que tuvo que trabajar mucho para preparar las variables que se pasarían a una vista? Puede mover ese tipo de trabajo a lo que se llama modelo de vista. En esencia, los modelos de vista son clases simples que toman algunos datos y los transforman en algo utilizable para la vista.
Encontrará una explicación más detallada y algunos buenos ejemplos en esta publicación de blog en Stitcher.io.
Los compositores de vistas nativos de Laravel no son los mismos que los modelos de vista proporcionados por este paquete. Para obtener más información sobre las diferencias, diríjase a esta publicación de blog en Stitcher.io.
Invertimos muchos recursos en la creación de los mejores paquetes de código abierto. Puedes apoyarnos comprando uno de nuestros productos pagos.
Agradecemos mucho que nos envíe una postal desde su ciudad natal, mencionando cuál de nuestros paquetes está utilizando. Encontrarás nuestra dirección en nuestra página de contacto. Publicamos todas las postales recibidas en nuestro muro virtual de postales.
Puede instalar el paquete a través del compositor:
composer require spatie/laravel-view-models
Un modelo de vista es una clase en la que puede incluir una lógica compleja para sus vistas. Esto hará que tus controladores sean un poco más livianos. Puede crear un modelo de vista extendiendo el SpatieViewModelsViewModel
proporcionado.
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 ();
}
}
Luego puedes usar la clase de modelo de vista en tu controlador de esta manera:
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 );
}
}
En una vista puedes hacer esto:
< 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 >
Todos los métodos y propiedades públicos en un modelo de vista se exponen automáticamente a la vista. Si no desea que un método específico esté disponible en su vista, puede ignorarlo.
class PostViewModel extends ViewModel
{
protected $ ignore = [ ' ignoredMethod ' ];
/ / …
public function ignoredMethod () { / * … * / }
}
Todos los métodos mágicos integrados de PHP se ignoran automáticamente.
Es posible devolver directamente un modelo de vista desde un controlador. De forma predeterminada, se devuelve una respuesta JSON con los datos.
class PostsController
{
public function update ( Request $ request , Post $ post )
{
/ / …
return new PostViewModel ( $ post );
}
}
Este enfoque puede resultar útil cuando se trabaja con formularios enviados por AJAX.
También es posible devolver una vista directamente:
class PostsController
{
public function update ( Request $ request , Post $ post )
{
/ / …
return ( new PostViewModel ( $ post ))-> view ( ' post.form ' );
}
}
Tenga en cuenta que cuando el encabezado Content-Type
de la solicitud se establece en JSON, este enfoque también devolverá datos JSON en lugar de una vista renderizada.
Los modelos de vista pueden exponer funciones que requieren parámetros adicionales.
class PostViewModel extends ViewModel
{
public function formatDate ( Carbon $ date ): string
{
return $ date -> format ( ' Y-m-d ' );
}
}
Puede utilizar estas funciones en la vista de esta manera:
{{ $ formatDate ( $post -> created_at ) } }
El paquete incluía un comando artesanal para crear un nuevo modelo de vista.
php artisan make:view-model HomepageViewModel
Este modelo de vista tendrá el espacio de nombres AppViewModels
y se guardará en app/ViewModels
.
o en un espacio de nombres personalizado, por ejemplo, AppBlog
php artisan make:view-model " Blog/PostsViewModel "
Este modelo de vista tendrá el espacio de nombres AppBlogViewModels
y se guardará en app/Blog/ViewModels
.
Consulte CHANGELOG para obtener más información sobre los cambios recientes.
Consulte CONTRIBUCIÓN para obtener más detalles.
Si encuentra un error relacionado con la seguridad, envíe un correo electrónico a [email protected] en lugar de utilizar el rastreador de problemas.
La Licencia MIT (MIT). Consulte el archivo de licencia para obtener más información.