2017-05-25 114 views
0

我想要一个应用程序来使用URL结构是这样的:Laravel路由组参数

  1. /account/johnsmith/photos
  2. /account/johnsmith/messages
  3. /account/johnsmith/settings
  4. /account/joebloggs/photos

因此,用户可以添加多个帐户,然后路线组自动选择帐户。

Route::group(['middleware' => 'auth', 'prefix' => 'account/{username}'], function() { 
    Route::get('/photos', '[email protected]')->name('photos.index'); 
}); 

在上述例子中我可以访问的[email protected]内部的{username}参数。

有没有办法编写一些自动获取帐户信息的中间件,它可以被组中的所有子路由访问?或者,这是一个不好的方法来尝试构建这个?

回答

3

这应该是可能的路径模式结合。

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) {} 

See Laravel Docs Here

+0

真棒,三江源 – Callum

+0

乔嗨,你知道,如果有一种方法来夫妇这与服务提供商,这样我可以自动解析值到视图? – Callum

+0

与服务提供商,没有。但是你可以使用视图编辑器并接受构造函数中的Request对象。然后从请求中抽取属性(我相信'$ request-> route-> parameters',但不是100%确定的)。虽然我个人可能不会这样做,因为我不是“全局”变量的粉丝。 – Joe

0

是的,如果你需要所有的控制器方法获取之前执行操作的请求Ø传播你应该使用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); 
     }); 
    } 
} 

希望这会有所帮助。