Předek – AbstractController – zachycení výjimky a ukončení

MikKuba
Člen | 83
+
0
-

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 | 1274
+
+1
-

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