8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-01-20

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

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

8
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?