Laravel 客製屬於自己的函數(functions) & 類別 (Classes)

作為程式設計師,都需要建立某些輔助函數來消除重複程式碼並加快系統的開發速度。輔助函數(functions)通常是用來防止重複程式碼。Laravel 有大量內建的輔助函數可以使用,參考: https://laravel.com/docs/master/helpers,當它有所不足時,則需要創建自定義輔助函數來滿足系統開發的要求。

客製簡單的函數(functions)步驟如下:

step01: 建立一個簡單的函數檔案

在 app/Helpers 目錄下,新增一個檔案: Logger.php

<?php

use Illuminate\Support\Facades\Log;

  /**
   * debug
   * 顯示偵錯的檔案及那一行
   * @param  mixed $msg
   * @param  mixed $file
   * @param  mixed $line
   * @return void
   */
  if (!function_exists('debug')) {
    function debug($msg, $file, $line)
    {
      Log::debug(sprintf("<FileName>%s <Line> line:%d <DebugMessage> %s", $file, $line, $msg));
    }
  }

Step02: 將此檔案加入 composer.json

"autoload": {
	"psr-4": {
		"App\\": "app/",
		"Database\\Factories\\": "database/factories/",
		"Database\\Seeders\\": "database/seeders/"
	},
	"files": [
		"app/Helpers/Logger.php"
	]
},

Step03: 執行指令 dump-autoload 載入helper檔案

PS W:\xampp\htdocs\twingo> composer dump-autoload
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi

   INFO  Discovering packages.  

  laravel/sail ................................. DONE
  laravel/sanctum .............................. DONE
  laravel/tinker ............................... DONE
  laravel/ui ................................... DONE
  nesbot/carbon ................................ DONE
  nunomaduro/collision ......................... DONE
  nunomaduro/termwind .......................... DONE

Generated optimized autoload files containing 5918 classes

Step04: 使用及驗證

    public function login(Request $request): JsonResponse
    {
        debug($request,__FILE__,__LINE__);
        if (Auth::attempt(['email' => $request->email, 'password' => $request->password])) {
            $user = Auth::user();
            $result['id'] = $user->id;
            $result['token'] =  $user->createToken($request->email)->plainTextToken;
            $result['name'] =  $user->name;

            return $this->sendResponse($result, 'User login successfully.');
        } else {
            return $this->sendError('Unauthorised.', ['error' => 'Unauthorised']);
        }
    }

這樣在 storage\logs 目錄下的 lavavel.log 裡就可以看到這個函數: debug 所產出的資料了。

使用這種方式,若同時參與專案開發的人員,有部份的人都以此函數: debug($msg, $file, $line) 那就會大亂了。為了預防這個問題,可以採取下面另一個方式: 類別 (Classes) with namespace。

客製類別 (Classes) with namespace 步驟如下:

Step01: 使用 php artisan 指令建立類別 (Classes)

使用 php artisan 指令,產生類別 (Classes)檔案:Tool.php

PS W:\xampp\htdocs\twingo> php artisan make:class Helpers/Tool

   INFO  Class [W:\xampp\htdocs\twingo\app\Helpers\Tool.php] created successfully.   

Laravel 會自動建立 類別 (Classes) 程式碼

<?php

namespace App\Helpers;

class Tool
{
    /**
     * Create a new class instance.
     */
    public function __construct()
    {
        //
    }
}

加入 debug 的函數如下

<?php

namespace App\Helpers;

use Illuminate\Support\Facades\Log;
class Tool
{
    /**
     * Create a new class instance.
     */
    public function __construct()
    {
        //
    }
    /**
     * debug
     * 顯示偵錯的檔案及那一行
     * @param  mixed $msg
     * @param  mixed $file
     * @param  mixed $line
     * @return void
     */
    public static function debug($msg, $file, $line)
    {
        Log::debug(sprintf("<FileName>%s <Line> line:%d <DebugMessage> %s", $file, $line, $msg));
    }
}

放入認證的檔案中

use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use App\Helpers\Tool;
class AuthController extends BaseController
{
    /**
     * api: login
     *
     * @return \Illuminate\Http\Response
     */
    public function login(Request $request): JsonResponse
    {
        Tool::debug($request,__FILE__,__LINE__);
        if (Auth::attempt(['email' => $request->email, 'password' => $request->password])) {
            $user = Auth::user();
            $result['id'] = $user->id;
            $result['token'] =  $user->createToken($request->email)->plainTextToken;
            $result['name'] =  $user->name;

            return $this->sendResponse($result, 'User login successfully.');
        } else {
            return $this->sendError('Unauthorised.', ['error' => 'Unauthorised']);
        }
    }
}

不需執行指令:  composer dump-autoload ,因為 psr-4 autoload 會自動執行,這樣就可以運作了。

step02: 使用 aliases

若程式中要使用別名(alias)引入程式,如下方的第4行

use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use App\Helpers\Tool;

要改成下方第4行的寫法

use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Tool;

則必需要在 config\app.php 增加 ‘aliases’ 的設定如下

'aliases' => [
	'Tool' => 'App\Helpers\Tool'
]

參考:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *