2017-02-03 32 views
3

Я не могу найти способ отменить действие внутри «Перед промежуточным ПО» и отправить ответ клиенту без выполнения контроллера.Приложение Silex перед промежуточным программным обеспечением отменить маршрут

Например:

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

возможно?

Одним из примеров

Этот код работает отлично. Я ищу другое решение, используя встроенные методы framework. Если это невозможно, не проблема.

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

ответ

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; 
}); 
+0

Спасибо за ваш ответ. Но мое намерение отменяет запрос, возвращающий клиенту код состояния 4XX. С помощью этого метода результатом является код состояния 200 с телом, сгенерированным другим контроллером. Возможно, моя идея неверна или подход недействителен. –

+0

, если вы хотите выйти в любой момент и вернуть код 4xx, используйте исключения. Я отредактировал свой ответ. –

+0

Horst Jahns, Спасибо за помощь. Ваше решение идеально подходит для моего подхода. С уважением –

0

Вы проверили official documentation? Из промежуточных программных Документов

Замыкание контроллера

Если до того промежуточного слоя возвращает объект Response, обработка запроса на коротком замыкание (следующий промежуточный слой не будет работать, ни маршрут обратного вызова), и ответ передается в после промежуточного слоя сразу:

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

Если возвращать ответ объект, он должен работать, а не вызывать контроллер.

+0

Да, я уже проверил документацию, но в этом случае RedirectResponse отправит 302 ответ клиенту и перенаправит его на другой контоллер. В моем случае мне нужно вернуть код состояния 4XX без какого-либо перенаправления. –

+0

Можете ли вы поделиться своим кодом? (отредактируйте свой вопрос и опубликуйте код) – mTorres