Configuración de Rutas y Controladores en Laravel para Listado de Posts
Resumen
¿Cómo configurar la parte visual de tu sitio web?
Configurar la parte visual de un sitio web es fundamental para garantizar que los usuarios tengan una experiencia atractiva y funcional. Vamos a trabajar en la visualización de una lista de publicaciones y de una publicación en particular. El primer paso es modificar las rutas dentro de nuestra configuración web para reflejar correctamente la estructura deseada.
¿Cómo modificar y personalizar las rutas?
Modificar y personalizar las rutas es esencial para dirigir a los usuarios a las vistas correctas dentro de un sitio web. Vamos a proceder a hacer un par de ajustes:
Personaliza la ruta de inicio:
Cambia la ruta raíz para que apunte a postsController@index, y asegúrate de utilizar nombres en plural para las listas.
Configura rutas para publicaciones individuales:
Usa un parámetro dinámico en la ruta, como Blog/{post}, y dirígelo al método post en singular.
Las vistas permiten a los usuarios visualizar los datos. Hay que configurar dos vistas, una para una lista completa de publicaciones y otra para una sola publicación.
Crear archivos de vista:
Crea resources/views/posts/index.blade.php para la lista.
Crea resources/views/posts/show.blade.php para una sola publicación.
Configurar contenido de la vista:
Enumera los posts iterando y creando tarjetas dinámicamente para cada uno.
Para manejar datos de forma eficiente, como quién escribió un post, configura relaciones entre los modelos:
Una relación de un usuario a muchos post:
En el modelo Usuario: public function posts() { return $this->hasMany(Post::class); }
Un post pertenece a un usuario:
En el modelo Post: public function user() { return $this->belongsTo(User::class); }
De esta forma, creamos una estructura funcional que soporta una visualización dinámica y personalizada de los contenidos, facilitando la interacción del usuario con el sitio.
Para hacer acceder a datos de la db con eloquent usamos 'with' en lugar de 'load' despues del nombre del model.
'posts'=>Post::with('user')
Cuando hacemos una peticion get y enviamos un dato via url podemos hacer la busqueda en la db escribiendo el model antes del dato de la url.
publicfunctionpost(Post $post){
Hacer logica con las correlaciones
#un post pertenece a un usuarios
return $this->belongsTo(User::class);
#un user tiene muchos post
return $this->hasMany(Post::class);
– muesta un guion largo en html
eres un crack, por vos encontre un error con singulares y plurales que me estaba enloqueciendo, gracias :3
Creación de tablas, entidades y datos de prueba
->nullable() → Significa que permite que existan campos nulos en este atributo.
😱 Recuerda que para poder crear relaciones entre tablas, tienes que dejar una sentencia en la tabla padre que borre primero a la tabla hijo para que no salte error
// Sentencia en down()# Primero la tabla hijo se borraSchema::dropIfExists('posts');# Segundo la tabla padre se borraSchema::dropIfExists('users');
Para las rutas, recuerda que con Laravel 8x tienes que escribir los controladores de la siguiente forma:
use App\Http\Controllers\PageController;Route::get('/',[PageController::class,'posts']);Route::get('blog/{post}',[PageController::class,'post'])->name('post');
😁😁😁
Tienes razon, gracias por la aclaración
Cuando tuve el error vi la solución en algun sitio y lo aplique jeje
y de hecho me funciono, pero siempre es mejor recurrir a la documentación oficial
RESUMEN
A)Ruta
B)Controller
C)RELACION USER/POST || POST/USER
D)VISTAS POSTS Y POST
A)Routes/web.phpRoute::get('/',"PageController@posts");Route::get('blog/{post}',"PageController@post")->name("post");B)"Creamos los methods de las rutas
php artisan make:controller PageControllerapp/Http/Controllers/PageController.phpuse App\Post;use Illuminate\Http\Request;classPageControllerextendsController{publicfunctionposts(){returnview("posts",["posts"=>Post::with("user")->latests()->paginate();// en esta var||cargame los posts DE los users||los ultimos||enpaginado])}publicfunctionpost(Post $post){returnview("post",["post"=>$post;])}}C)"LAS RELACIONES ESTAN ECHAS EN LA BASE DE DATOS PERO NO EL LARAVEL ASI QUE LAS PONDREMOS EN LOS MODELS"User.phppublicfunctionposts(){return $this->hasMany(Post::class);}Post.phppublicfunctionuser(){return $this->belongsto(User::class);}D)"Creacion de las vistas invocadas en PageController1 resources/views/posts.blade.php2 resources/views/post.blade.php1//posts.blade.php//CICLO FOR DE POSTS @foreach($posts as $post)<div class="card"><div class="card-body"><h5 class="card-title">{{$post->title}}</h5>//POST TEXT Y BUTTON<p class="card-text">{{$post->get_excerpt}}//extracto de post// Nombre ruta, esta instancia de posts <a href="{{ route('post',$post) }}">Leer mas</a></p>//USER NAME Y DATE<p class="text-muted mb-0"><em >–{{$post->user->name}}</em>{{$post->created_at->format("d M Y")}}</p></div></div>
@endforeach
2resources/views/post.blade.php<div class="card mb-4"><div class="card-body"><h5 class="card-title">{{$post->title}}</h5><p class="card-text">{{$post->body}}</p><p class="text-muted mb-0"><em >–{{$post->user->name}}</em>{{$post->created_at->format("d M Y")}}</p></div></div>
Para mostrar la fecha de creación del post con un formato especifico
<p>{{ $post->created_at->format('d M Y') }}</p>
Si estas haciendo tu proactica con laravel 8 las rutas van a cambiar, he trabajado con laravel 5.4 y mas pero tome este curso para aprender lo aprendido,
Agrego como tienen que ser las rutas en Laravel 8
Muchas gracias por tu aporte me dio un par de dolores de cabeza. podras explicarme si no te quito mucho tiempo el por que de ->name('post');
Hasta el minuto 10:17 me sale todo igual, pero al cambiar el load por el with me sigue dando error, aunque uno diferente, y no me muestra la vista de posts.blade.php.
Con el with me dice que no encuentra User::class
He vuelto a poner el video por si me había dejado algo y no veo diferencia. Estoy con Laravel 6.*, alguien sabe que puede estar pasando?
¿Ya revisaste si hiciste la relación hasmany() correctamente? vuelve a ver el video y fíjate muy bien si no estás cometiendo algún error al escribir. Al utilizar nombres muy parecidos todo el tiempo puede ser un poco confuso. Revisa si no has confundido algún plural con singular y viceversa.
Cualquier duda/avance házmelo saber. De igual forma si lograste solucionarlo es bueno si lo compartes, así ayudarás a los demás.
Me pueden explicar la parte del get_excerpt, dice que la creo a partir del body, pero no entendí como
Se explica en el siguiente vídeo.
Para darle formato a las fechas:
{{ $post->created_at->format('d-M-Y')}}
Existen otras formas, por ejemplo:
Solo el año,
{{ $post->created_at->year }}
Solo el mes
{{ $post->created_at->month }}
De igual manera con los días, etc.
Este da el mismo resultado del curso.
{{ $post->created_at->toDateString()}}
Este método devuelve la diferencia de tiempo entre el timestamp y la fecha actual.
{{ $post->created_at->diffForHumans()}}
Con este muestra el formato mes, día, año, pero como lo notan aparece en inglés el mes igual que el anterior.
{{ $post->created_at->toFormattedDateString()}}
Para que aparezcan en español les dejo este link que explica las formas ya escritas en este comentario más la traducción de las fechas.
Me surgio una duda.
Cuando le ponemos un name a la ruta nos ayudamos del helper route() pero cuando lo pones en el botón
{{route('post', $post)}}
La variable $post en automático sabe que debe poner el ID o como funciona ahí ??
Hola
Es una caracteristica de Laravel en si el feature Route Model Binding aplica en dos casos, uno cuando agregas parametros a las rutas y dos cuando usas el metodo helper route()
route() recibe como primer parametro un string que representa el endpoint de la ruta, en este caso la ruta post, pero tambien soporta el nombre de la ruta colocado con el metodo name en la ruta, yo recomiendo mas el uso del nombre de la ruta, pero ambas son validas lo imporante es manejar un estandard
Tambien recibe un segundo parametro que puede ser un modelo como en este caso post, tambien puede ser un integer o string como podria ser $post->id y como tercera opcion tambien puede recibir un array, esto es util en los casos en que nos topemos con rutas con mas de un parametro: ejemplo si quiero cargar un review especifico de un producto por ejemplo, la ruta podria ser algo como:
Nota que en este caso el primer parametro no es el string con el endpoint al que debe ir, es mas bien el name que se le asigno a la ruta, esto es asi porque como ese valor de la ruta se arma dinamicamente no podrias dejar un string quemado o hardcodeado si no una representacion del mismo por eso se usa el nombre de la ruta.
Este es un ejemplo complejo pero te da una idea de las varias opciones que tienes ya puedes usara varios tipos de parametros para hacer lo mismo lo cual te da mucha flexibilidad y es muy util en ciertos casos.
Por ultimo como sabe Laravel que si pongo el modelo completo, (el objeto), como sabe a que hago referencia al id, pues bien eloquent internamente ya sabe que todo modelo (representacion de una tabla) puede tener una primaryKey esta es mas bien una propiedad de la clase model de la cual hereda tu modelo de eloquent en este caso Product.
Por tanto el ya coloca por defecto el id y cuando le envias el modelo el sabe que debe buscar por este, sin embargo esta llave primary se puede modificar y/o personalizar en cada modelo, sobreescribiendo la propiedad asi cambiaria el valor a pasar y de todas formas tu ruta en routes/web.php y tu helper routes seguiran funcionando aun cuando ese valor que envias cambie,
OJO si pasas el modelo es mejor, porque si el dia de manana cambias la llave no debes de regresar a todas tus vistas que tengan este link a esta ruta y cambiarla a mano o hardcodearla nuevamente, LO MISMO CON LOS NOMBRES DE LAS RUTAS, es util usarlo en el helper route() asi si manana cambias el endpoint en routes/web.php no importa Laravel se encargara de sobreescribirlo dinamicamente y te evitas regresas a todas las vistas a cambiar valores.
Espero que la explicacion quedara lo mas clara posible y si en algo no estoy en lo correcto o me equivoque pues claro siempre me mencionan, saludos!
Fernado, que GRANDE tu aporte. Y no lo digo por el tamaño del texto, sino porque es muy útil, estaba pensando en lo mismo.
Con el ejemplo de las rutas que dejaste me dieron más ganas de seguir aprendiendo Laravel. Eres un Crack!
A pesar de que a nivel de base de datos se configuró el campo slug este no se encuentra funcionando ya que faltó implementar el método para que el enrutamiento tome el valor por defecto del slug y no del ID (Ver URL en el tiempo 10:28 del vídeo), en la documentación oficial de slug, me encontré con un enlace que referencia el siguiente método:
/**
* Get the route key for the model.
*
* @return string
*/publicfunctiongetRouteKeyName(){return'slug';}
IMPORTANTE
Desde la version 8 de laravel, es necesario llamar el controlador con la ruta completa y pasandole el metodo aparte dentro de un array ejemplo:
O puedes hacerlo usando la constante ::class, ejemplo:
use App\Http\Controllers\PageController;Route::get('posts',[PageController::class,'posts']);
Con que rapidez se pueden crear productos geniales!
estoy trabajando con laravel 8 y me aparece esto:
Class 'App\Post' not found,
no encuentro la solución :(
la ruta de mi archivo era App\Models\Post ya que estoy trabajando con laravel 8 y el post.php al igual que el user.php están dentro de la carpeta models que esta dentro de la carpeta app :D
holaaa tambien estoy trabajando con laravel 8 pero no pude crear los post del video anterior me podria decir como lo realizo? ya que me sale este error al ejecutar :
\App\Models\Post::factory(24)->create();
Alguien sabe por qué no usa directamente un controlador tipo "resource"?
Yo creo que lo hace para enseñarnos uno por uno los metodos en las direcciones
pa esas 2 ruticas pa que
Laravel permite crear sitios en forma rápida y con las mejores practicas de programación.
Me encanta porque la parte de post se hizo automáticamente, el poder de pasarle la clas Post por el parámetro es genial!
Creamos las rutas de lista de post y un solo post.
Creamos el controlador y los metodos, dentro de cada uno retornamos la vista con la peticion de datos y lo enviamos.
Creamos las relaciones de los datos que vamos a usar en el model de User y Post.
Creamos las vistas de post y posts basandonos en el formato de home. Posts mostrara el listado de datos mediante un foreach y posts mostrara datos del current post.