Это возможно вперед запрос в Slim?
Значение «вперед», как в JavaEE, заключается в внутреннее перенаправление на другой маршрут без возврата ответа клиенту и ведения модели.
Например:
$app->get('/logout',function () use ($app) {
//logout code
$app->view->set("logout",true);
$app->forward('login'); //no redirect to client please
})->name("logout");
$app->get('/login',function () use ($app) {
$app->render('login.html');
})->name("login");
На мой взгляд, лучший способ сделать это — использовать внутренний маршрутизатор Slim (Slim\Router
) возможности и диспетчеризация (Slim\Route::dispatch()
) сопоставленный маршрут (имеется в виду: выполнение вызываемого из сопоставленного маршрута без какого-либо перенаправления). На ум приходит несколько вариантов (в зависимости от настроек):
$app->get('/logout',function () use ($app) {
$app->view->set("logout",true);
// here comes the magic:
// getting the named route
$route = $app->router()->getNamedRoute('login');
// dispatching the matched route
$route->dispatch();
})->name("logout");
Это определенно должно помочь вам, но я все еще хочу показать другие сценарии …
Приведенный выше пример потерпит неудачу … потому что теперь нам нужно передать аргументы вызываемой
// getting the named route
$route = $app->router()->getNamedRoute('another_route');
// calling the function with an argument or array of arguments
call_user_func($route->getCallable(), 'argument');
Отправка маршрута (с помощью $ route-> dispatch ()) вызовет все промежуточное ПО, но здесь мы просто вызываем вызываемый объект напрямую … поэтому, чтобы получить полный пакет, мы должны рассмотреть следующую опцию …
Без именованных маршрутов мы можем получить маршрут, найдя тот, который соответствует методу и шаблону http. Для этого мы используем Router::getMatchedRoutes($httpMethod, $pattern, $reload)
с перезагрузкой в TRUE
,
// getting the matched route
$matched = $app->router()->getMatchedRoutes('GET','/classes/name', true);
// dispatching the (first) matched route
$matched[0]->dispatch();
Здесь вы можете добавить некоторые проверки и, например, отправить notFound
если не найдено ни одного маршрута.
Я надеюсь, вы поняли идею =)
Есть redirect()
метод. Однако он отправляет 302 Temporary Redirect
ответ, который вы не хотите.
$app->get("/foo", function () use ($app) {
$app->redirect("/bar");
});
Другая возможность pass()
который сообщает приложению, чтобы перейти к следующему подходящему маршруту. когда pass()
называется Slim, немедленно прекратит обработку текущего соответствующего маршрута и вызовет следующий соответствующий маршрут.
Если последующий соответствующий маршрут не найден, 404 Not Found
отправлено клиенту.
$app->get('/hello/foo', function () use ($app) {
echo "You won't see this...";
$app->pass();
});
$app->get('/hello/:name', function ($name) use ($app) {
echo "But you will see this!";
});
Я думаю, что вы должны перенаправить их. В Слиме нет форварда. Но вы можете установить код состояния, например, в функции перенаправления. При перенаправлении на маршрут вы должны получить ту функциональность, которая вам нужна.
// With route
$app->redirect('login');
// With path and status code
$app->redirect('/foo', 303);
Вот пример из документации:
<?php
$authenticateForRole = function ( $role = 'member' ) {
return function () use ( $role ) {
$user = User::fetchFromDatabaseSomehow();
if ( $user->belongsToRole($role) === false ) {
$app = \Slim\Slim::getInstance();
$app->flash('error', 'Login required');
$app->redirect('/login');
}
};
};