Laravel y Base de Datos

Entorno de trabajo y repaso de Laravel

1

Qu茅 aprender谩s sobre Laravel Avanzado

2

Repaso de Laravel y requisitos del curso

3

Configuraci贸n de la base de datos-SQLite en Laravel

4

Instalaci贸n, configuraci贸n y uso de Homestead

5

Instalar Laravel Sanctum

6

API de autenticaci贸n: laravel UI y laravel sanctum

Manejo de tu base de datos con Laravel

7

Capa de transformaci贸n con API Resources

8

Manejo de relaciones en bases de datos con Laravel

9

Relaciones Polim贸rficas en Eloquent

La terminal de Laravel

10

C贸mo crear comandos para la terminal de Laravel

11

Ejecutando comandos desde la API

12

Programaci贸n de tareas

Eventos y tareas de Laravel

13

Eventos y Listeners en Laravel

14

Eventos de Eloquent

15

Introducci贸n al uso de Queues y Jobs

16

C贸mo disparar eventos en Queues

17

Laravel Horizon

Manejo de errores

18

C贸mo capturar y leer errores con la clase Handler

19

Excepciones personalizadas

20

Excepciones HTTP personalizadas y debugging con Laravel Telescope

21

Configuraci贸n de logs y channels en Laravel

El coraz贸n de Laravel

22

Ciclo de vida de una aplicaci贸n en Laravel

23

驴Qu茅 son los service containers?

24

驴C贸mo funciona un service container?

25

Registro y carga de clases con service providers

Creaci贸n de paquetes

26

驴C贸mo crear mis propios paquetes de Laravel?

27

Propiedades para manejo de dependencias

28

Comprende el archivo composer.json

29

Extendiendo composer.json, autocarga de clases y PSR-4

30

Crear mis propios Services Providers

31

Publicaci贸n de archivos

32

Uso de repositorios locales

33

Publicaci贸n de paquetes en packagist

A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Eventos y Listeners en Laravel

13/33
Recursos

Aportes 11

Preguntas 1

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Otra forma de generar eventos y listeners directamente es escribiendolos en el EventServiceProvider con su namespace completo dentro del array de eventos y Laravel tiene un comando especial para generar ambos directamente lo cual puede ser un poco mas productivo en terminos de crear codigo mas rapido el comando es:

php artisan event:generate

Events: ACCIONES que ocurren por usuarios. Ejemplo: USUARIO se REGISTRA.

Listeners: DISPARADORES a trav茅s de los EVENTOS. Ejemplo: ENVIAR mail debido a una REGISTRACI脫N.

Interesante, se pueden manejar eventos con Laravel, eso si no lo sab铆a 馃

Dejo el enlace con el commit de esta clase en Laravel 8

https://github.com/RetaxMaster/platzi-api/commit/dbcb7a5a28b57778cff8aaa2757c97ce59f1a4ee

que mal curso, no explica nada, el c贸digo ya lo tiene hecho no lo va construyendo.

Comparto mi soluci贸n al reto:
Primera parte - Prueba de Unrate
Siguiendo TDD primero creamos una prueba para testear que un usuario en efecto pueda quitar su calificaci贸n de un producto:

public function test_unrating_model()
    {
        $this->withoutExceptionHandling();
        $user = User::factory()->create();
        $product = Product::factory()->create();

        $user->rate( $product, 5 );

        $user->unrate( $product );

        $rating = Rating::first();

        $this->assertEmpty( $rating );
    }

Creamos un usuario y un producto, le damos un calificaci贸n y luego la borramos, comprobamos que ya no exista m谩s esa calificaci贸n, les dejo el commit en mi repositorio: test_unrating_model
.
Segunda parte - m茅todo unrate del Trait CanRate
Como los usuarios tiene el trait CanRate, hace sentido que definamos el m茅todo para borrar calificaci贸n dentro de esa clase:

public function unrate( Model $model )
    {
        // $rating = \App\Models\Rating::query()
        //                             ->where( 'qualifier_id', $this->id )
        //                             ->where( 'rateable_id', $model->id )
        //                             ->first();

        // $rating->delete();

        $this->ratings( $model->getMorphClass() )->detach( $model->getKey() );

        event( new ModelUnrated( $this, $model ) );

        return true;
    }

llegu茅 a una soluci贸n diferente a la que el profe, pero me pareci贸 m谩s elegante la de 茅l por lo que la us茅 tambi茅n, cabe aclarar que en este m茅todo dispararemos el evento del reto. Dejo el commit de mi repositorio: m茅todo unrate
.
Tercera parte - creaci贸n del evento
Pues creamos el evento que guardara y expondr谩 el nombre del qualifier (quien quit贸 su calificaci贸n) y el nombre del rateable (producto al cual se le quit贸 calificaci贸n):

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class ModelUnrated
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $qualifier;
    public $rateable;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct( Model $qualifier, Model $rateable )
    {
        $this->qualifier = $qualifier;
        $this->rateable = $rateable;
    }

    public function getQualifier(): Model
    {
        return $this->qualifier;
    }

    public function getRateable(): Model
    {
        return $this->rateable;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}

.
Cuarta parte - Creaci贸n del Listener
Vamos a crear el Listener que se encargara de atender el evento cuando este se dispare, para enviar una notificaci贸n por email que informe el nombre de quien quit贸 su calificaci贸n y a que producto:

<?php

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class ModelUnrated
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $qualifier;
    public $rateable;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct( Model $qualifier, Model $rateable )
    {
        $this->qualifier = $qualifier;
        $this->rateable = $rateable;
    }

    public function getQualifier(): Model
    {
        return $this->qualifier;
    }

    public function getRateable(): Model
    {
        return $this->rateable;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}

les dejo el commit en mi repositorio: creaci贸n de listener

.
Quinta parte - Creaci贸n de la notificaci贸n
creamos una notificaci贸n donde el constructor guarda los valores anteriormente mencionados en variable privadas y redactamos el contenido del correo:

<?php

namespace App\Notifications;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;

class ModelUnratedNotification extends Notification
{
    use Queueable;

    private $qualifierName;
    private $rateableName;

    /**
     * Create a new notification instance.
     *
     * @return void
     */
    public function __construct( string $qualifierName, string $rateableName )
    {
        $this->qualifierName = $qualifierName;
        $this->rateableName = $rateableName;
    }

    /**
     * Get the notification's delivery channels.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function via($notifiable)
    {
        return ['mail'];
    }

    /**
     * Get the mail representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return \Illuminate\Notifications\Messages\MailMessage
     */
    public function toMail($notifiable)
    {
        return (new MailMessage)
                    ->line( "El usuario {$this->qualifierName} ha removido su calificaci贸n de tu producto {$this->rateableName}" );
    }

    /**
     * Get the array representation of the notification.
     *
     * @param  mixed  $notifiable
     * @return array
     */
    public function toArray($notifiable)
    {
        return [
            //
        ];
    }
}

Les dejo el commit de mi repositorio: notificaci贸n
.
Sexta parte - Declaramos el evento y el listener en Laravel

ModelUnrated::class => [
            SendEmailModelUnratedNotification::class
        ]
        ]

y estamos listos para seguir!

aca al profe si le falto explicar como probar ese event y listener, sera investigar. platzi no esta poniendo atencion a la calidad de los cursos

Creo que en esta clase no hemos seguido una convenci贸n de nombres.

Cual es el git del proyecto

Eventos todas la acciones que user inicia

reto
php artisan make:event ModelUnrated
Utils/CanRate //disparar evento en el method unrate
php artisan make:listener SendEmailModelUnratedNotification
php artisan make:notification ModelUnratedNotification
agregamos nuestro evento al event provider

Estoy haciendo un proyecto en Laravel y tengo la siguiente estructura de tablas

Product
id
name
image
code
Price
id
product_id
purchase_price
sale_price

Warehouse
id
name
user_id
address

product_warehouse
product_id
warehouse_id
product_quantity
price_id

La ultima tabla la utilizo como tabla pivote y me permite obtener los productos que tiene un almac茅n, como se puede ver es una tabla pivote, pero me gustar铆a obtener el precio del producto utilizando el price_id de dicha tabla pivote. No se si alguien me podr铆a asesorar me ayudar铆a mucho, intente usar el HasOneTrought desde el producto hacia el precio con el warehouse pero no me funciono, o si alguien tendr铆a una mejor idea para resolver esto
鈥欌欌
public function price(){
return $this->hasOneThrough(Price::class,Warehouse::class,鈥榩roduct_id鈥,鈥榩rice_id鈥);
}
鈥欌'
Saludos