在中间件取消路由之前的Silex应用程序

时间:2017-02-03 01:34:03

标签: php middleware silex

我找不到取消“Middle Middleware”内部操作的方法,并在不执行控制器的情况下将响应发送给客户。

例如:

$app->before( function( Request $request ) {
    // Do something here
    // ...
    // Here sent the response to the client and don't execute the controller
}});

有可能吗?

一个例子

此代码工作正常。我正在寻找使用框架内置方法的另一种解决方案。如果没有可能,没问题。

$app->before( function( Request $request ) {
    // Do something here
    // ...

    header( 'Content-Type: application/json' );

    echo json_encode( array(
        'message' => 'Invalid token'
    ) );

    http_response_code( 400 ); // This code return Bad Request to client
    exit; // Cancel the rest of the framework
}});

2 个答案:

答案 0 :(得分:1)

如果您想立即取消请求并返回400响应,请使用例外。在您的情况下,用户是未经授权的,因此401适合。

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
use Symfony\Component\HttpFoundation\Response;

$app->match('/', function () use ($app) {
    $app->before(function (Request $request) {
        $loggedIn= false;

        if (!$loggedIn) {
             throw new UnauthorizedHttpException(null,'unauthorized',null,Response::HTTP_UNAUTHORIZED);
        }
    });
});

$app->error(function (\Exception $e, Request $request, $code) {
    $message = strlen($e->getMessage()) > 0 ? $e->getMessage() : null;
    switch ($code) {
        case Response::HTTP_UNAUTHORIZED:
            $response = new Response($message, Response::HTTP_UNAUTHORIZED);
            break;
        default:
            $response = new Response($message, Response::HTTP_NOT_FOUND);
            break;
    }
    return $response;
});

答案 1 :(得分:0)

您检查了official documentation吗?来自中间件文档:

  

控制器短路

     

如果之前的中间件返回一个Response对象,则请求处理被短路(下一个中间件无法运行,也不会运行路由回调),并且响应立即传递给后中间件:< / p>

$app->before(function (Request $request) {
  // redirect the user to the login screen if access to the Resource is protected
  if (...) {
      return new RedirectResponse('/login');
  }
});

如果你返回一个Response对象,它应该工作,而不是调用控制器。