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に下記コードを追加します。
"autoload": {
"classmap": [
"app/Library"
],
composer dump-autoloadを実行
次に、composerに行った変更を認識させます。
これはSSHで下のコードを実行すればOKです。
composer dump-autoload
config/app.phpにエイリアスとして追加
Project名/config/app.php のaliasesに共通関数の登録を行います。
具体的には下記内容を記載します。
'aliases' => [
.....
/* originals */
'BaseClass' => app\Library\BaseClas::class,
],
今回私は参考にさせて頂いたサイトにならい、class名をBaseClasとしました。
当然自由に設定してOKですが、共通関数と同じクラス名である必要があります。
利用したいコントローラでuseする
あとはコードを書いて、利用するコントローラーで use すればOK。
use App\Library\BaseClass;
実際に書いたコードを記載します。
■共通関数
<?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;
}
}
■コントローラー
<?
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 で場合分けする必要がなくなりました。
いやぁ~楽になった。

