CLOSE
MENU
Laravel 基礎学習/Controller の仕組みと書き方

Laravel 基礎学習/Controller の仕組みと書き方

Laravel の Controller は、アプリの処理を担当する重要な仕組み。
本記事では、Controller の役割や基本的な使い方、作成方法について解説する。

Controller とは

Laravel では、
基本的に以下の流れで処理が行われる。

ブラウザアクセス

Route
URL に対応する Controller を決定

Controller
必要な処理を実行

Model
DB操作が必要な場合に利用する

View
ブラウザへ表示する HTML を生成

ブラウザへ表示

Laravel の Controller は、
Route から呼び出され、
アプリの処理を担当する仕組み。

Controller では、

などを行う。

例えば、

https://example.com/posts

にアクセスされた場合、
Controller が投稿一覧データを取得し、
一覧画面を表示する処理を実行する。

Laravel では、
Route で URL と Controller を紐付けることで、
対応する Controller のメソッドが呼び出される。

Controller は、
リクエストを受け取り、
必要に応じて Model や View と連携しながら処理を進める役割を持つ。

Controller を作成する

Laravel では、
Controller ファイルを

app/Http/Controllers

フォルダ内へ配置する。

このフォルダは、
Laravel プロジェクト作成時に最初から自動作成される。

Controller は、
通常の PHP ファイルとして手動作成することもできる。

ただし Laravel では、
Artisan コマンドを使って作成することが多い。

Artisan を使用すると、
Laravel の定型コードを自動生成できる。

例えば、
namespace や class 定義などを、
最初から Laravel の形式で作成してくれる。

実行場所

ターミナルで Laravel プロジェクトフォルダへ移動してから実行する。

d ~/Herd/bbs-app

実行コマンド

hp artisan make:controller PostController

正常に作成された場合

正常に実行されると、
以下の場所に Controller ファイルが作成される。

app/Http/Controllers/PostController.php

命名規則

Laravel の Controller は、

対象名 + Controller

の形で命名することが多い。

PostController
UserController
CommentController

Controller 名は、
「何を扱う Controller なのか」が分かる名前にする。

Laravel では、
クラス名の先頭を大文字にする
PascalCase(パスカルケース)が一般的。

PostController.php

なお、
ファイル名とクラス名は一致させる必要がある。

class PostController extends Controller
{
}

この場合、
ファイル名も

PostController.php

にする。

フォルダ分けする例

Controller は、
用途ごとにフォルダ分けすることも多い。

app/Http/Controllers
 ├ PostController.php
 ├ CommentController.php
 ├ Auth
 │   ├ LoginController.php
 │   └ RegisterController.php
 └ Admin
     ├ PostController.php
     └ UserController.php

例えば、

のように分けることで、
Controller が増えても整理しやすくなる。

Controller の基本形

Laravel の Controller は、
基本的に以下のような形で書く。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PostController extends Controller
{
    public function index()
    {
        //
    }
}

各コードの役割

namespace

namespace App\Http\Controllers;

namespace は、
この Controller の所属場所を表す記述。

Laravel では、
フォルダ構成と対応する形で namespace を設定することが多い。

例えば、

namespace App\Http\Controllers;

の場合、

app/Http/Controllers

に配置される Controller であることを表している。

namespace を使うことで、
同じ名前のクラスが存在しても、
「どのクラスなのか」を区別できる。

use Illuminate\Http\Request;

use Illuminate\Http\Request;

Request は、
フォーム送信データや URL パラメータなど、
ブラウザから送られてきたデータを扱うためのクラス。

Controller で入力値を取得する際によく使用する。

extends Controller

class PostController extends Controller
{
}

extends Controller は、
Laravel の Controller クラスを継承するための記述。

Laravel の Controller は、
基本的にこの形で作成する。

Artisan コマンドで Controller を作成した場合も、
Laravel が自動で extends Controller を付与する。

extends Controller を付けなくても、
単純な PHP クラスとして動作する場合はある。

ただし、
Laravel の Controller として利用する場合は、
基本的に extends Controller を付けて作成する。

public function index()

public function index()
{
}

function は、
Controller 内で実行するメソッド(処理)を書くための記述。

一覧表示処理、
登録処理、
更新処理など、
実装したい処理をメソッド内へ記述する。

index はメソッド名。

Laravel では、
これらのメソッド名が慣習的によく使用される。

ただし、
必ずこれらの名前を使用する必要はなく、
メソッド名は自由に付けることもできる。

Route から呼び出された時に、
このメソッド内の処理が実行される。

Controller で DB を扱うには

Controller 内のメソッドで DB 操作を行いたい場合は、
Model を使用する。

Laravel では、
DB 操作は基本的に Model を通して行う。

Model は、
MVC の M(Model)にあたり、
Laravel では主に DB 操作を担当する。

DB 操作のコードは、
基本的に Model 側で扱う。

Controller は、
必要な Model を呼び出し、
データ取得や登録処理を実行する役割を持つ。

Controller 内に直接 SQL を書くことも可能。
ただし Laravel では、
Model を通して DB 操作を行うのが一般的。

例えば、

DB にある posts という名前のテーブルを扱う場合は、

Post

という Model を作成する。

Laravel では、
テーブル名を複数形、
Model 名を単数形(先頭は大文字)で命名すると、
自動で対応するテーブルへ紐付けされる。

例)テーブル名:posts / Model 名:Post

Controller から Model を呼び出す例

posts テーブルから、
Model を通してデータを取得する例。

テーブル名が posts なので、
Model 名は Post とする。

Post Model

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
}

詳細は割愛するが、
class Post extends Model により、
Laravel 標準の DB 操作機能を使えるようになる。

Controller

<?php

namespace App\Http\Controllers;

use App\Models\Post;

class PostController extends Controller
{
    public function index()
    {
        $posts = Post::all();

        return view('posts.index', compact('posts'));
    }
}

行ごとに分解して解説すると、

namespace App\Http\Controllers;

この Controller の所属場所を表す記述。

use App\Models\Post;

使用する Model を指定。
今回は Post Model を読み込んでいる。

class PostController extends Controller {}

Laravel の Controller 機能を使用するためのクラス定義。

基本的に Laravel の Controller は、
この形で作成する。

public function index()

index() というメソッドを定義している。

Route から呼び出された時に、
このメソッド内の処理が実行される。

$posts = Post::all();

Post Model を使用して、
posts テーブル内の全データを取得している。

::all()
は、
「テーブル内の全データを取得する」
Laravel 標準のメソッド。

SQL のイメージで言うと、
下記に近い処理。

SELECT * FROM posts;

Post 内に

class Post extends Model

があるため、
Laravel 標準の DB 操作機能である「 ::all() 」を使用できる。

取得したデータは、
$posts に代入される。

あとは、必要に応じてこのデータを処理し、
表示担当の View にデータを渡す。

Laravel の標準メソッド

Laravel には、
::all() 以外にも様々な DB 操作用メソッドが用意されている。

Controller の基本メソッド

Laravel では、
Controller のメソッド名として、
慣習的によく使われる名前がある。

例えば、

実際には、
下記のように Controller 内へメソッドを書いていく。

public function index()
{
}

public function show()
{
}

public function store()
{
}

Route から呼び出された時に、
それぞれのメソッド内の処理が実行される。

なお、
これらの名前を必ず使う必要はない。

ただし Laravel では、
CRUD 処理を作る時に、
この命名ルールが慣習的によく使われる。

Resource Controller

Laravel では、
これらのメソッドをまとめて作成できる
Resource Controller という仕組みも用意されている。

Resource Controller は、
CRUD 用のメソッドをまとめて自動作成する Controller。

作成コマンド

php artisan make:controller PostController --resource

このコマンドを実行すると、
以下のメソッドが最初から作成された Controller が生成される。

通常の Controller では、
これらのメソッドを自分で作成する。

一方、
Resource Controller を使用すると、
CRUD 用の基本メソッドが予め用意された状態で作成される。

Route の例

Route::resource('posts', PostController::class);

これにより、
CRUD 用の Route もまとめて登録される。

View へデータを渡す

View は、
Laravel で画面表示を担当する役割。

Controller で取得・処理したデータを、
View 側へ渡して表示する。

例えば、
Controller 側で下記のように記述すると、

return view('posts.index', [
    'message' => 'Hello Laravel'
]);

posts.index という View に対して、
message というデータを渡すことができる。

View 側では、
下記のように記述してデータを表示できる。

{{ $message }}

この場合、

Hello Laravel

が表示される。

このように、
Laravel の View では、

{{ }}

を使ってデータを表示する。

これは Blade と呼ばれる Laravel のテンプレート機能。

Controller から View を指定する

Controller 側では、

return view('posts.index');

のように、
表示する View を指定する必要がある。

この場合、
下記の Blade ファイルを表示する。

resources/views/posts/index.blade.php

View 側で Controller を指定する必要はある?

基本的に、
View 側で Controller を指定する必要はない。

Laravel では、

Route
URL に対応する Controller を決定

Controller
必要な処理を実行

Model
DB操作が必要な場合に利用する

View
ブラウザへ表示する HTML を生成

の流れで処理されるため、
Controller 側から View を呼び出す。

View 側は、
渡されたデータを表示する役割だけを担当する。

配列データを渡す例

Controller 側で配列を渡すこともできる。

public function index()
{
    $fruits = ['apple', 'orange', 'banana'];

    return view('posts.index', compact('fruits'));
}

View 側では、

{{ $fruits[0] }}

のように使用できる。

この場合、

apple

が表示される。

その他のデータも渡せる

Laravel の View には、
様々なデータを渡せる。

Controller 側で変数に入れたデータを、
View 側へ渡して表示する、
というのが基本的な流れ。

Blade の {{ }} は自動エスケープされる

Laravel の

{{ }}

は、
HTML を自動でエスケープする。

そのため、

<script>

のような危険なコードが入力されていても、
script として実行されず、

<script>alert('危険')</script>

のように、
文字列として表示される。

これは XSS(クロスサイトスクリプティング)対策のため。

まとめ

Controller は、
Laravel で処理の流れを担当する役割。

Route から呼び出され、
必要に応じて Model を使って DB 操作を行い、
最終的に View へデータを渡す。

最初は Controller 内に処理を書いて問題ない。

ただし、
何でも Controller に書きすぎると、
コードが複雑になり、
管理しづらくなる。

Laravel では、
処理内容に応じて、

などへ処理を分割することも多い。

まずは、
「Route → Controller → Model → View」
の基本的な流れを理解することが重要。