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 Queueable, SerializesModels;
/**
* @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
Publicar un comentario