Entender Laravel

1

隆Actualizamos este curso!

2

驴Qu茅 es Laravel?

3

Herramientas necesarias para trabajar con PHP y Laravel

4

Entendiendo el ciclo de vida de las solicitudes web

5

Qu茅 es un CRUD y c贸mo implementarlo

6

L贸gica de controladores y vistas con datos de prueba

7

Creando un formulario

Comprender los Fundamentos de Laravel

8

Sistema de rutas y controladores

9

Uso de Middlewares

10

Validaci贸n de datos (rutas, vistas, formularios y controladores)

11

Blade: sistema de plantillas avanzado

12

Trabajando con el componente Laravel/UI

Aprender sobre Eloquent ORM

13

Eloquent: trabajando con este ORM

14

Relaciones de tablas

15

Colecciones y serializaci贸n de datos

16

Formato de valores en tablas y presentaci贸n de datos

Crear PlatziPress

17

Proyecto Blog: presentaci贸n y configuraci贸n inicial

18

Creaci贸n de tablas, entidades y datos de prueba

19

Plantillas de trabajo y entendiendo el login

20

Dise帽o visual con Bootstrap

21

Vista index y botones de acci贸n

22

Implementaci贸n del formulario de creaci贸n

23

Implementaci贸n del guardado

24

Creando la funci贸n de editar un post

25

Actualizando nuestros posts

26

Integrando contenido audiovisual

Construir Proyecto Final: API con TDD (Intermedio)

27

Introducci贸n al testing

28

Metodolog铆a TDD y testing HTTP

29

Proyecto API con TDD: presentaci贸n y configuraci贸n inicial

30

Store con TDD

31

Refactorizaci贸n y validaci贸n en Store

32

Show con TDD

33

Update y validaci贸n con TDD

34

Delete con TDD

35

Index con TDD

36

Protecci贸n de una API con Login

37

Cierre del curso

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 鈥榳ith鈥 en lugar de 鈥榣oad鈥 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(鈥榩osts鈥).
Para visualizar un post recibimos los datos en $post por ello no es necesario hacer alguna consulta y solo enviamos los datos compact(鈥榩ost鈥)

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 鈥淟eer 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}鈥, 鈥楢pp\Http\Controllers\PageController@post鈥)->name(鈥榩ost鈥);

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(鈥榣ayouts.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(鈥淯nable 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(鈥楳 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 馃槮