Para los que desean que se muestre el slug en la URL, a partir de Laravel 7, podemos configurarlo directamente desde el Route de la siguiente forma:
Route::get('/blog/{post:slug}', 'PageController@post')->name('post');
Entender Laravel
¡Actualizamos este curso!
¿Qué es Laravel?
Herramientas necesarias para trabajar con PHP y Laravel
Entendiendo el ciclo de vida de las solicitudes web
Qué es un CRUD y cómo implementarlo
Lógica de controladores y vistas con datos de prueba
Creando un formulario
Comprender los Fundamentos de Laravel
Sistema de rutas y controladores
Uso de Middlewares
Validación de datos (rutas, vistas, formularios y controladores)
Blade: sistema de plantillas avanzado
Trabajando con el componente Laravel/UI
Aprender sobre Eloquent ORM
Eloquent: trabajando con este ORM
Relaciones de tablas
Colecciones y serialización de datos
Formato de valores en tablas y presentación de datos
Crear PlatziPress
Proyecto Blog: presentación y configuración inicial
Creación de tablas, entidades y datos de prueba
Plantillas de trabajo y entendiendo el login
Diseño visual con Bootstrap
Vista index y botones de acción
Implementación del formulario de creación
Implementación del guardado
Creando la función de editar un post
Actualizando nuestros posts
Integrando contenido audiovisual
Construir Proyecto Final: API con TDD (Intermedio)
Introducción al testing
Metodología TDD y testing HTTP
Proyecto API con TDD: presentación y configuración inicial
Store con TDD
Refactorización y validación en Store
Show con TDD
Update y validación con TDD
Delete con TDD
Index con TDD
Protección de una API con Login
Cierre del curso
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Aportes 34
Preguntas 15
Para los que desean que se muestre el slug en la URL, a partir de Laravel 7, podemos configurarlo directamente desde el Route de la siguiente forma:
Route::get('/blog/{post:slug}', 'PageController@post')->name('post');
Tips de clase:
'posts' => Post::with('user')
public function post(Post $post) {
#un post pertenece a un usuarios
return $this->belongsTo(User::class);
#un user tiene muchos post
return $this->hasMany(Post::class);
😱 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 borra
Schema::dropIfExists('posts');
# Segundo la tabla padre se borra
Schema::dropIfExists('users');
Para las rutas, recuerda que con Laravel 8x tienes que escribir los controladores de la siguiente forma:
Route::get('/', [PageController::class, 'posts']);
Route::get('blog/{post}', [PageController::class, 'post'])->name('post');
Si estas usando la version 8 de laravel seria
Route::get('/', 'App\Http\Controllers\PageController@subtipos');
en vez de
//Route::get('/', 'PageController@posts');
RESUMEN
A)Ruta
B)Controller
C)RELACION USER/POST || POST/USER
D)VISTAS POSTS Y POST
A)Routes/web.php
Route::get('/', "PageController@posts");
Route::get('blog/{post}', "PageController@post")->name("post");
B)"Creamos los methods de las rutas
php artisan make:controller PageController
app/Http/Controllers/PageController.php
use App\Post;
use Illuminate\Http\Request;
class PageController extends Controller
{
public function posts(){
return view("posts",[
"posts" => Post::with("user")->latests()->paginate();
// en esta var||cargame los posts DE los users||los ultimos||enpaginado
])
}
public function post(Post $post){
return view("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.php
public function posts(){
return $this->hasMany(Post::class);
}
Post.php
public function user(){
return $this->belongsto(User::class);
}
D)"Creacion de las vistas invocadas en PageController
1 resources/views/posts.blade.php
2 resources/views/post.blade.php
1
//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
2
resources/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
Route::get('/', [PageController::class, 'posts']);
Route::get('blog/{post}', [PageController::class, 'post'])->name('post');```
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.
En mi caso, Laravel 8.
El archivo de rutas web.php quedo de la siguiente manera.
use Illuminate\Support\Facades\Route;
Route::get('/',[PageController::class, 'posts']);
Route::get('blog/{post}', 'PageController@post')->name('post');
Route::get('blog/{post}',[PageController::class, 'post'])->name('post');
Auth::routes();
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');```
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í ??
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
*/
public function getRouteKeyName()
{
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:
Route::get('posts', ['App\Http\Controllers\PageController', 'posts']);
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!
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!
You can also use:
$post->created_at->diffForHumans()
–
ese tipo de datos q te salvan joderte con CSS jejeje amen
no olviden en laravel 8 o 9 agregar en web.php use App\Http\Controllers\PageController;
no se si se explica mas adelante o me perdí algo… pero no entiendo porqué e usa un PageController en lugar del PostController como controlador de recurso.
los que solo se enfocan en el back: posts.blade.php
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
@foreach($posts as $post)
<div class="card">
<div class="card-body">
<h5 class="card-title">{{$post->title}}</h5>
<p class="card-text">
{{$post->get_excerpt}}
<a href="{{route('post', $post)}}">Leer mas...</a>
</p>
<p class="text-muted mb-0">
<em>
– {{$post->user->name}}
</em>
{{$post->created_at->format('d M Y')}}
</p>
</div>
</div>
@endforeach
</div>
</div>
</div>
@endsection
Si necesita una herramienta que te permite visualizar que modelos, controladores, vistas consultas al momento de renderizar tu aplicacion, este paquete para laravel te puede servir.
Laravel-debugbar.
Para instalarlo solo debes de ingresar en la consola el siguiente comando:
composer require barryvdh/laravel-debugbar --dev
Espero les sirva 😃
Dioss que emocionado estoy con este curso, va super bien, Laravel es muy elegante jajaja.
Otro modo de enviar los datos desde el controlador hacia las vistas es usando el método compact().
class PageController extends Controller
{
public function posts()
{
$posts = Post::with('user')->latest()->paginate();
return view('posts', compact('posts')
}
public function post(Post $post)
{
return view('post', compact('post'));
}
}
Como se ve en el código, para visualizar los posts, se guarda la consulta en la variable *$posts, el cual es enviado en el método de la siguiente forma compact(‘posts’).
Para visualizar un post recibimos los datos en $post por ello no es necesario hacer alguna consulta y solo enviamos los datos compact(‘post’)
Me encantó esta clase, y la comunidad que tiene en particular estos cursos.
para versiones Laravel 7 adelante hay que poner bien las rutas que me salia que no existe la ruta del Controller al momento de hacer clic en “Leer más” asi que revisando los comentarios veo que las rutas en el archivo web.php le manejan agregando toda la ruta…
Route::get(’/blog/{post:slug}’, ‘App\Http\Controllers\PageController@post’)->name(‘post’);
Asi fue como resolví el error del Leer más y cargue el resto de datos de la base… hay que notar también que para que salga las URL amigables hay que agregarle /{post:slug}’… espero les sirva en algo…
en git no esta el código actualizado…
Para crear la ruta obteniendo dinámicamente usamos el nombre que se le asigno en el archivo de rutas
en la vista los usamos asi:
<a href="{{ route('post', $post) }}">Leer más</a>
Lo que especificamente esta ocurriendo en juego con estas dos lineas es denominado Route Model Binding:
web.php: Route::get('blog/{post}', 'PageController@post')->name('post');
PageController.php: public function post(Post $post)
Se explica bastante bien en el siguiente video: https://www.youtube.com/watch?v=RJc0MYM2WBg
hola, en la ultima parte cuando le doy en leer mas, me lleva a la ruta pero pasa que cuando le doy al primer post que hay me manda el valor 17 y aparece la pantalla en blanco con esto: xtends(‘layouts.app’)
Estuve revisando el codigo y tengo todo bien escrito, solo que no imprime los 24 post completos y no comienza desde el 1 sino de forma aleatoria.
si tienen alguna sugerencia o algun indicio para ayudarme, se los agradezco.
cuando ejecuto el comando php artisan migrate:refresh --seed
me aparece el siguiente error
InvalidArgumentException : Unable to locate factory with name [default] [App\Post].
at C:\xampp\htdocs\blog_acad\vendor\laravel\framework\src\Illuminate\Database\Eloquent\FactoryBuilder.php:282
278| */
279| protected function getRawAttributes(array $attributes = [])
280| {
281| if (! isset($this->definitions[$this->class][$this->name])) {
282| throw new InvalidArgumentException(“Unable to locate factory with name [{$this->name}] [{$this->class}].”);
283| }
284|
285| $definition = call_user_func(
286| $this->definitions[$this->class][$this->name],
Exception trace:
1 Illuminate\Database\Eloquent\FactoryBuilder::getRawAttributes([])
C:\xampp\htdocs\blog_acad\vendor\laravel\framework\src\Illuminate\Database\Eloquent\FactoryBuilder.php:305
2 Illuminate\Database\Eloquent\FactoryBuilder::Illuminate\Database\Eloquent{closure}()
C:\xampp\htdocs\blog_acad\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Concerns\GuardsAttributes.php:123
Please use the argument -v to see more details.
alguien me puede ayudar?
chicos, encontré problemas con la fecha, no soy experto pero indagando encontré esta solución y me funciono, por si alguien tiene el mismo problema {{date(‘M d, Y’, strtotime($post->created_at))}}
No se de que me perdi pero no aparecen las misma vista que al profesor las de auth y layouts 😦
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?