我想要一个应用程序使用这样的URL结构:
/account/johnsmith/photos
/account/johnsmith/messages
/account/johnsmith/settings
/account/joebloggs/photos
因此,用户可以添加多个帐户,然后路由组会自动选择帐户。
Route::group(['middleware' => 'auth', 'prefix' => 'account/{username}'], function () {
Route::get('/photos', 'PhotosController@index')->name('photos.index');
});
在上面的示例中,我可以访问{username}
内的PhotosController@index
参数。
有没有办法编写一些自动获取帐户信息的中间件,并且该组中的所有子路径都可以访问它?或者,这是一个尝试建立这个的坏方法吗?
答案 0 :(得分:4)
这应该可以通过路径模型绑定来实现。
Route::bind('username', function ($username) {
return Account::findByUsername($username);
});
注意:以上代码可以放在您的路由提供商或路由组中。
完成后,您将模型Account
作为第一个参数传递给控制器方法,它将自动成为与该用户名匹配的模型。如果它不存在,则为404。
// If {username} is 'bob', the Account object now references Bob's account.
public function index(Account $account) {}
答案 1 :(得分:1)
是的,如果您需要在所有控制器方法获得请求之前执行操作o传播一些常见数据,您应该使用Laravel中间件。它不仅可以集中您的逻辑,还可以使您的控制器代码整洁。
甚至laravel有时也希望你这样做。
在以前版本的Laravel中,您可以在控制器的构造函数中访问会话变量或经过身份验证的用户。这从未打算成为框架的明确特征。在Laravel 5.3中,您无法访问控制器构造函数中的会话或经过身份验证的用户,因为中间件尚未运行。
作为替代方案,您可以直接在控制器的构造函数中定义基于Closure的中间件。在使用此功能之前,请确保您的应用程序正在运行Laravel 5.3.4或更高版本
因此,您可以编写中间件来计算帐户详细信息,如果您使用的是laravel版本5.3.4及更高版本,则可以使用基于闭包的中间件将其直接分配给构造函数中的控制器属性。
像这样:
class ProjectController extends Controller
{
/**
* All of the current user's account details
*/
protected $accountDetails;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware(function ($request, $next) {
$this->accountDetails= Auth::user()->accountDetails;
return $next($request);
});
}
}
希望这会有所帮助。