我有像用戶系結的路由
Route::get('users/{user}/posts', [PostController::class, 'index']);
Route::get('users/{user}/comments', [CommentController::class, 'index']);
所以我可以使用/users/1/posts,/users/5/posts等等,并且由于模型系結,它在控制器中自動可用
public function index(User $user)
{
dd($user);
}
但是對于當前登錄的用戶,我希望也可以使用/me/ID,例如/users/me/posts
有沒有辦法在不定義單獨的控制器方法的情況下實作它,我必須手動查找用戶,并且不復制所有路由?那么是否可以全域“擴展”默認的 Laravel 模型系結?
uj5u.com熱心網友回復:
您可以像這樣使用固定的路由引數:
Route::get('users/me/posts', [PostController::class, 'index']);
Route::get('users/me/comments', [CommentController::class, 'index']);
Route::get('users/{user}/posts', [PostController::class, 'index']);
Route::get('users/{user}/comments', [CommentController::class, 'index']);
然后在您的控制器方法中將該引數設為可選。
public function index(User $user = null)
{
$user = $user ?? Auth::user();
dd($user);
}
uj5u.com熱心網友回復:
當然,您只需要使用顯式路由模型系結而不是默認的隱式系結。無需更改您的路線或控制器。
在您的RouteServiceProvider::boot()方法中,您可以為user引數添加以下系結:
// use App\Models\User;
// use Illuminate\Support\Facades\Auth;
// use Illuminate\Support\Facades\Route;
public function boot()
{
Route::bind('user', function ($value) {
if ($value == 'me') {
return Auth::user();
}
return User::findOrFail($value);
});
}
現在所有{user}定義了引數的路由都將使用該函式來系結User路由中的模型。
您可能希望更新函式以處理區分大小寫的問題,或者在以訪客身份訪問路由時進行處理,但這取決于您的實作細節。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/389883.html
