【问题标题】:Laravel 5: Call method in class before the method indicated by the routeLaravel 5:在路由指示的方法之前调用类中的方法
【发布时间】:2015-06-17 23:18:04
【问题描述】:

我确信在 Laravel 中有一个有据可查的方法来做到这一点,我只是想念它或者不明白我在读什么。我有一个应用程序使用令牌来访问网站的一部分,而不是用户名或密码。该令牌识别作业,检查作业状态,然后将用户重定向到适当的页面。

到目前为止,这是我在 routes.php 文件中的内容:

$router->pattern('token', '[A-Za-z0-9]{32}');
$router->pattern('id', '[0-9]{1,11}');

Route::group(['prefix' => '{token}', 'middleware' => 'token'], function()
{
    Route::get('/', 'RedirectController@index');
    Route::get('/first-steps', ['as' => 'firstSteps', 'uses' => 'FirstStepsController@index']);
    Route::get('/first-steps/form', ['as' => 'firstStepsForm', 'uses' => 'FirstStepsController@form']);
    Route::post('/first-steps/form', 'FirstStepsController@processForm');
    Route::get('/designs', ['as' => 'designs', 'uses' => 'DesignsController@index']);
    Route::get('/designs/{id}', ['as' => 'designShow', 'users' => 'DesignsController@show']);
});

还有一些其他路线不相关。这一切都很好,如果用户访问我们给他们的链接,然后RedirectController@index 检查作业的阶段并将他们重定向到正确的 URL(目前/first-steps 用于阶段 1,/designs 用于阶段 2)。问题是如果用户为页面添加书签,例如/first-steps,当项目进入阶段 2 时,用户仍然可以访问阶段 1 的页面。我希望能够有一种在路由指示的方法之前运行的方法,以确保他们正在访问作业所在阶段的正确 URL,如有必要进行重定向,然后将作业(一个雄辩的对象)存储在类(或将其注入调用的方法)。

我尝试在控制器中创建 before 方法,但没有被调用:

public function before(Request $request, $token)
{
    $this->website = Website::where('access_token', '=', $token)->firstOrFail();
}

正如您在路由器中看到的,我有一个自定义中间件来验证令牌。这是该中间件的代码:

public function handle($request, Closure $next)
{
    if ( ! Website::where('access_token', '=', $request->route()->parameter('token'))->count())
    {
        return response('Invalid token.', 401);
    }
    return $next($request);
}

我有一种感觉,我可以使用这个中间件来实现我需要做的事情,但我不确定如何继续,或者即使我在正确的轨道上。有人可以解释一下我需要使用什么来实现我的要求吗?

【问题讨论】:

  • 将令牌验证放入DesignsController@index,看看是否有效。
  • 您应该在app/Http/Kernel.php 中分配中间件,您这样做了吗?
  • @itachi 为什么要将中间件移到方法中?这意味着在每个方法中重复中间件,这正是我不想要的。
  • @pespantelis 是的,现在的中间件可以工作,它确保令牌有效。我需要更进一步,根据网站的阶段验证页面。
  • 据我了解,您需要在/first-steps 中设置一个标志,然后用户从/design 单击返回检查标志是否已设置,如果没有,请将它们留在这里,否则再次重定向到/design。如果你不明白我会给你一个小答案。

标签: php laravel laravel-5 laravel-middleware


【解决方案1】:

中间件可能是一种选择。

您也可以在 BaseController 的构造函数中执行此操作吗?

例如

class BaseController extends Controller {

    public function __construct()
    {
         //if token in query string
         //load Job and check status Vs requested URL
         //redirect to correct URL
    }
}

【讨论】:

  • 你能把参数传递给类构造函数而不是被调用的方法吗>
  • 您不能将路由参数传递给构造函数,但您可以访问它们。例如stackoverflow.com/questions/25766894/…
  • 你知道如何使用中间件来做到这一点,正如你所说的那样,这可能是一种选择。我想我们可以使用构造函数来做到这一点,但这会破坏 DRY 原则。
  • 不必,只需要在basecontroller的构造函数中实现check即可。如果您的其他构造函数继承自它,那么它将自动执行。
  • 这会起作用,但是如果您的所有子控制器使用“__construct()”方法,则必须强制执行对“parent::__construct()”的调用。我真的不知道我是否喜欢这个
猜你喜欢
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 2017-12-20
  • 2015-05-12
相关资源
最近更新 更多