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>