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'
]
參考:
發佈留言