Předek – AbstractController – zachycení výjimky a ukončení
- MikKuba
- Člen | 83
Ahoj,
Mám takto kontroler, který dědí od předka. Cílem je, aby se provedl jen pokud předek neskončí výjimkou:
final class AuthController extends AbstractController
{
public function run(Request $request): IResponse
{
parent::run($request);
$params = $request->getParameters();
$method = $request->getMethod();
return new JsonResponse($this->apiResponseFormatter->formatMessage('Welcome!'));
}
}
A tedy AbstractController:
abstract class AbstractController implements IPresenter
{
/**
* @var ApiResponseFormatter
*/
protected $apiResponseFormatter;
/** @var HttpRequest */
protected $httpRequest;
public function __construct(ApiResponseFormatter $apiResponseFormatter, HttpRequest $httpRequest)
{
$this->apiResponseFormatter = $apiResponseFormatter;
$this->httpRequest = $httpRequest;
}
public function run(Request $request): IResponse
{
$params = $request->getParameters();
$method = $request->getMethod();
try{
$this->checkAuthorization();
$authorization = $this->httpRequest->getHeaders()['authorization'];
/***/
}
catch(\Exception $e){
return new JsonResponse($this->apiResponseFormatter->formatException($e));
}
}
private function checkAuthorization(){
if(!isset($this->httpRequest->getHeaders()['authorization'])){
throw new \Exception('Bad request', 400);
}
return true;
}
}
Něco na tento způsob. Tedy prvotně se snažím odchytit první případ, že vůbec nedojde v HTTP hlavičce právě authorization parametr. Chtěl bych, aby v tom případě se vrátil JSON právě s touto hláškou. Nikoliv aby to skončilo na výjimce, kterou vidím v Tracy a jinak vlastně dostanu zpět server error stránku.
Kde prosím dělám něco špatně?
Jelikož tato kontrola bude probíhat u každého budoucího kontroleru, chtěl
bych právě nějakým jednoduchým
parent::run($request);
v každém novém kontroleru zajistit tuto kontrolu.
Aktuálně to dopadá tak, že dostávám JSON výstup, ale s „Welcome!“ hláškou.
Předem děkuji za radu!
Editoval MikKuba (23. 11. 2022 23:49)
- Marek Bartoš
- Nette Blogger | 1260
Return type z parent::run() vůbec nepoužíváš, takže je jedno co vrací.
abstract class AbstractController
{
public function run(Request $response): Response
{
if (!$authorized) {
return new JsonResponse();
}
return $this->action();
}
abstract protected function action(): Response;
}