こんにちは。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が渡ります。
今回は実装していませんが、登録が完了したらアラートを出すこともパラメータを使用して実現できます。
コメント