是否可以通过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() )匹配的路由(这意味着:从匹配的路由执行可调用对象,而不进行任何重定向)。我想到了几个选项(取决于您的设置):
1.调用命名路由+可调用不带任何参数(您的示例)

$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) ,并将reload设置为TRUE
   // getting the matched route
   $matched = $app->router()->getMatchedRoutes('GET','/classes/name', true);

   // dispatching the (first) matched route
   $matched[0]->dispatch();
在这里,您可能需要添加一些检查,例如在没有路由匹配的情况下分派(dispatch)notFound
我希望你有主意=)

关于php - 如何使用Slim Framework转发HTTP请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27961029/

10-15 12:27