【PHP】Laravelでコントローラとビューを連結させてページを追加する方法

2023.09.16

タイトルの通り、Laravelでコントローラとビューの部分を繋げて、http://localhost/testというページを作っていく。

大事そうな箇所だったので、フローを自分用のメモとして残しておくとにした。

DB接続は行わないので、MVCのモデル部分は触れずにいく。

コントローラ「TestController.php」作成

まずはコマンドでコントローラファイルを作っていく。

ファイル名はお約束のアッパーキャメルケース(区切り大文字)で、下記ファイル追加コマンドをうつ。

sail artisan make:controller TestController

するとapp/Http/controllers/ディレクトリの中に「TestController.php」が作成される。

TestController.phpの中にメソッドを定義

上記により自動で作成されたファイルの中には、既にクラスが定義されているので、そこにメソッドを加えていく。

<?php
namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TestController extends Controller
{
    //この部分を追加
    public function test() {
        return view('test');
    }
}

testという名前のメソッドを定義し、さらに view(‘test’) の部分でどのファイルをビューとして表示するのかを指定している。

ここでのreturnは呼び出し元からの値を受け取っているわけではなく、下記のように解釈できる。

  • ①コントローラーにてreturn view('test');と記述
  • ②するとそのtest.blade.phpファイル(次に紹介)がPHPとして解釈・実行される
  • ③生成されるHTMLが「結果」としてクライアント(ブラウザ)に返却される

test.blade.phpを追加

実際に画面に表示するには、コントローラ→ビューにデータを繋ぐ必要がある。

resource/view/のディレクトリにtest.blade.phpを追加するが、中身はなんでもオッケーだ。

テストだよ

ルート設定

上記だけでは動かないので、最後にルート設定を行う。

これはユーザーからのリクエスト(今回はhttp://localhost/testの表示)に対して、どのコントローラのどのメソッドで処理を行うかを割り当てるために使う。

route/web.php の中に、先ほど作成したTestController.phpの内容を下記のように割り当てていく。

use App\Http\Controllers\TestController;
//~~~以下省略

use App\Http\Controllers\TestController;
Route::get('test', [TestController::class, 'test'])
            ->name('test');

これにより先ほどコントローラである TestController.php の中で書いた return view('test'); によって、test.blade.phpファイルの中に書いた内容がHTMLとしてクライアントに返されるわけだ。

ちなみに、ルート設定は下記のように覚えておこう。

Route::HTTPメソッド('URL', [コントローラー::class,''メソッド])
->name('ルート名');

これに加えURLにパラメータを含みたい場合は、 Route::get(‘test/{paramname}’); とすればオッケーだ。

これで一通りの設定は終わったので「http://localhost/test」を叩けば、test.blade.phpで書いた「テストだよ」という文言が表示されるはずだ。

プロジェクト内のルートを一覧で表示

Laravelで作成したプロジェクト内にあるルートは、コマンド一つで可視化することができる。

sail artisan route:list

上記を打つと、「HTTPメソッド、ドメイン以下のURL、ルート名、コントローラー名、メソッド名」が書かれた一覧が表示される。

テンプレート内でリンク指定

Laravelのテンプレートエンジンである「Blade」を使っているので、Bladeテンプレート内のHTMLコードにPHPの変数や関数の結果を出力することが可能だ。

例えば、 ->name(‘ルート名’); で指定した名前はリンクとしてHTMLコードの中にも入れることができる。

<a href="{{ route('test') }}" class=~~~

//Laravelトップページの「welcome.blade.php」に記載

このほかにもディレクティブといって、 @if での条件分岐やログイン判定の @auth、@php でphpの構文をhtmlタグの中に挿入することもできる。

変数名を二重括弧で括ることで、従来のhtmlspecialchar()関数と同じくエスケープ処理が可能となっている。セキュリティの観点から、これはマストと覚えておく(クロスサイトスクリプティング攻撃のリスクを抑えるため)。

また、エスケープせずに変数を反映させるときは、下記を行う。

{!! $hemsu !!}

管理者や開発関係者だけが入力、表示する際に使用することができるが、使いどころは少なそうだ。

PIC UP