Hoy utilizaremos los scopes para mostrar los usuarios activos en nuestra web. Aunque actualmente puede registrarse cualquier persona, más adelante añadiremos un paquete de Laravel que permite gestionar los roles y así limitar, según el rol, quien puede publicar posts. Y también daremos formato a la fecha de publicación de los posts.
Scopes
Los scopes son funciones que añadimos al modelo que nos permiten reutilizar partes de consultas y así no tener que repetirlas muchas veces. Abrimos el modelo User.php y añadimos este código:
1 2 3 |
public function scopeActive($query) { return $query->where('active', 1); } |
Y con esto, ya podremos retornar los usuarios activos fácilmente:
1 2 3 4 5 6 7 8 |
... public function index() { ... $active_users = User::active()->get(); ... return view('posts', ['posts' => $posts, 'active_users' => $active_users]); } ... |
Y los mostramos en la vista:
1 2 3 4 5 6 |
<h3>Active users</h3> @forelse ($active_users as $user) <p>{{ $user->name }}</p> @empty <p>No users</p> @endforelse |
Como puedes ver, aplicar los scopes es muy sencillo y con ellos podremos ahorrar bastante código si es una consulta que utilizaremos en varias ocasiones.
Presenters
Los presenters son funciones que manipulan los datos que hay en la base de datos antes de mostrarlos en las vistas. Le aplicamos la lógica que queramos (darle formato a la fecha, unir dos campos, etc.) y después se muestra en la vista.
Para crear un presenter, me he basado en este post.
Primero, tenemos que crear un directorio Presenters en app. Y después crear un fichero DatePresenter.php. Lo que va a hacer nuestro presenter es darle formato a la fecha de creación:
1 2 3 4 5 6 7 8 9 10 11 |
<?php namespace App\Presenters; trait DatePresenter { public function getCreatedAtAttribute($value) { return \Carbon\Carbon::parse($value)->format('m/d/Y H:i'); } } |
Añade estas líneas en el modelo Post.php :
1 2 3 4 5 6 7 8 9 |
use App\Presenters\DatePresenter; ... class Post extends Model { use DatePresenter; ... |
Y añadimos a la vista esta línea:
1 |
<p>By {{ $post->user->name }} on {{ $post->created_at }}</p> |
Con esto, ya nos saldría la fecha formateada. Podemos aplicarlo a cualquier otro campo y poner la lógica que queramos.
-
– Presenters: https://murze.be/2016/09/simplifying-presenters-laravel/