Laravelのコントローラーを徹底解説
目次
はじめに
本記事では、Laravelのコントローラーとは何かをわかりやすく解説します。
前半では、基礎知識を解説していき、後半ではSNSアプリの開発を通して実践形式で理解を深めるという構成になっています。
チュートリアルの全体像
本チュートリアルを通じて学べる内容は以下のようになります。
- Laravelの開発環境セットアップ
- Laravel Breezeで認証機能を導入
- Laravelのルーティングを徹底解説
- Laravelのコントーラーを徹底解説 (now🐾)
- Laravelのブレイドを使ってみよう
- マイグレーションの仕組みを解説
- シーディングを使ってみよう
- Eloquentの基本と使い方を徹底解説
- 画像アップロードを実装する方法
- バリデーションを実装してみよう
- Laravelで認可処理を実装しよう
動画で学びたい方はこちらから!
解説
Laravelのコントローラとは?
Laravelのコントローラは、ユーザからのリクエストがルーティングによって振り分けられた後に通る場所で、最終的にビュー(見た目)やデータ(Jsonなど)を返す処理を担当します。
例えばブログシステムの場合を考えてみましょう。
ユーザが投稿IDが10番のブログ記事を見たいとします。
ユーザがhttp://example.com/posts/10 にアクセスすると、Laravelのルーターがブログ投稿関連の処理を担当するコントローラ(PostControllerとします)を見つけ出し、
「投稿IDが10番の投稿をユーザが欲しがってるのでください!」
と依頼します。
コントローラはそれに沿って他の担当者(他の章でご紹介します)に依頼しながら、最終的に投稿IDが10番のビュー(見た目)を生成して返します。
コントローラは、ルーティングの後の具体的な処理の起点と考えるとわかりやすいと思います。
コントローラを作ってみよう
まずはコントローラを作成してみましょう。
以下の処理を実行して、Laravelのコントローラを作成します。
php artisan make:controller PostController
実行完了したら、app/Http/Controllers 以下のディレクトリをみてください。
PostController.phpというファイルが生成されているはずです。
コントローラに限らず、Laravelではあらゆるファイルをコマンドで生成できるようになっているので、積極的に使っていきましょう!
コントローラを書いてみよう
先ほど作成したPostController.php の中身を書いていきます。
app/Http/Controllers/PostController.php
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
class PostController extends Controller
{
/**
* 指定された投稿のIDを表示
*
* @param int $id
* @return String
*/
public function show($id)
{
return $id.'番の投稿';
}
}
次にルーティングを定義しましょう。コントローラの処理とルーティングをひもづけるためには以下のようにします。
routes/web.php
Route::get('posts/{id}', 'PostController@show');
定義し終えたら、http://localhost:8000/posts/10 にアクセスしてみてください。
10番の投稿 と表示されているのがわかります。
ルーティング定義で posts/{id} にGETアクセスがあったときにPostControllerのshowメソッドを呼び出すように定義しています。
そして具体的な処理自体はPostControllerのshowメソッドに記述します。
例の場合では、○番の投稿という文字列を返しているので、ブラウザには10番の投稿と表示されます。
この例ですと、ルーティングで以下のように書いても同じ結果が得られます。
routes/web.php
Route::get('posts/{id}', function($id) {
return $id.'番の投稿';
});
このような単純な例では、わざわざルーティングとコントローラを分けて記述するメリットは少なく思えます。
しかし、実際のアプリケーション開発では、処理が膨大になることも少なくないので、ルーティングとコントローラを分離して見通しよくアプリケーションを実装していくのが大切です。
リソースコントローラ
Laravelでは、データに対するよくある処理をまとめて作成できるように、リソースコントローラという仕組みを用意しています。
php artisan make:controller PostController --resource
このコマンドを実行すると、app/Http/Controllers/PostController.phpが作成されます。
このコントローラの中身を見ると、
- index
- create
- store
- show
- edit
- update
といったアクションが定義されています。
続いて、ルートの登録方法です。
ルートは以下のように記述します。
use App\Http\Controllers\PhotoController;
Route::resource('posts', PhotoController::class);
これによって、ルートとコントローラのアクションが以下のように関連づけられます。
HTTPメソッド | パス | コントローラ アクション | ルート名 |
---|---|---|---|
GET | /posts | index | posts.index |
GET | /posts/create | create | posts.create |
POST | /posts | store | posts.store |
GET | /posts/{post} | show | posts.show |
GET | /posts/{post}/edit | edit | posts.edit |
PUT/PATCH | /posts/{post} | update | posts.update |
DELETE | /posts/{post} | destroy | posts.destroy |
実践
それでは、アプリ開発を進めていきましょう。
まずは、コントローラを作成します。
コントローラ作成
php artisan make:controller DashboardController
php artisan make:controller PostController --resource
php artisan make:controller UserController
php artisan make:controller CommentController
コントローラ定義
次に、コントローラの処理を追加します。
今回の章では全画面のビューを返す処理を追加していきます。
app/Http/Controllers/DashboardController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class DashboardController extends Controller
{
public function index(Request $request)
{
return view('dashboard');
}
}
app/Http/Controllers/PostController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class PostController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
return view('posts.index');
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
return view('posts.create');
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(string $id)
{
return view('posts.show');
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
return view('posts.edit');
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, string $id)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
//
}
}
app/Http/Controllers/UserController.php
<?php
namespace App\Http\Controllers;
class UserController extends Controller
{
public function index()
{
return view('users.index');
}
public function show()
{
return view('users.show');
}
}
app/Http/Controllers/CommentController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class CommentController extends Controller
{
public function store()
{
//
}
}
ビューファイル作成
resources/views配下に以下のファイルを作成します。
.
|-- posts
| |-- create.blade.php
| |-- edit.blade.php
| |-- index.blade.php
| `-- show.blade.php
|-- users
| |-- index.blade.php
| `-- show.blade.php
次章で中身を書いていきますので、ひとまず以下の内容にしてください。
<x-app-layout>
<x-slot name="header">
<h2 class="font-semibold text-xl text-gray-800 leading-tight">
タイトル
</h2>
</x-slot>
</x-app-layout>
タイトルは以下の表のように、ファイルによって変えておきましょう。
ファイル名 | タイトル |
posts/create.blade.php | 投稿作成 |
posts/edit.blade.php | 投稿編集 |
posts/index.blade.php | 新着投稿 |
posts/show.blade.php | 投稿 |
users/index.blade.php | オーナー |
users/show.blade.php | オーナー詳細 |
まとめ
以上でコントローラについては終わりです。
次章はBlade(ブレイド)についてです!
この記事へのコメントはありません。