Tutorial – Sistema de blog de Laravel
En este tutorial, transformaremos cualquier sitio de plantilla HTML que pueda comprar de Themeforest en un sistema de blog funcional basado en Laravel.
Este no es un tutorial para principiantes, por lo que no explicaré cada línea de código. Mi tutorial anterior es un tutorial para principiantes. (Dame un poquito y lo organizo, lo prometo).
Cualquier plantilla HTML con sección de blog > Blog funcional
Descripción del proyecto:
Usaremos una plantilla de administrador y una plantilla de vista pública. La plantilla de administración se llama CoreUI Bootstrap. Puedes descargarlo aquí. https://coreui.io/product/free-bootstrap-admin-plantilla/
La plantilla HTML gratuita se llama MegaKit. Es completamente gratis. Puede usar esta plantilla para este tutorial o un sitio HTML predesarrollado de su elección.
https://themewagon.com/themes/free-bootstrap-4-html-5-business-website-template-megakit/
1. Aquí está el diagrama UML
2. Crea el Proyecto Laravel
composer create-project laravel/laravel blog
3. Abra el directorio del blog con su editor de código y terminal. Luego crea Post Model y Controller
php artisan make:model Post -m -c
4. Este es el archivo posterior a la migración
<?phpuse Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema;return new class extends Migration { public function up() { Schema::create(‘posts’, function (Blueprint $table) { $table->id(); $table->string(‘title’); $table->text(‘content’)->default(“”); $table->enum(‘status’, [‘draft’, ‘published’])->default(‘draft’); $table->string(‘slug’)->unique(); $table->boolean(‘is_comment_authorize’)->default(false); $table->string(‘excerpt’)->default(“”); $table->boolean(‘is_in_trash’)->default(false); $table->timestamps(); $table->foreignId(‘user_id’)->constrained(‘users’)->cascadeOnUpdate()->cascadeOnDelete(); }); }public function down() { Schema::dropIfExists(‘posts’); } };
6. Crear el modelo de comentarios y el controlador
php artisan make:model Comment -m -c
7. Cree el archivo de migración de la tabla de comentarios:
<?phpuse Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema;return new class extends Migration { public function up() { Schema::create(‘comments’, function (Blueprint $table) { $table->id(); $table->string(‘name’); $table->string(‘email’); $table->text(‘comment’); $table->boolean(‘is_approved’)->default(false); $table->boolean(‘is_in_trash’)->default(false); $table->foreignId(‘post_id’)->constrained(‘posts’)->cascadeOnUpdate()->cascadeOnDelete(); $table->timestamps(); }); } public function down() { Schema::dropIfExists(‘comments’); } };?>
8. Hacer modelo de imagen y controlador
php artisan make:model Image -m -c
9. Crear archivos de migración de imágenes
<?phpuse Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema;return new class extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create(‘images’, function (Blueprint $table) { $table->id(); $table->string(‘path’); $table->foreignId(‘post_id’)->constrained(‘posts’)->cascadeOnUpdate()->cascadeOnDelete(); $table->timestamps(); }); }/** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists(‘images’); } };
10. Hacer modelo y controlador de BlogCategory
php artisan make:model BlogCategory -m -c
11. Cree el archivo de migraciones de BlogCategory
<?phpuse Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema;return new class extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create(‘blog_categories’, function (Blueprint $table) { $table->id(); $table->string(‘name’); $table->string(‘desc’); $table->string(‘slug’); $table->timestamps(); }); }/** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists(‘blog_categories’); } };
12. Asociación entre publicación y categoría
Como la asociación entre publicación y categoría es una relación de muchos a muchos, debemos crear una migración para la tabla intermedia sin el modelo y el controlador.
php artesanal hacer: migración create_blog_category__posts_table
13. blog_category__posts_table migración
<?phpuse Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema;return new class extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create(‘blog_category__posts’, function (Blueprint $table) { $table->timestamps(); $table->integer(‘post_id’)->unsigned(); $table->integer(‘blog_id’)->unsigned(); }); }/** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists(‘blog_category__posts’); } };
- Modelo de publicación (aplicación/Modelos/Publicación)
<?phpnamespace App\Models;use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model;use App\Models\Image; use App\Models\User; use App\Models\Comment; use App\Models\BlogCategory; class Post extends Model { use HasFactory; protected $fillable=[ ‘title’,’content’,’post_date’,’post_update’,’status’,’slug’,’is_comment_authorize’,’excerpt’,’is_in_trash’, ‘user_id’ ];public function feature_image() { return $this->hasOne(Image::class); }public function comments() { return $this->hasMany(Comment::class); }public function post() { return $this->belongsTo(User::class); }public function BlogCategory() { return $this->belongToMany(BlogCategory::class); }public function author() { return $this->belongsTo(User::class, ‘user_id’); } }
- BlogCategoría modelo
<?php espacio de nombres App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use App\Models\Post; clase BlogCategoría extiende Modelo { usar HasFactory; protegido $rellenable=[ 'nombre', 'desc', 'babosa' ]; publicación de la función pública(){ return $this->belongToMany(Publicar::clase); } }
- Modelo de usuario
<?phpnamespace App\Models;// use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Laravel\Sanctum\HasApiTokens;use App\Models\Post;class User extends Authenticatable { use HasApiTokens, HasFactory, Notifiable;/** * The attributes that are mass assignable. * * @var array<int, string> */ protected $fillable = [ ‘name’, ‘email’, ‘password’, ];/** * The attributes that should be hidden for serialization. * * @var array<int, string> */ protected $hidden = [ ‘password’, ‘remember_token’, ];/** * The attributes that should be cast. * * @var array<string, string> */ protected $casts = [ ‘email_verified_at’ => ‘datetime’, ];public function post() { return $this->hasMany(Post::class); } }
- Modelo de imagen
<?phpnamespace App\Models;use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model;use App\Models\Post;class Image extends Model { use HasFactory;protected $fillable = [ ‘path’, ‘post_id’ ];public function feature_image() { return $this->belongTo(Post::class); } }
- Modelo de comentario
<?phpnamespace App\Models;use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use App\Models\Post;class Comment extends Model { use HasFactory; protected $fillable=[ ‘name’,’email’,’comment’,’comment_at’,’is_approuve’,’is_in_trash’,’post_id’ ];public function comments() { return $this->belongsTo(Post::class); } }
Recordatorio para sí mismo: Agregar explicaciones de código más tarde para los lectores.
Gracias por llegar hasta aquí, si encuentras esto útil no olvides aplaudir 👍🏼suscribirse para recibir más contenido.
Si le interesa, puede echar un vistazo a algunos de los otros artículos que he escrito recientemente sobre AWS y Laravel:
Recent Post
Clientes: La conversación más difícil
La conversación con el cliente más difícil que jamás haya tenidoAWS Rekognition: Reconocimiento de imagen / video
Reconocimiento de imagen / video AI con Node.js y AWS Rekognition