Как переслать HTTP-запрос с Slim Framework

Это возможно вперед запрос в 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");

5

Решение

На мой взгляд, лучший способ сделать это — использовать внутренний маршрутизатор Slim (Slim\Router) возможности и диспетчеризация (Slim\Route::dispatch()) сопоставленный маршрут (имеется в виду: выполнение вызываемого из сопоставленного маршрута без какого-либо перенаправления). На ум приходит несколько вариантов (в зависимости от настроек):

1. вызов именованного маршрута + callable не требует аргументов (ваш пример)

$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");

Это определенно должно помочь вам, но я все еще хочу показать другие сценарии …


2. вызов названного маршрута + вызываемый с аргументами

Приведенный выше пример потерпит неудачу … потому что теперь нам нужно передать аргументы вызываемой

   // 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 ()) вызовет все промежуточное ПО, но здесь мы просто вызываем вызываемый объект напрямую … поэтому, чтобы получить полный пакет, мы должны рассмотреть следующую опцию …


3. звонить на любой маршрут

Без именованных маршрутов мы можем получить маршрут, найдя тот, который соответствует методу и шаблону 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 если не найдено ни одного маршрута.
Я надеюсь, вы поняли идею =)

7

Другие решения

Есть 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!";
});
1

Я думаю, что вы должны перенаправить их. В Слиме нет форварда. Но вы можете установить код состояния, например, в функции перенаправления. При перенаправлении на маршрут вы должны получить ту функциональность, которая вам нужна.

// 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');
}
};
};
0
По вопросам рекламы [email protected]