【问题标题】:Laravel route group parametersLaravel 路由组参数
【发布时间】:2017-10-25 20:33:14
【问题描述】:

我希望应用使用类似这样的 URL 结构:

  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', 'PhotosController@index')->name('photos.index');
});

在上面的示例中,我可以访问PhotosController@index 内部的{username} 参数。

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

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    这应该可以通过路由模型绑定来实现。

    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

    【讨论】:

    • 嗨,Joe,你知道是否有办法将它与服务提供者结合起来,以便我可以自动将值解析到视图中?
    • 与服务提供商,没有。但是您可以使用视图作曲家并在构造函数的 Request 对象中接受。然后从请求中提取属性($request->route->parameters 我相信,但不是 100% 肯定)。虽然我个人可能不会这样做,因为我不喜欢“全局”变量。
    【解决方案2】:

    是的,如果您需要在所有控制器方法收到请求之前执行操作或传播一些常见数据,您应该使用 Laravel 中间件。它不仅可以集中您的逻辑,还可以使您的控制器代码整洁。

    甚至 laravel 有时也希望你这样做。

    在以前的 Laravel 版本中,您可以在控制器的构造函数中访问会话变量或经过身份验证的用户。这从未打算成为框架的明确功能。在 Laravel 5.3 中,您无法在控制器的构造函数中访问会话或经过身份验证的用户,因为中间件尚未运行。

    作为替代方案,您可以直接在控制器的构造函数中定义基于闭包的中间件。在使用此功能之前,请确保您的应用程序运行的是 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);
            });
        }
    }
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2016-03-05
      • 2023-04-04
      • 2021-02-04
      • 2019-02-14
      • 2018-04-05
      • 2013-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多