Help us understand the problem. What is going on with this article?

【Laravel】コントローラーとは?作成や編集方法を実例で解説。

Laravelのコントローラーについて。実際にコントローラーを作成してブラウザに表示させることで理解を深める。

目次

  1. コントローラーとは?
  2. コントローラーの作成方法
  3. コントローラーの保存場所
  4. コントローラーの中身
  5. コントローラーの作成例
  6. コントローラー呼び出し時の注意点
  7. コントローラーでviewファイルを呼び出す


コントローラーとは?

Laravelのコントローラーでは、クラスを作成しメソッドを定義することができる。

ルーティングファイル(web.php)などにメソッドを記述していくとファイル長が膨大になってしまうため、コントローラーを使用することで、メソッドを利用しやすくなる。

コントローラーの作成方法

$ php artisan make:controller コントローラー名

コントローラー名は冒頭大文字のキャメル表記。

$ php artisan make:controller HelloController

Controller created successfully.


コントローラーの保存場所

artisanコマンドを実行すると、app/Http/Controllers内に新たにファイルが生成される。

image.png

image.png

専用のディレクトリの中に入れたい場合

コントローラー名の前にディレクトリ名を付ければOK。

例: php artisan make:controller Test/HelloController

image.png


コントローラーの中身

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    //
}

namespace App\Http\Controllers;
名前空間。

app/Http/Controllers配下にファイルがあるため、そのまま名前空間として指定。

名前空間をつけることで、同じメソッド名でも名前空間が異なればそれぞれ別のメソッドとして使うことができる。

use 名前空間
指定した名前空間をインポート。

use Illuminate\Http\Request;
LaravelのAPIである、名前空間Illuminate\Http\Requestをインポートしている。
これで、Request.phpに定義されているメソッドが使えるようになる。

▼Illuminate\Http\Requestの場所
vender > laravel > framework > src > Illuminate > Http > Request

Requestメソッド一覧



class HelloController extends Controller
定義したクラス名HelloControllerに、親クラスとして、Controllerクラスを継承している。

Controllerクラスには、validate()middleware()など便利なメソッドが定義されている。

{ // }
ここに、メソッドを記述していく。


コントローラーの作成例

step1. メソッドを定義

//の中に以下を追記

public function message(){
        $msg = 'こんにちは';
        return $msg;
    }

messageメソッドを呼び出すと、「こんにちは」を返す。

HelloController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class HelloController extends Controller
{
    public function message(){
        $msg = 'こんにちは';
        return $msg;
    }
}


step2. ルーティングで呼び出す

web.php
Route::get('msg', 'App\Http\Controllers\HelloController@message');

URIがmsgにアクセスしたら、HelloControllerのmessageメソッドを実行する。

以上で完了。



▼ブラウザの表示

image.png


コントローラー指定時の注意点

Laravel7までは、App\Http\Controllers\が省略できたが、Laravel8からは省略するとエラーが表示されるようになった。

対策として完全な名前空間で指定した。

他にも、Laravel7の環境と同じにする方法や、アクション構文を使用する方法がある。


Laravel7と同じ環境にする

以下ファイルのコメントアウトを解除する。
app > Providers > RouteServiceProvider.php

image.png

解除するコメントアウト
//protected $namespace = 'App\\Http\\Controllers';
RouteServiceProvider.php
    protected $namespace = 'App\\Http\\Controllers';  //コメントアウトを解除

    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));
        });
    }



ルーティングのコントローラー名を簡略化して完了。

web.php
Route::get('msg', 'HelloController@message');


アクション構文を使用する

ルーティングファイルの冒頭で、useを使ってHelloControllerクラスをインポートする。

use App\Http\Controllers\HelloController;

getメソッドの第二引数で以下を指定。
[コントローラー名::class, 'メソッド名']

web.php
use Illuminate\Support\Facades\Route;  //デフォルトで記述
use App\Http\Controllers\HelloController; //追記

Route::get('msg', [HelloController::class, 'message']);


コントローラーでviewファイルを呼び出す

コントローラーのメソッドが呼び出されると、viewファイルを描画するプログラムを作成する。

step1. コントローラーの作成

HelloController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;

class HelloController extends Controller
{
    public function message(){
        $msg = 'こんにちは';
        $title = 'this is title!';

        return view('child', ['hello'=>$msg, 'title'=>$title]);
    }
}

HelloControllerのmessageメソッドを実行すると、child.blade.phpを表示する。

その際、helloという変数で$msgを、titleという変数で$titleを渡す。


step2. viewファイルの作成

ここでは、child.blade.phpと、レイアウトとなるapp.blade.phpを作成する。

image.png

app.blade.php
<html>
    <head>
        <title>@yield('title')</title>
    </head>
    <body>
        <div class="container">
            @yield('content')
        </div>
    </body>
</html>

親ビューとなるapp.blade.phpを作成。
@yieldで子ビューのセクションを呼び出している。


child.blade.php
@extends('layouts.app')

@section('title', $title)

@section('content')
    <p>{{ $hello }}</p>
@stop

@extendsで親ビューを継承。
@sectionでコントローラーから渡された変数を使用。


step3. ルーティングの作成

パス「xxx」にアクセスすると、HelloControllerのmessageメソッドを実行するようにルーティングファイルに記述。

web.php
Route::get('xxx', 'HelloController@message');

以上で完了。

>section, yield, extendの詳細はこちらを参照



▼ブラウザの表示

image.png

ページタイトルと、ページの内容に、コントローラーで定義した変数が表示されている。

yuta-38
メモとして活用してます
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away