检查Slim Middleware的路线

时间:2014-04-07 06:46:58

标签: php slim

我的路线如下:

$app->get('/manager/:page', $authenticate($app), function ($page) use ($app, $secretshibe) {
  $app->render('manager/pages/' . $page . '.php', ['user' => $secretshibe->get_page($page, $app->view()->getData('user'))]);
});

呈现用户。我使用$authenticate来检查用户登录,如下所示:

$authenticate = function ($app) use ($secretshibe) {
  return function () use ($app, $secretshibe) {
    if (!isset($_SESSION['user'])) {
      $_SESSION['urlRedirect'] = $app->request()->getPathInfo();
      $app->flash('error', 'Please login to see that page');
      $app->redirect('/login');
    }
  };
};

我需要做什么,它有另一个逻辑检查,检查用户是否已付款。这可以从返回bool的$secretshibe->check_payment($username)获得,所以我的最终函数看起来像这样。

$authenticate = function ($app) use ($secretshibe) {
  return function () use ($app, $secretshibe) {
    if (!isset($_SESSION['user'])) {
      $_SESSION['urlRedirect'] = $app->request()->getPathInfo();
      $app->flash('error', 'Please login to see that page');
      $app->redirect('/login');
    }
    if (!$secretshibe->check_payment($_SESSION['user'])) {
      $app->flash('error', 'Your account has been marked as unpaid. Please pay to continue usage.');
      $app->redirect('/manager/payment');
    }
  };
};

问题在于,当它重定向到/manager/payment时,它使用相同的路由功能,该功能以相同的方式检查身份验证。这导致页面陷入重定向循环。为了阻止这种情况,我需要在重定向之前检查所请求的路由是否为/manager/payment

因为$authenticate函数被称为中间件,所以它在路由函数之前被调用,这意味着我不能简单地将$page传递给它。防止此重定向循环的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

您希望将$authenticate注册为Hook而不是路由中间件。

$app->hook('slim.before.dispatch', $authenticate($app));

或者,您可以使用custom Middleware注册挂钩。我已经在很多项目中完成了这项工作。它可能看起来像这样:

class MyMiddleware extends \Slim\Middleware
{
    public function call()
    {
        $app = $this->app;

        $authenticate = function ($app) use ($secretshibe) {
            // ... snip ...
        }

        $app->hook('slim.before.dispatch', $authenticate($app));

        $this->next->call();
    }
}

最近example使用中间件从我的一个个人项目中注册了一个钩子。

答案 1 :(得分:0)

你确定你的中间件需要关闭吗?你可以获得\Slim\Slim::getInstance()的申请表。

路由中间件也传递了一个参数,匹配路由。

$authenticate = function ($route) use ($secretshibe) {
    // get the app instance
    $app = \Slim\Slim::getInstance();

    if (!isset($_SESSION['user'])) {
      $_SESSION['urlRedirect'] = $app->request()->getPathInfo();
      $app->flash('error', 'Please login to see that page');
      $app->redirect('/login');
    }

    if ($route->getName() !== '/manager/payment' && !$secretshibe->check_payment($_SESSION['user'])) {
      $app->flash('error', 'Your account has been marked as unpaid. Please pay to continue usage.');
      $app->redirect('/manager/payment');
    }
};

$app->get('/manager/:page', $authenticate, function ($page) use ($app, $secretshibe) {
  $app->render('manager/pages/' . $page . '.php', ['user' => $secretshibe->get_page($page, $app->view()->getData('user'))]);
});