我的路线如下:
$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
传递给它。防止此重定向循环的最佳方法是什么?
答案 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'))]);
});