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

Ejecutando comandos desde la API

11/33
Recursos

Aportes 14

Preguntas 0

Ordenar por:

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

No me parecio el reto de esta clase鈥
el projecto del curso es una api para puntuar
y no lo esta ense帽ando bien simplemente dandolo de reto.

Me parece perfecto que no te den todo tan masticado pero no es el caso
en este curso,parece que por terminar el curso en 35 clases hay que ir a 200 por hora鈥
No hay mucha explicacion detras de lo que esta mostrando鈥

Es increible avanzar en cada video y continuar viendo fallas, 驴C贸mo es posible que los retos los deja asi en el limbo?

Insisto este curso est谩 mal desarrollado, parece que lo hubieran planeado, estructurado y desarrollado el mismo d铆a!

Personalmente lo que menos me interesa de Platzi es acumular puntos en ese contador de mi perfil, me interesa contenido de calidad y este curso me est谩 generando malestar y mucho que desear.

ser铆a muy interesante en el bloque de relaciones polimorficas ver c贸mo quedan los datos cargados una vez se haga un rating.

Solo una mejora, cuando se hace el whereDate podr铆an escribir <= en lugar de = porque si s贸lo se usa = entonces solo funcionara para los usuarios que tienen exactamente 7 d铆as de haberse registrado y no para los que tengan m谩s de 7 d铆as.

El comando para que se pueda ejecutar de forma programatica necesita una ligera evaluacion si el flag optional schedule esta en el comando o si el promp es true pero ambos no se pueden evaluar en la misma sentencia if:

Clase command modificada usando un flag para ejectuar el comando:

<?php

namespace App\Console\Commands;

use App\Notifications\NewsletterNotification;
use App\User;
use Illuminate\Console\Command;

class SendNewsletterCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'send:newsletter {emails?* : Array of emails to send the newsletter notification} {--s|schedule : Should execute directly?}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'It sends a newsletter email';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $emails = $this->argument('emails');
        $builder = User::query();

        if($emails) {
            $builder->whereIn('email', $emails);
        }

        $count = $builder->count();


        if ($count) {

            $execute = true;

            if (! $this->option('schedule')) {

                if (! $this->confirm('Are you sure to send emails ?')) {
                    $execute = false;
                }
            }

            if ($execute) {
                $this->output->progressStart($count);

                $builder->whereNotNull('email_verified_at')->each(function(User $user) {
                    $user->notify(new NewsletterNotification());
                    $this->output->progressAdvance();
                });


                $this->output->progressFinish();
                return $this->info('Se enviaron ' . $count . ' emails');
            }
        }

        $this->info('No se envio ningun correo');
    }
}

Podemos llamar ahora al comado de forma programatica por ejemplo en una ruta web:

Route::get('/command', function() {
   \Illuminate\Support\Facades\Artisan::call('send:newsletter -s');
   return 'Newsletter emails sent!';
});

Excelente curso !! preciso y conciso

Yo solucione el reto diferente profe


      $builder
       >whereNull('email_verified_at')
        ->whereRaw('email_verified_at BETWEEN DATE_ADD(CURDATE(), INTERVAL -7 DAY) AND CURDATE()');```

intentare hacer esos endPoint

Este curso esta muy interesante pero muy mal explicado,
lo estoy viendo dos o tres veces cada video a 0.85x y leyendo la documentacion pero aun asi me pierdo en muchas partes quiza es solo como una introduccion a estos temas y seria bueno que hagan uno donde expliquen bien cada tema 馃槙 por que este es solo como un repaso

Creo que hubiera sido bueno dejar el test para saber si se ha cumplido el reto como se debe,

$lastWeek = Carbon::now()->subWeek()->format('Y-m-d');
$curDate = Carbon::now()->format('Y-m-d');

$unverifiedUsers = $builder->whereNull("email_verified_at")
	->where(function ($query) use ($lastWeek, $curDate) {
                $query->whereBetween("created_at", ["{$lastWeek}", "{$curDate}"]);
});

Hola, les dejo mi soluci贸n al reto para calificar productos desde un EndPoint.
.
Primer parte - Prueba
Siguiendo TDD, primero se escribe una prueba, la m铆a es medio escueta en la respuesta pero fuerte en la comprobaci贸n de la DB:

<?php

namespace Tests\Feature\Http\Controllers;

use App\Models\Product;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Tests\TestCase;

class RatingControllerTest extends TestCase
{
    use RefreshDatabase;
    /**
     * Pruebo un End-Point de mi API que me permita calificar un producto
     *
     * @return void
     */
    public function test_api_product_rating()
    {
        $this->withoutExceptionHandling();
        $user = User::factory()->create();
        $product = Product::factory()->create();
        $data = [
            'score' => 3.5
        ];

        $this
            ->actingAs( $user )
            ->postJson( "api/rating/products/$product->id", $data );

        $this
            ->assertDatabaseHas( 'ratings', [
                'score' => $data['score'],
                'rateable_type' => get_class($product),
                'rateable_id' => $product->id,
                'qualifier_type' => get_class( $user ),
                'qualifier_id' => $user->id
            ] );
    }
}

B谩sicamente, creo un usuario, luego un producto y luego la informaci贸n que se enviar谩 en la solicitud API - despu茅s actuando como el usuario recien creado publico en el endpoint indicado mi data para luego comprobar que en efecto se cre贸 el registro de la calificaci贸n en la tabla ratings. Les dejo el commit en mi repositorio: Pruebo que un usuario pueda calificar un producto desde un EndPoint API
.
Segunda parte - Api route
Para hacer que la prueba pase hay que decirle a Laravel que en efecto existe el endpoint al que queremos pasarle la calificaci贸n y lo hacemos de la siguiente forma:


Route::post( 'rating/products/{product}', [App\Http\Controllers\RatingController::class, 'products'] )
            ->middleware('auth:sanctum');

Aqu铆 decimos que cuando se acceda a la ruta especificada se ejecute el m茅todo products del RatingController ( a煤n no creado), les dejo el commit en mi repositorio: End Point protejido por sanctum para calificar producto
.
Tercera parte - M茅todo Products de RatingController
Ahora s铆 se viene lo bueno (xd), creamos el controlador que indicamos en la ruta (php artisan make:controller RatingController) y definimos lo que el m茅todo products deba hacer:


<?php

namespace App\Http\Controllers;

use App\Models\Product;
use Illuminate\Http\Request;

class RatingController extends Controller
{
    public function products( Request $request, Product $product )
    {
        $request->user()->rate( $product, $request->score );

        return response()->json([
            'data' => 'califici贸n aplicada'
        ]);
    }
}

Aqu铆 accedemos al usuario mediante el obejto $request y encadenamos el m茅todo rate() para pasarle el $product a calificar y el score del $request y respondemos que todo ok. Les dejo el commit de mi repositorio: m茅todo products de RatingController

y ya est谩! la prueba pasa 馃コ

Mi solucion

<?php

namespace App\Console\Commands;

use App\Models\User;
use App\Notifications\EmailVerificationNotification;
use Illuminate\Console\Command;

class SendEmailVerificationReminderCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'send:reminder {emails?*}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Send Email verification reminder';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $emails = $this->argument('emails');
        $builder = User::query();
        if ($emails) {
            $builder->whereIn('email', $emails);
        }
        $builder->whereNull('email_verified_at');
        $count = $builder->count();
        if ($count) {
            $this->output->progressStart();
            $builder->each(function (User $user) {
                $user->notify(new EmailVerificationNotification());
                $this->output->progressAdvance();
            });
            $this->output->progressFinish();
            $this->info("$count emails send");
        } else {
            $this->info('No emails without verification');
        }
    }
}