No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de Introducción a Laravel 6

Curso de Introducción a Laravel 6

Profesor Italo Morales F

Profesor Italo Morales F

Plantillas de trabajo y entendiendo el login

19/37
Recursos

Aportes 34

Preguntas 15

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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:

  • 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.
public function post(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

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 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 >
                                &ndash; {{$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 >
                                &ndash; {{$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.

https://youtu.be/OtW18xcnGzI

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!

  1. Creamos las rutas de lista de post y un solo post.
  2. Creamos el controlador y los metodos, dentro de cada uno retornamos la vista con la peticion de datos y lo enviamos.
  3. Creamos las relaciones de los datos que vamos a usar en el model de User y Post.
  4. 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.
```js class PageController extends Controller { public function posts(){ return view('posts',[ 'posts' => Post::with('user')->latest()->paginate() ]); } public function post($post){ $post = Post::with('user')->find($post); return view('post', ['post' => $post]); } } ```class PageController extends Controller{    public function posts(){        return view('posts',\[            'posts' => Post::with('user')->latest()->paginate()        ]);    }     public function post($post){        $post = Post::with('user')->find($post);        return view('post', \['post' => $post]);    }}

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>
                            &ndash; {{$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 😦