コントローラーの使い方

コントローラーは、ユーザーからの操作に応じて処理を行い、
ビューに値を渡すためのものである。

「/app/Http/Controllers/」ディレクトリに配置する。

コントローラーの規約

コントローラー名は、アッパーキャメル記法で記述し、
後ろのほうには「Controller」を付与した形となる。
ファイル名とクラス名を同一に、コントローラー名とする。

たとえば「index」という名称のコントローラーを作る場合、
ファイル名は「IndexController.php」、その中のクラス名は「IndexController」とする。
コントローラーの基本形

?<php

namespace App\Http\Controllers;
 
use App\Http\Controllers\Controller;

class IndexController extends Controller{
    
    public function getIndex(){
        
        $text = 'いらっしゃいませ';
        
        return view('index',['text' => $text]);
    }
    
}

「Controller.php」を名前空間とuseで呼び出し、その中の「Controller」クラスを継承している。
また、「Controller」クラスは「BaseController」を継承している。

ユーザーのブラウザアクセスに応じて、実行されるメソッドが決まるが、
「/routes/web.php」ファイルを基に決定される。

ビューの決定および値の渡し方

「view()」で生成したオブジェクトを戻り値にすることで、ビューを表示する事ができる。

「view()」には、文字列でビューのブレード名を指定する事で決定する。
「/resources/views/」ディレクトリに入ったものが対象で、「.blade.php」を省いた名称で指定する。
また、ドット区切りでディレクトリの中に入ったブレードファイルを指定する事も可能。

値を渡すには、「view()」に第2引数を指定し、そこに連想配列で入力する。
プロパティ名がそのまま、ビュー上で使える変数名になり、
各配列に入った中身が、そのままビューに渡される。

リダイレクト

リダイレクトを行うには、「redirect()」メソッドを戻り値に使うとよい。

「/home」にリダイレクトする場合である。

return redirect('/home');

また、コントローラーのメソッドを指定して、リダイレクトする事も可能である。

return redirect()->action('HomeController@getIndex');

「Home」コントローラーの「getIndex」メソッドを実行する場合である。

「redirect()」メソッドに引数を何も入れなければ、
次のメソッドを呼び出す事が可能になる。
その「action()」メソッドの中に、実行したいコントローラー名とメソッドを記述する。
コントローラーの記述方法は、
ルーティングファイル「/routes/web.php」と同じである。

また、パラメーターを指定したい場合は、
「action()」メソッドの第2引数に連想配列で指定する。

return redirect()->action('HomeController@getIndex',['number' => 24]);

パラメーターは、ユーザー側のブラウザのURLにも反映される。
ルーティングファイルでディレクトリパスに値の挿入を設定している場合は、
ディレクトリパスに挿入され、
値の挿入を設定していない場合は、URLパラメーターとしてリダイレクトされる。

どのみちリダイレクト先に渡す値は、ブラウザのURLに出るため、
出したくない場合は、セッションなどで値を渡すとよい。

セッション

セッションとは、つまりはページ遷移などを行っても、
裏方で情報のやりとりが行える機能である。
出力しない限りはユーザー側には見えないため、
内部で安全に情報のやりとりが行える。

セッションの挿入

session(['fruit' => 'みかん']);
session()->put('vegetable','白菜');

「session()」メソッドに対して、連想配列を入れるか、
「session()」メソッドの引数を入れずに、「put()」メソッドを呼び出して、
第1引数に添え字を、第2引数に中身を挿入する。

どちらも動きは同じなので、見やすさで判断するとよい。

プロパティはドットで区切ると、セッション内で層を作って代入される。
つまり、多次元配列のように使う事も可能である。

プロパティは既存のセッションと同じであれば上書きを、
既存セッションにないプロパティ名の場合は、新規作成される。

セッションの取り出し

session('fruit');
session()->get('vegetable');
「session()」メソッドのみで行う場合は、プロパティを文字列で指定。
「get()」メソッドを呼び出す事でも、取得できる。

挿入時と同様、どちらも同じ動きをするが、
コードを見て直観的に挿入か取り出しかを理解しやすくしたい場合、
「put()」メソッドや「get()」メソッドを使うとよい。

こちらもドット区切りで、層単位で要素を取得できる。

セッションが見つからない場合は「null」を返す。
第2引数を指定すると、セッションが見つからなかった場合の基本値を指定できる。
session('fruit','くだもの');
session()->get('vegetable','野菜');

全セッションの取り出し

session()->all();

「all()」メソッドを呼び出す事で、全セッションを取り出す事ができる。
連想配列で返ってくるため、一度「print_r()」で確認してみるとよい。

セッションの削除

セッションを削除するには、「forget()」メソッドを使えば削除できる。
session()->forget('fruit');
引数には文字列を入れ、その文字列に対するセッションを削除する。
セッションが見つからなかった場合には、とくにエラーは出ない。

ドット区切りで層単位のセッションも削除できる。
上の層を指定すれば、その下の層もまとめて削除される。

全セッションの削除を行う場合は、「flush()」メソッドを実行する。

session()->flush(); 

ただし、このメソッドはログイン中のユーザーもログアウトさせてしまう
セッションの中に含まれる、「login_web_(ランダムな文字列)」も
削除されてしまうためである。
逆に、これによりログアウト状態にしても、
データベーステーブルの「remember_token」は更新されないため、
ログアウト処理には「Auth::logout()」を使ったほうがよい。