Laravel:Controllerの同じコードを使いまわしたい

Laravel:Controllerの同じコードを使いまわしたい

前回の記事でViewの使いまわしについて記載しました。
今回はコントローラーの使いまわしです。
Viewと同じく、PHPベタ打ちではrequire_onceで読み込ませていましたがフレームワークでは使われないようです。

例は前回記事と同様にボタンコントロールとします。

やりたい動作

  1. roleのレベルに合わせてボタンの表示をコントロール
  2. role値と動作レベルの相関テーブルを作り、Controller名毎にボタンを表示させるrole値が可変する

つまりは、変更/追加/削除をroleごとに付けたり消したりしたい。でも同じコードを張り付けてこれを実現したい。と言う事です。

キーワードは共通関数

こうしたい!と思っても言葉を知らないと調べる事が出来ません。

私のやりたいことは【共通関数】や【汎用関数】と呼ばれるそうです。
このワードに【ライブラリ】を追加すると求めていた情報がばっちり手に入ります。

今回参考にさせて頂いたサイト様はこちら

下準備の手順

前回記事のViewとは異なり下準備が必須です。

  1. Composer.jsonに登録する
  2. composer dump-autoloadを実行
  3. config/app.phpにエイリアスとして追加
  4. 利用したいコントローラで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 で場合分けする必要がなくなりました。

いやぁ~楽になった。

\ 最新情報をチェック /

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください