Laravel 開發中,有些實用技巧未在官方文檔明確說明,但能顯著提升開發效率。本文分享兩個高頻使用技巧:Route::controller 批量路由命名、基於環境變數的運行環境判斷。
Route::controller 可自動將控制器方法對應至 RESTful 路由,減少大量重複定義。但需對特定路由命名(如產生 URL、重導向)時,官方文檔鮮少提及第三參數用法。
public function controller($uri, $controller, $names = array())
$uri:URI 前綴$controller:控制器類別名$names:關鍵參數,陣列對應「方法 => 路由名稱」<?php
// 無命名:標準用法
Route::controller('admin', 'AdminController');
// 部分方法命名:第三參數傳入陣列
Route::controller('admin', 'AdminController', [
'getIndex' => 'admin.index', // 對應 GET /admin
'getLogin' => 'admin.login', // 對應 GET /admin/login
'postLogin' => 'admin.login', // 對應 POST /admin/login
'getLogout' => 'admin.logout', // 對應 GET /admin/logout
]);
// 使用命名路由
// 視圖中:route('admin.login')
// 控制器:redirect()->route('admin.index')
// URL 生成:URL::route('admin.logout')
| HTTP 動詞 | 方法前綴 | URI 範例 | 命名建議 |
|---|---|---|---|
| GET | get | /admin/users | admin.users.index |
| GET | get | /admin/users/{id} | admin.users.show |
| POST | post | /admin/users | admin.users.store |
| PUT/PATCH | put/patch | /admin/users/{id} | admin.users.update |
| DELETE | delete | /admin/users/{id} | admin.users.destroy |
Route::resource() 更語義化預設 bootstrap/start.php 透過主機名判斷:
$env = $app->detectEnvironment([
'local' => ['homestead', 'localhost', 'dev-machine']
]);
問題:團隊成員電腦主機名不同,需不斷新增主機名至陣列,維護困難。
$env = $app->detectEnvironment(function () {
// 1. 優先讀取環境變數
$env = getenv('LARAVEL_ENV');
// 2. 回退至主機名判斷(相容舊版/伺服器)
if (!$env) {
$env = [
'local' => ['homestead']
];
}
return $env;
});
SetEnv LARAVEL_ENV local
fastcgi_param LARAVEL_ENV local;
# Linux/Mac
export LARAVEL_ENV=local
# Windows PowerShell
$env:LARAVEL_ENV = "local"
# 單次執行
LARAVEL_ENV=local php artisan migrate
# docker-compose.yml
services:
app:
environment:
- LARAVEL_ENV=local
$env = $app->detectEnvironment(function () {
$env = getenv('LARAVEL_ENV') ?: 'production'; // 預設 production
// 允許的環境值白名單
$allowed = ['local', 'staging', 'production', 'testing'];
return in_array($env, $allowed) ? $env : 'production';
});
Laravel 5.0 起採用 vlucas/phpdotenv,環境配置更優雅:
APP_ENV=local
APP_DEBUG=true
APP_KEY=base64:xxx
DB_HOST=localhost
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
$app = new Illuminate\Foundation\Application(
$_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);
'default' => env('DB_CONNECTION', 'mysql'),
兩個技巧解決的核心痛點:
Route::controller 第三參數陣列,精準控制需命名的路由,避免大量單一定義這類「文檔未盡述但實戰高頻」的技巧,往往能大幅簡化程式碼與部署流程。建議團隊建立內部最佳實踐文檔,沉澱此類經驗。