meta data for this page
Laravel Blogue
Configuration du projet
php artisan make:auth php artisan make:migration create_posts_table php artisan make:seeder PostsTableSeeder php artisan make:model Post php artisan make:controller PostController
Migration table Posts
public function up() { Schema::create('posts', function (Blueprint $table) { $table->bigIncrements('id'); $table->string('title'); $table->text('content'); $table->timestamps(); }); }
Seeding table Posts
Nouveauté ⇒ utilisation de Faker pour créer des données aléatoires
use Illuminate\Database\Seeder; use Faker\Generator as Faker; class PostsTableSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run(Faker $faker) { for ($i=0; $i < 10; $i++) { DB::table('posts')->insert([ 'title' => $faker->sentence(2), 'content' => $faker->realText, ]); } } }
Migration et Seeding de la base de données
php artisan migrate php artisan db:seed --class=PostsTableSeeder
Modèle Post
namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { protected $fillable = ['title', 'content']; }
Contrôleur PostController Index
Création de la méthode Index() pour aller chercher les articles de blogue dans la base de données et les afficher dans la vue Welcome.blade.php
On va utiliser la class Post
, donc il faut mettre au début du fichier
use App\Post;
public function index() { $posts = Post::orderBy('created_at', 'desc')->paginate(4); return View('welcome', compact('posts')); }
Modification de la route pour la page d'accueil
Route::get('/', 'PostController@index')->name('post');
View Welcome
Configuration de la page accueil
@extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-12"> @foreach ($posts as $post) <h2> <a href="{{ url("/posts/{$post->id}") }}">{{ $post->title }}</a> </h2> <p>{{ $post->content }}</p> @endforeach {{ $posts->links() }} </div> </div> </div> @endsection
Contrôleur PostController View
Ajout de la méthode pour voir un article de blogue
public function view($id) { $post = Post::find($id); return View('post', compact('post')); }
Ajout de la route pour un article de blogue
Route::get('/posts/{id}', 'PostController@view');
Ajout de la vue pour afficher un article
Création de post.blade.php
@extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-12"> <h2> {{ $post->title }} </h2> <p>{{ $post->content }}</p> </div> </div> </div> @endsection
Contrôleur PostController ajout de la méthode delete pour supprimer un article
public function delete($id) { $post = Post::destroy($id); return redirect('/'); }
Ajout du bouton Supprimer dans la vue Welcome
On va créer le bouton dans une vue différente afin d'organiser un peu le code.
Créer un dossier /ressouces/views/inc
Puis créer le fichier delete.blade.php
dans ce dossier
Dans le fichier welcome.blade.php, on ajoute le include dans la boucle @foreach
@foreach ($posts as $post) <h2> <a href="{{ url("/posts/{$post->id}") }}">{{ $post->title }}</a> </h2> <p>{{ $post->content }}</p> @include('inc.delete') @endforeach
Puis dans la vue delete.blade.php
@auth <form action="{{ url('posts/'.$post->id) }}" method="POST"> {{ csrf_field() }} {{ method_field('DELETE') }} <button type="submit" class="btn btn-danger"> Supprimer </button> </form> @endauth
Le bouton sera afficher seulement aux utilisateurs connecté car on ajoute au début @auth
Ajout de la route pour supprimer un article
Route::delete('/posts/{id}', 'PostController@delete');
Formulaire de création d'article
On ajoute les routes pour afficher le formulaire et faire l'enregistrement
Route::get('/post_add', 'PostController@create')->middleware('auth'); Route::post('/post_add', 'PostController@store')->middleware('auth');
Ajout des méthodes dans le contrôleur PostController
On ajoute la méthode create() pour afficher le formulaire La méthode validator() pour valider le formulaire
La méthode store() pour enregistrer les informations dans la base de données
Comme on va utiliser la class Validator, il faut l'ajouter au début du fichier
use Illuminate\Support\Facades\Validator;
public function create() { return View('add_post'); } protected function validator(array $data) { return Validator::make($data, [ 'title' => 'bail|required', 'content' => 'bail|required' ]); } public function store(Request $request) { $this->validator($request->all())->validate(); $post = $request->all(); Post::create($post); return redirect('/'); }
Création de la vue add_post.blade.php
@extends('layouts.app') @section('content') <div class="container"> <div class="row justify-content-center"> <div class="col-md-12"> <form action="{{ url("post_add") }}" method="POST" class="form-horizontal"> @csrf @if ($errors->any()) <div class="alert alert-danger" role="alert"> Verifiez les informations </div> @endif <div class="form-group"> <label for="task" class="col-sm-3 control-label">Titre</label> <div class="col-sm-6"> <input type="text" name="title" id="task-name" class="form-control {{ $errors->has('title') ? 'is-invalid' : '' }}"> @if($errors->has('title')) <div class="invalid-feedback">{{ $errors->first('title') }}</div> @endif </div> </div> <div class="form-group{{ $errors->has('content') ? ':invalid' : '' }}"> <label for="task" class="col-sm-3 control-label">Texte</label> <div class="col-sm-6"> <textarea type="text" name="content" id="task-name" class="form-control {{ $errors->has('content') ? 'is-invalid' : '' }}"></textarea> @if($errors->has('content')) <span class="invalid-feedback">{{ $errors->first('content') }}</span> @endif </div> </div> <div class="form-group"> <div class="col-sm-offset-3 col-sm-6"> <button type="submit" class="btn btn-default"> Validez </button> </div> </div> </form> </div> </div> </div> @endsection
Ajout d'un lien dans le menu pour aller sur la page "Écrire un article"
Dans le fichier app.blade.php, dans la navbar, ajouter le lien seulement pour les utilisateurs connectés
<li class="nav-item"> <a class="nav-link" href="{{ url("post_add") }}">Écrire article</a> </li>