Laravelのコントローラーについて。実際にコントローラーを作成してブラウザに表示させることで理解を深める。
##目次
##コントローラーとは? Laravelのコントローラーでは、クラスを作成しメソッドを定義することができる。
ルーティングファイル(web.php)などにメソッドを記述していくとファイル長が膨大になってしまうため、コントローラーを使用することで、メソッドを利用しやすくなる。
##コントローラーの作成方法
・$ php artisan make:controller コントローラー名
コントローラー名は冒頭大文字のキャメル表記。
$ php artisan make:controller HelloController
Controller created successfully.
##コントローラーの保存場所 artisanコマンドを実行すると、app/Http/Controllers内に新たにファイルが生成される。
↓
##専用のディレクトリの中に入れたい場合
コントローラー名の前にディレクトリ名を付ければOK。
例: php artisan make:controller Test/HelloController
##コントローラーの中身
<?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
・`class HelloController extends Controller` 定義したクラス名HelloControllerに、親クラスとして、**Controllerクラスを継承**している。
Controllerクラスには、validate()
やmiddleware()
など便利なメソッドが定義されている。
・{ // }
ここに、メソッドを記述していく。
##コントローラーの作成例 ###step1. メソッドを定義 //の中に以下を追記
public function message(){
$msg = 'こんにちは';
return $msg;
}
messageメソッドを呼び出すと、「こんにちは」を返す。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HelloController extends Controller
{
public function message(){
$msg = 'こんにちは';
return $msg;
}
}
###step2. ルーティングで呼び出す
Route::get('msg', 'App\Http\Controllers\HelloController@message');
URIがmsgにアクセスしたら、HelloControllerのmessageメソッドを実行する。
以上で完了。
**▼ブラウザの表示**
##コントローラー指定時の注意点 Laravel7までは、`App\Http\Controllers\`が省略できたが、Laravel8からは省略するとエラーが表示されるようになった。
対策として完全な名前空間で指定した。
他にも、Laravel7の環境と同じにする方法や、アクション構文を使用する方法がある。
###Laravel7と同じ環境にする 以下ファイルのコメントアウトを解除する。 `app > Providers > RouteServiceProvider.php`
//protected $namespace = 'App\\Http\\Controllers';
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'));
});
}
ルーティングのコントローラー名を簡略化して完了。
Route::get('msg', 'HelloController@message');
##アクション構文を使用する ルーティングファイルの冒頭で、`use`を使ってHelloControllerクラスをインポートする。
・use App\Http\Controllers\HelloController;
getメソッドの第二引数で以下を指定。
・[コントローラー名::class, 'メソッド名']
use Illuminate\Support\Facades\Route; //デフォルトで記述
use App\Http\Controllers\HelloController; //追記
Route::get('msg', [HelloController::class, 'message']);
##コントローラーでviewファイルを呼び出す コントローラーのメソッドが呼び出されると、viewファイルを描画するプログラムを作成する。
###step1. コントローラーの作成
<?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を作成する。
<html>
<head>
<title>@yield('title')</title>
</head>
<body>
<div class="container">
@yield('content')
</div>
</body>
</html>
親ビューとなるapp.blade.phpを作成。
@yield
で子ビューのセクションを呼び出している。
@extends('layouts.app')
@section('title', $title)
@section('content')
<p>{{ $hello }}</p>
@stop
@extends
で親ビューを継承。
@section
でコントローラーから渡された変数を使用。
##step3. ルーティングの作成 パス「xxx」にアクセスすると、HelloControllerのmessageメソッドを実行するようにルーティングファイルに記述。
Route::get('xxx', 'HelloController@message');
以上で完了。
>section, yield, extendの詳細はこちらを参照
**▼ブラウザの表示**
ページタイトルと、ページの内容に、コントローラーで定義した変数が表示されている。