【初心者向け】Laravelで記事投稿ページを作成する(新規登録処理編)

※本サイトはアフィリエイトリンクを掲載しています。
Laravel

こんにちは。Web系エンジニアのカズです。

今回は初心者の方に向けて、Laravelの新規登録処理ができるように記事投稿ページを例にして解説していきます。

それぞれのファイルの処理を掲載しているので、全体の処理の流れを掴んでもらいやすいと思います。

ちなみに更新処理はこちらで解説しています。

以下の流れで説明。

1.ルーティングファイルの設定

2.テーブル作成

3.モデル作成

4.Bladeファイルの作成

5.controllerの作成

必要なファイル

・web.php(ルーティングファイル)

・create_posts_table(テーブル生成に必要なmigrationファイル)

・Post.php(モデルファイル)

・index.blade.php(記事一覧ファイル)

・register.blade.php(記事新規登録ファイル)

・PostController.php(登録処理などロジックを記載するファイル)

 

1.ルーティングファイルの設定

web.phpに下記を記載します。

Route::get('/post/index', [PostController::class, 'index'])->name('post.index');
Route::get('/post/register', [PostController::class, 'register'])->name('post.register');
Route::post('/post/store', [PostController::class, 'store'])->name('post.store');

controllerの命名は記事を「投稿する」の意味合いをもつpostにしました。

 

2.テーブル作成

コマンドでmigrationファイルを作成

php artisan make:migration create_posts_table

これでcreate_posts_tableが生成されます。
そのファイルを開いて編集します。
今回は「記事タイトル」と「記事サブタイトル」と「記事本文」のカラムを設定します。

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Support\Facades\Schema; 

class CreatePostsTable extends Migration 
{ 
    /**
     * Run the migrations. 
     * @return void
    */
    public function up()
    { 
        Schema::create('posts', function (Blueprint $table) 
        { 
            $table->id();
            $table->string('title');
            $table->string('subtitle')->nullable();
            $table->text('text')->nullable();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}

 

migrationファイルが編集出来たら、migrate実行をしてテーブル生成をします。

php artisan migrate

テーブル生成されました。

 
おすすめ本


 

3.モデル作成

php artisan make:model Post

生成されたPost.phpを編集します。
$guardedで登録する対象カラムの定義を記載します。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use App\Models\Post;

class Post extends Model
{
    use HasFactory;

    protected $guarded = [
        'id',
    ];

    public function post() {
        return Post::get();
    }
}

$guardedの中にidを定義することでid以外のカラムを対象としています。

保存する処理のcreateやsaveメソッドを使う際に、こちらの定義が関係します。

上記ではid以外のカラムがcreateやsaveなどのメソッド時に処理の対象となります。

$guardedではなく$fillableで記載する方法もありますが、全ての対象カラムを1つずつ記載する手間があるため$guardedを使用しています。

4.Bladeファイルの作成

一覧画面のbladeファイル

<h1>記事一覧</h1>
<a href="register">新規登録</a>
<table border="1" cellspacing="0">
  <tr>
    <th>ID</th>
    <th>タイトル</th>
    <th>サブタイトル</th>
    <th>本文</th>
  </tr>
  @foreach($posts as $post)
    <tr>
      <td>{{$post->id}}</td>
      <td>{{$post->title}}</td>
      <td>{{$post->subtitle}}</td>
      <td>{{$post->text}}</td>
    </tr>
  @endforeach
</table>

controllerから渡してきた$postsの変数を使用しています。

$postsはデータベースに保存されているデータを取得します。

$postを使用してカラムごとにデータを表示しています。

一覧画面で登録したデータの一覧を参照でき、新規登録画面を押下すると登録ページに遷移できます。

 

登録画面のbladeファイル

<h1>新規登録</h1>
<form action="store" method="POST">
@csrf
  <p>タイトル</p>
  <input type="text" name="title" maxlength="30"/>
  <br/>
  <p>サブタイトル</p>
  <input type="text" name="subtitle" maxlength="30"/>
  <br/>
  <p>本文</p>
  <textarea name="text" maxlength="300"></textarea>
  <br/>
  <input type="submit" value="登録" />
</form>

登録ボタンを押下すると、controllerのstore関数に処理が移り

登録処理が実行されます。

また実際の画面のレイアウトについては、CSSは特に何も加工していません。

5.controllerの作成

コントローラーを生成

php artisan make:controller PostController

コントローラーを生成したら編集

<?php
 
namespace App\Http\Controllers; 
use App\Models\Post; 
use Illuminate\Http\Request;
 
class PostController extends Controller 
{ 
    public function index(Request $request) 
    { 
        $posts = Post::post();
        
        return view('post.index', [ 
            'posts' => $posts
        ]);
    }

    public function register(Request $request)
    {
        return view('post.register');
    }

    public function edit(Request $request)
    {
        return view('post.edit');
    }

    public function store(Request $request) {
        try {
            $posts = Post::post();
            Post::create($request->all());

            return redirect()->route('post.index')->with([
                'posts' => $posts,
                'store' => 'true'
            ]);
        } catch (Exception $e) {
            return redirect()->route('post.index')->with([
                'posts' => $posts,
                'store' => 'false'
            ]);
        }
    }
}

store関数でデータベースに保存する処理があります。

登録が正常にできれば、一覧画面にリダイレクトされてパラメータのstoreにtrueが渡ります。

今回は実装していませんが、登録が完了したらアラートを出すこともパラメータを使用して実現できます。

コメント