Имам следния маршрут:
$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');
}
};
};
Това, което трябва да направя, има друга логическа проверка, която проверява дали потребителят е платил. Това може да се получи от $secretshibe->check_payment($username)
, което връща bool, така че крайната ми функция изглежда така.
$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
се извиква като междинен софтуер, тя се извиква преди функцията route, което означава, че не мога просто да й предам $page
. Кой е най-добрият начин за предотвратяване на този цикъл на пренасочване?