雖然 Composer 與 Packagist 提供豐富套件生態,但專案仍常需整合非 Compliance 套件、內部私有類庫或專案專用工具類。本文詳細介紹 Laravel 整合自訂類庫的三種標準方式,涵蓋簡單類別、輔助函數、複雜套件結構。
app/libraries/class/Message.php<?php
// app/libraries/class/Message.php
class Message {
public static function display() {
return 'Hello from custom library!';
}
}
app/start/global.php(Laravel 4)或 composer.json(Laravel 5+)// Laravel 4: app/start/global.php
ClassLoader::addDirectories([
app_path().'/commands',
app_path().'/controllers',
app_path().'/models',
app_path().'/database/seeds',
app_path().'/libraries/class', // 新增此行
]);
// Laravel 5+: composer.json
"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/models",
"app/database/migrations",
"app/database/seeds",
"app/tests/TestCase.php",
"app/libraries/class" // 新增此行
]
}
composer dump-autoload
Message::display(); // 任意處直接呼叫
在 app/ 建立 queues/ 目錄,同樣加入 classmap,即可直接實例化佇列處理類。
v($var) 替代 var_dump())app/libraries/functions/helpers.php<?php
// app/libraries/functions/helpers.php
function v($msg) {
var_dump($msg);
}
function dd($data) {
echo '<pre>';
var_dump($data);
echo '</pre>';
die;
}
// composer.json
"autoload": {
"classmap": [...],
"files": [
"app/libraries/functions/helpers.php" // 關鍵:files 區塊
]
}
composer dump-autoload
// 方案 A: app/start/global.php 末尾
require app_path().'/libraries/functions/helpers.php';
// 方案 B: 透過 Filter 延遲載入
App::before(function ($request) {
require "{$GLOBALS['app']['path.base']}/app/libraries/functions/helpers.php";
});
v('hello world'); // 任意處直接呼叫
dd($user->toArray());
app/libraries/
└── MyApp/
└── Search/
├── Search.php // 命名空間 MyApp\Search
├── SearchFacade.php
└── SearchServiceProvider.php
<?php
// app/libraries/MyApp/Search/Search.php
namespace MyApp\Search;
class Search {
public function query($keywords) {
// 搜尋邏輯
return "搜尋結果: {$keywords}";
}
}
"autoload": {
"classmap": [
"app/commands",
"app/controllers",
"app/models",
"app/libraries", // 保留 classmap 掃描
"app/database/migrations",
"app/database/seeds",
"app/tests/TestCase.php"
],
"psr-4": {
"MyApp\\": "app/libraries" // 關鍵:PSR-4 對應
}
}
composer dump-autoload
// 使用
$search = new MyApp\Search\Search();
echo $search->query('Laravel 教學');
| 維度 | Classmap (方式一) | Files (方式二) | PSR-4 (方式三) |
|---|---|---|---|
| 結構複雜度 | 單一類別 | 函數集合 | 完整套件結構 |
| 命名空間 | 無/全域 | 無 | 標準 PSR-4 |
| 載入效能 | 需掃描建立對應表 | 直接 include | 標準自動載入 |
| 適用對象 | 工具類、服務類 | 輔助函數 | 複雜類庫、準套件 |
| 維護性 | 低(散落管理) | 中 | 高(標準化) |
若類庫需深度整合 Laravel(路由、配置、視圖、遷移),建議遵循套件開發標準:
packages/
└── vendor-name/
└── package-name/
├── src/
│ ├── PackageServiceProvider.php
│ ├── Facades/
│ └── ...
├── config/
├── views/
├── migrations/
├── routes.php
└── composer.json
// 專案 composer.json
"repositories": [
{
"type": "path",
"url": "./packages/vendor-name/package-name"
}
],
"require": {
"vendor-name/package-name": "*"
}
app/Libraries 或 app/Services,避免散落php artisan vendor:publish 讓使用者自訂設定Laravel 整合自訂類庫三大路徑:
隨專案成長,建議逐步從前兩者遷移至 PSR-4 結構,並考慮抽離為獨立 Composer 套件。良好的類庫組織不僅提升開發效率,更是團隊協作與技術傳承的基礎設施。