Laravel:Controllerの同じコードを使いまわしたい
Laravel:Controllerの同じコードを使いまわしたい
前回の記事でViewの使いまわしについて記載しました。
今回はコントローラーの使いまわしです。
Viewと同じく、PHPベタ打ちではrequire_onceで読み込ませていましたがフレームワークでは使われないようです。
例は前回記事と同様にボタンコントロールとします。
やりたい動作
- roleのレベルに合わせてボタンの表示をコントロール
- role値と動作レベルの相関テーブルを作り、Controller名毎にボタンを表示させるrole値が可変する
つまりは、変更/追加/削除をroleごとに付けたり消したりしたい。でも同じコードを張り付けてこれを実現したい。と言う事です。
キーワードは共通関数
こうしたい!と思っても言葉を知らないと調べる事が出来ません。
私のやりたいことは【共通関数】や【汎用関数】と呼ばれるそうです。
このワードに【ライブラリ】を追加すると求めていた情報がばっちり手に入ります。
今回参考にさせて頂いたサイト様はこちら
下準備の手順
前回記事のViewとは異なり下準備が必須です。
- Composer.jsonに登録する
- composer dump-autoloadを実行
- config/app.phpにエイリアスとして追加
- 利用したいコントローラでuseする
これをやってあげないとエラーが出てくるので要注意です。
Composer.jsonに登録する
composer.jsonはProjectフォルダの直下にあります。
.envなどと同じ並びです。
今回はappにLibraryフォルダを作成し、この中に共通関数を格納していこうと思っています。
その為、composer.json のautoloadに下記コードを追加します。
1 2 3 4 |
"autoload": { "classmap": [ "app/Library" ], |
composer dump-autoloadを実行
次に、composerに行った変更を認識させます。
これはSSHで下のコードを実行すればOKです。
1 |
composer dump-autoload |
config/app.phpにエイリアスとして追加
Project名/config/app.php のaliasesに共通関数の登録を行います。
具体的には下記内容を記載します。
1 2 3 4 5 |
'aliases' => [ ..... /* originals */ 'BaseClass' => app\Library\BaseClas::class, ], |
今回私は参考にさせて頂いたサイトにならい、class名をBaseClasとしました。
当然自由に設定してOKですが、共通関数と同じクラス名である必要があります。
利用したいコントローラでuseする
あとはコードを書いて、利用するコントローラーで use すればOK。
1 |
use App\Library\BaseClass; |
実際に書いたコードを記載します。
■共通関数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
<?php namespace app\Library; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; class BaseClass { public static function terminaltype($request){ //端末判断 $user_agent = $request->header('User-Agent'); if ((strpos($user_agent, 'iPhone') !== false) || (strpos($user_agent, 'iPod') !== false) || (strpos($user_agent, 'Android') !== false)) { $terminal ='mobile'; } else { $terminal = 'pc'; } return $terminal; } public static function roletype($name){ //ボタン操作 $role = DB::table('crudbuttons') ->join ('crudcontrollers','crudbuttons.crudoperation_id', '=', 'crudcontrollers.crudoperation_id') ->where('crudbuttons.onoff',1) ->where('crudcontrollers.onoff',1) ->where('crudbuttons.roletype_id',\Auth::user()->roletype_id) ->where('crudcontrollers.name',$name) ->select( 'crudcontrollers.name', 'crudbuttons.create', 'crudbuttons.update', 'crudbuttons.delete' ) ->get(); return $role; } } |
■コントローラー
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
<? phpnamespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use App\Library\BaseClass; class Hogehoge extends Controller { public function base_index(Request $request) { #Access端末確認 $terminal = BaseClass::terminaltype($request); #ボタンcontrol $role = BaseClass::roletype('base_index'); #ユーザーID取得 $user = \Auth::user()->id; return view('controlofbases/informations', compact ( 'user', 'role', 'terminal', 'units' ) ); } } |
まとめ
これで毎回@can や@if で場合分けする必要がなくなりました。
いやぁ~楽になった。
-
前の記事
Laravel:Viewの同じコードを切り出して使いまわす方法 2019.04.01
-
次の記事
Laravel:月末の日付取得が楽すぎる 2019.04.02
コメントを残す