如何使用Slim Framework转发HTTP请求

时间:2015-01-15 10:08:31

标签: php slim http-redirect forward

是否可以在Slim中转发请求? 与JavaEE一样," forward"的含义是内部重定向到另一个路由,而不返回对客户端的响应并维护模型。

例如:

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

3 个答案:

答案 0 :(得分:7)

在我看来,最好的方法是使用Slim的内部路由器(Slim\Router)功能并调度(Slim\Route::dispatch())匹配的路由(意思是:从匹配的路由执行callable)没有任何重定向)。我想到了几个选项(取决于您的设置):

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())将调用所有中间件,但这里我们只是直接调用callable ...所以要获得完整的包,我们应该考虑下一个选项...


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。 我希望你能得到这个想法=)

答案 1 :(得分:1)

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!";
});

答案 2 :(得分:0)

我认为你必须重定向它们。 Slim没有前锋。但您可以在重定向功能中设置状态代码。当您重定向到路由时,您应该获得所需的功能。

// 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');
        }
    };
};