Curso Laravel 8 desde cero - cursosdesarrolloweb.es


 


Curso Laravel 8 desde cero




Instalar Composer en Windows
Descargar y ejecutar instalador.

Instalar el instalador de Laravel
$ composer global require laravel/installer
NOTA: lo instala con la última versión de Laravel instalada en la PC.

Crear un nuevo proyecto Laravel via instalador
$ laravel new nombre_proyecto

Crear un nuevo proyecto Laravel via composer
$ composer create-project --prefer-dist laravel/laravel nombre_proyecto

Ejecutar proyecto en servidor local con artisan
$ php artisan serve


*** ARCHIVOS MODIFICADOS ***
001. Editar: routes\web.php
002. Crear: app\Http\Controllers\HolaController.php
    ***
    public function __invoke(string $name){
        return "Hola {$name}";
    }
    ***
003. Eliminar: app\Http\Controllers\HolaController.php
004. Ejecutar: $ php artisan make:controller HolaController
    NOTA: antes comentar Route::get('/hola2/{name}', HolaController::class);
    en routes\web.php
005. Crear: resources\views\saludo.blade.php
006. Modificar: .env
007. Ejecutar: $ php artisan migrate
008. Ejecutar: $ php artisan migrate:rollback
009. Ejecutar: $ php artisan migrate
010. Ejecutar: $ php artisan schema:dump
011. Ejecutar: $ php artisan make:migration create_posts_table
012. Editar: database\migrations\2021_02_19_193349_create_posts_table.php
***
    public function up()
    {
        Schema::create('posts'function (Blueprint $table) {
            $table->id();
            $table->string("title"100)->unique();
            $table->text("content");
            $table->timestamps();
        });
    }
***

013. Ejecutar: $ php artisan migrate
014. Ejecutar: $ php artisan make:migration add_user_id_to_posts_table
015. Editar: database\migrations\2021_02_20_130204_add_user_id_to_posts_table.php
***
    public function up()
    {
        Schema::table('posts'function (Blueprint $table) {
            $table->unsignedBigInteger('user_id')->after('id');
            $table->foreign('user_id')->references('id')->on('users');
        });
    }
***
    public function down()
    {
        Schema::table('posts'function (Blueprint $table) {
            $table->dropForeign('posts_user_id_foreign');
            $table->dropColumn('user_id');
        });
    }
***

016. Ejecutar: $ php artisan migrate
017. Ejecutar: $ composer require doctrine/dbal
018. Ejecutar: $ php artisan make:migration update_title_to_posts_table
019. Editar: database\migrations\2021_02_20_132649_update_title_to_posts_table.php
***
   public function up()
    {
        Schema::table('posts'function (Blueprint $table) {
            $table->string('title'180)->change();
        });
    }
***
    public function down()
    {
        Schema::table('posts'function (Blueprint $table) {
            $table->string('title'100)->change();
        });
    }
***

020. Ejecutar: $ php artisan migrate
021. Ejecutar: $ php artisan make:model Post
022. Modificar: database\seeders\DatabaseSeeder.php
***
    public function run()
    {
        // User::factory(10)->create();
        // Post::factory(20)->create();
        $this->call([
            PostSeeder::class
        ]);
    }
***

023. Ejecutar: $ php artisan db:seed
024. Ejecutar: $ php artisan migrate:fresh
025. Ejecutar: $ php artisan make:factory PostFactory
026. Modificar: database\factories\PostFactory.php
    public function definition()
    {
        return [
            "user_id" => User::factory(),
            "title" => $this->faker->text(50),
            "content" => $this->faker->text(500),
            "created_at" => now()
        ];
    }

027. Ejecutar: $ php artisan db:seed
028. Ejecutar: $ php artisan make:seeder PostSeeder
029. Ejecutar: $ php artisan migrate:fresh --seed
030. Ejecutar: $ php artisan make:model Phone -m
031. Modificar: database\migrations\2021_02_22_190402_create_phones_table.php
    public function up()
    {
        Schema::create('phones'function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')->references('id')->on('users');
            //$table->foreignId('user_id')->constrained('id')->onDelete('cascade');
            // $table->foreign('user_id')->references('id')->on('users');
            $table->string("phone_number"15)->unique();
            $table->timestamps();
        });
    }

032. Ejecutar: $ php artisan migrate
033. Modificar: app\Models\Phone.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Phone extends Model
{
    use HasFactory;

    protected $fillable = [
        'user_id',
        'phone_number',
    ];

    public function user() {
        return $this->belongsTo(User::class);
    }
}

034. Ejecutar $ php artisan vendor:publish 
    y luego seleccionar la opción Provider: Laravel\Tinker\TinkerServiceProvider
035. Ejecutar: $ php artisan tinker
    NOTA: Exit o Ctrl-C para salir y clear para limpiar.
036. Ejecutar: >>> use App\Models\User
037. Ejecutar: >>> User::all()
038. Ejecutar: >>> $user = User::first()
039. Ejecutar: >>> $user
040. Ejecutar: >>> $user->posts
041. Ejecutar: >>> $user = User::with("posts")->find(1)
041. Ejecutar: >>> $user->phone
042. Ejecutar: >>> use App\Models\Phone
043. Ejecutar: >>> $phone = new Phone
044. Ejecutar: >>> $phone->user_id = 1
045. Ejecutar: >>> $phone->phone_number = "1234567855"
046. Ejecutar: >>> $phone->created_at = now()
046. Ejecutar: >>> $phone->save()
047. Ejecutar: >>> $user = User::with(["phone", "posts"])->find(1)
048. Ejecutar: >>> $phone->fill(["phone_number" => "98785456"])->update()
049. Ejecutar: >>> Exit
050. Ejecutar: $ composer require laravel/breeze --dev
051. Ejecutar: $ php artisan breeze:install
052. Ejecutar: $ npm install && npm run dev
053. Ingresar en Mailtrap (https://mailtrap.io).
054. Configurar .env con las credenciales de Mailtrap.
055. Para obligar al usuario a autenticarse implementar el modelo User a MustVerifyEmail
056. Ejecutar: $ php artisan migrate:fresh --seed
057. Ejecutar: $ php artisan make:controller ContactController
058. Definir método index en controlador app\Http\Controllers\ContactController.php
***
    public function index(){
        return view('contact.form');
    }
***

058. Definir método send en controlador app\Http\Controllers\ContactController.php
***
    public function send(Request $request){
        $this->validate($request, [
            "subject" => "required|string|min:5|max:100",
            "message" => "required|string|min:20|max:3000"
        ]);

        // Para ver las variables que envía el formulario
        // dd($request->input());        
        try {
            Mail::to(User::first())->send(
                new SendContactForm(
                    $request->subject,
                    $request->message
                )
            );
            return back()
                ->with("success""El mensaje se ha enviado correctamente!");
        }catch (\Exception $exception){
            return back()
                ->with("error""Ha fallado el envío del mensaje: " . $exception->getMessage());
        }
    }
***

059. Modificar middleware de rutas en routes\web.php
***
Route::group(["middleware" => ['auth''verified']], function (){
    Route::get('/dashboard'function (){
        return view('dashboard');
    })->name('dashboard');

    Route::get("/contact",[ContactController::class"index"])->name("contact.index");
    Route::post("/contact",[ContactController::class"send"])->name("contact.send");

    Route::get("/mailable/contact"function(){
        return new \App\Mail\SendContactForm("Motivo""Mensaje");
    });
});
***

060. Editar: resources\views\layouts\navigation.blade.php
***
                <!-- Navigation Links -->
                <div class="hidden space-x-8 sm:-my-px sm:ml-10 sm:flex">
                    <x-nav-link :href="route('dashboard')" :active="request()->routeIs('dashboard')">
                        {{ __('Dashboard'}}
                    </x-nav-link>
                    <x-nav-link :href="route('contact.index')" :active="request()->routeIs('contact.index')">
                        {{ __('Contacto'}}
                    </x-nav-link>
                </div>
***

061. Crear: resources\views\contact\form.blade.php
<x-app-layout>
    <x-slot name="header">
        <h2 class="font-semibold text-xl text-gray-800 leading-tight">
            {{ __('Formulario de contacto'}}
        </h2>
    </x-slot>   

    <div class="py-12">
        <div class="max-w-2xl mx-auto sm:px-6 lg:px-8">
            <div class="p-6 bg-white border-b border-gray-200">
                <form method="POST" action="{{ route("contact.send") }}">
                    @csrf
                    <div class="block mt-4">
                        <x-form-input name="subject" label="Escribe el motivo de tu mensaje"></x-form-input>
                    </div>
                    <div class="block mt-4">
                        <x-form-textarea name="message" label="Escribe tu mensaje aquí"></x-form-input>
                    </div>
                    <div class="flex items-center justify-end mt-4">
                        <x-form-submit>Enviar mensaje</x-form-submit>
                    </div>
                </form>
            </div>
        </div>
    </div>
</x-app-layout>

062. Ejecutar: $ composer require protonemedia/laravel-form-components
    NOTA: Para instalar paquete de formulario de

NOTA: Para traducir el componente anterior al español:
     $ composer require spatie/laravel-translatable
  $ composer require laraveles/spanish
  $ php artisan laraveles:install-lang

    $ composer require laravel-lang/lang:~7.0

063. Ejecutar: composer require laravel-lang/lang:~7.0
064. Copiar directorio: vendor\laravel-lang\lang\src\es
    y pegarlo en: resources\lang
065. Ejecutar: $ php artisan make:mail SendContactForm
066. Modificar el método __construct de la clase app\Mail\SendContactForm.php
067. Agregar las variables públicas: textSubject y textMessage a app\Mail\SendContactForm.php
***
class SendContactForm extends Mailable
{
    use QueueableSerializesModels;

    /**
     * @var string
     */
    public string $textSubject;

    /**
     * @var string
     */
    public string $textMessage;
***

068. Modificar el método build de la clase app\Mail\SendContactForm.php
069. Crear: resources\views\emails\contact.blade.php
070. Ejecutar: $ php artisan vendor:publish
    Seleccionar: Tag: laravel-mail
071. Agregar la siguiente ruta al middleware en routes\web.php
072. Crear: resources\views\components\flash-messages.blade.php
@if ($message = Session::get("success"))
    <div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-green-500">
        <span class="text-xl inline-block mr-5 align-middle">
            <i class="fas fa-bell" />
        </span>
        <span class="inline-block align-middle mr-8">
            <b class="capitalize">{{ $message }}</b>
        </span>
    </div>
@endif

@if ($message = Session::get("error"))
    <div class="text-white px-6 py-4 border-0 rounded relative mb-4 bg-pink-500">
        <span class="text-xl inline-block mr-5 align-middle">
            <i class="fas fa-bell" />
        </span>
        <span class="inline-block align-middle mr-8">
            <b class="capitalize">{{ $message }}</b>
        </span>
    </div>
@endif

073. Modificar: resources\views\layouts\app.blade.php
***
            <!-- Page Content -->
            <main>
                <x-flash-messages />
                {{ $slot }}
            </main>
***

Comentarios

Entradas más populares de este blog

Ruta hacia el desarrollador web full stack en Soluciones++

Soluciones++ para VBA