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リクエストをフィルタリングしてくれる

処理のタイミング

基本的にコントローラの前後 f:id:makoo5:20190806095346p:plain

ミドルウェア作成

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という機能がある。本書によれば、コントローラで処理すればいいよって言ってる。

バリデーションの作成

フォームに正しい値が入れば通るシンプルなサンプル

f:id:makoo5:20190806095811p:plainf:id:makoo5:20190806095815p:plain

条件

・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) => (リクエストの値, 制限)で制限にかかってないか確認する

参考

readouble.com