PHPフレームワーク Laravel入門
ルーティング
ルーティングとは?
通常 :index.htmlというものがappフォルダ以下に存在していれば、xx/app/index.htmlとなり画面表示される
Laravel :特定のアドレスにアクセスすると、処理が走って、画面表示などを行う。(アドレスと処理を関連づけるものがルーティング)
ファイルの概要
- .env -> 動作環境の設定ファイル
- artisan ->artisanコマンド関連
- Composer.json -> composerの利用に関するもの
- Package.json -> npmで利用するもの
- Phpunit -> テストプログラムで使用
- Server.php -> サーバー起動時のプログラム
パラメータの’?'
なし:パラメータつけないとアクセスできない
Route::get('/home/{mes}',function($mes){ // })
あり:パラメータは任意
Route::get('/home/{mes?}',function($mes){ // })
単機能のなコントローラー(推奨)
1,コントローラーの作成
App\Http\Controllers以下に配置
php artisan make:controller HelloController
2.コントローラーのアクション記述
public function index(){ return view('hello'); }
3,viewの作成 Viewフォルダ以下に’hello.blade.php’作成
//省略 <body> hello </body>
4,ルーティング設定
コントローラー名@アクション名
Route::get('/hello','HelloController@index')
シングルなコントローラの特有表現
__invoke
を使用することで@
でアクションを記述する必要はない
controller.php
public function __invoke(){ return view('hello'); }
web.php
Route::get('hello','Controller');
※__invoke
付きのコントローラを作成するコマンド
php artisan make:controller Controller --invokable
マルチなコントローラー
1つのコントローラで複数の画面表示を行う。だが、あまり推奨はされてないらしい。
シンプルなコードがいいので。。
controller.php
public function index(){ return view('hello'); } public function index2(){ return view('hello2'); }
PHPテンプレート
レンダリングとは?
Laravelではビュー作成時に変数などを含めることができるテンプレート(本書ではblade)を使用することができる。
レンダリングとは、テンプレートに埋め込まれた変数などに情報を適応させるプロセスのこと。
参照下記のように
@if (Route::has('register')) <a href="{{ route('register') }}">Register</a> @endif
ビューファイルをフォルダに細分化して、シンプルに保つ
- コントローラ無し
- コントローラ有り
コントローラ無し
web.php
Route::get('templete',function(){ //view(フォルダ名.ファイル名) return view('home.templete'); });
コントローラ有り
web.php
Route::get('templete’,’TempleteController’);
controller.php
//省略 public function __invoke(){ return view('home.templete'); }
データの受け渡し
コントローラに値を用意しておいて、ビューにはめ込む
DataController.php
public function __invoke(){ $data = ['mes' => 'データを受け渡しました']; return view('data',$data); }
※ 連想配列('mes' => 'データを受け渡しました)で、viewヘルパー関数の引数に渡したいデータを与える
web.php
Route::get('data','DataController');
xx.blade.php
<p>{{$mes}}</p>
データの受け渡し①(URLのパラメータによってビュー変更)
DataController.php
public function __invoke($id = 1){ $data = [ 'mes' => 'データを受け渡しました’, ‘id’ => $id ]; return view('data',$data); }
web.php
Route::get(‘data/{id}','DataController');
xx.blade.php
<p>{{$mes}}</p> <p>{{$id}}</p>
※ {{$mes}}
= <?php echo $mes; ?>
こうすることでdata/〇〇
の〇〇の部分の値でビューの内容が変更する。
僕のミス($はいらない。連想配列のkeyを参照する)
//OK Route::get(‘data/{id}','DataController'); //NG Route::get(‘data/{$id}','DataController');
###データの受け渡し②(web.phpに{id}を入れずに変更)
DataController.php
public function __invoke(Request $request){ $data = [ 'mes' => 'データを受け渡しました’, ‘id’ => $request->$id ]; return view('data',$data); }
web.php
Route::get(‘data','DataController');
{id}がいらなくなる
※URL?id=3
でアクセスできる
フォームを利用する
xx.blade.php
//省略 <p>{{$mes}}</p> <form method="POST" action="/hello"> // 1 {{ csrf_field()}} <input type="text" name="msg"> <input type="submit"> </form>
1 : {{ csrf_field()}}
は掲示板や問い合わせフォームなどを処理するWebアプリケーションが、本来拒否すべき他サイトからのリクエストを受信し処理してしまうのを防ぐための記述。
FormController.php(コントローラに処理を2つ用意)
public function index(){ $data = [ mes:'フォームです' ]; return view('index',$data); } public function post(Request $request){ // 1 $mes => $request->msg; $data = [ mes:'あなたの名前は'.$mes.'です' ]; return view('index',$data); }
1 : requestインスタンスからnameのプロパティ
(name="msg")のフォームの値を取り出している
web.php
Route::get('hello','FormController@index'); Route::post('hello','FormController@post');
ミドルウェア
ミドルウェアとは?
アプリケーションにやってきたHTTPリクエストをフィルタリングしてくれる
処理のタイミング
基本的にコントローラの前後
ミドルウェア作成
php artisan make:middleware OldMiddleware
コードリーディング
public function handle($request, Closure $next) { // 1 if ($request->input('age') <= 200) { return redirect('home'); } // 2 return $next($request); }
1 : 200以下ならフィルターをかけてhomeへリダイレクト
2 : 200以上ならフィルター通過で通常通りコントローラ処理を行う($nextはコントローラへ行くがよい!って言ってくれるやつ)
ミドルウェアの実行
->
をルーティングの後につけてあげれば、この処理の時に挟まって動いてくれる
Route::get(//処理)->middleware(OldMiddleware::class);
バリデーション
バリデーションとは?
入力項目に意図していたものではない値が入った時困るよね。だから制限かけようってやつ。
これはコントローラクラスの基底クラスにValidateRequests
という機能がある。本書によれば、コントローラで処理すればいいよって言ってる。
バリデーションの作成
フォームに正しい値が入れば通るシンプルなサンプル
条件
・ageは数字かつ0から150歳まで
・emailは@という文字の有無
流れ
・テンプレの作成(テキストボックスなど)
・ルーティング設定
・コントローラでのバリデーション処理(←ここ備忘録)
controller.php
public function post(Request $request){ $validations = [ // 1 ’name’=>required, ’age’=>numeric|between0,150, ’email’=>’email' ]; // 2 $this->validate($request $validation); return view(‘validate’,//無事通った的な処理あってもなくてもいい), }
1
- required
- 指定フィールドが存在で、値が空でなければ通す。
- numeric | between0,150
- 数字で、0~150までならとおす
- email
- @がついてたら通す
2 :
$this
で基底クラスを参照して、基底クラスに存在する$validate使用している- ($request $validation) => (リクエストの値, 制限)で制限にかかってないか確認する