Odeslání sendResponse a nastavení HTTP response code

motorcb
Člen | 551
+
0
-

Zdravím,

takto odesílám JSON v jednoduchém API:

$this->sendResponse( new Nette\Application\Responses\JsonResponse( ['status' => 'error', 'message' => 'Problem ....'] ) );

Je možné změnit návratový kód této odpovědi? Defaultně je 200, chtěl bych mu nastavit 403. Jde to?

Martk
Člen | 651
+
0
-

Takto:

class JsonResponse extends \Nette\Application\Responses\JsonResponse {

	/** @var int */
	private $code;

	public function __construct($payload, ?string $contentType = null, ?int $code = null) {
		$this->code = $code;

		parent::__construct($payload, $contentType);
	}

	public function forbiddenCode(): void {
		$this->code = 403;
	}

	public function setCode(?int $code): void {
		$this->code = $code;
	}

	public function send(Nette\Http\IRequest $httpRequest, Nette\Http\IResponse $httpResponse) {
		if ($this->code !== null) {
			$httpResponse->setCode($this->code);
		}

		parent::send($httpRequest, $httpResponse);
	}

}

Editoval Martk (1. 6. 2018 11:43)

motorcb
Člen | 551
+
0
-

@Martk díky za tip, ale nefunguje. Hlásí chybu:
Class JsonResponse may not inherit from final class (Nette\Application\Responses\JsonResponse)

Co s tím:

Martk
Člen | 651
+
0
-

Ach, toho jsem si nevšiml… Buďto okopírovat třídu nebo udělat dekorátor (podle mě zbytečný) a nebo při nejhorším nastavit stavový kód v presenteru.

Editoval Martk (1. 6. 2018 13:57)

nightfish
Člen | 468
+
+2
-
$response = new Nette\Application\Responses\JsonResponse( ['status' => 'error', 'message' => 'Problem ....'] );
$response->setCode(Nette\Http\IResponse::S403_FORBIDDEN);
$this->sendResponse($response);
black1101
Člen | 21
+
0
-

Ahojte, vyššie uvedený príklad od @nightfish je funkčný aj v najnovšom nette? Dostávam totiž hlášku

Call to undefined method Nette\Application\Responses\JsonResponse::setCode

Zatiaľ čo sa mi podarilo poslať poslať 403 code takýmto spôsobom:

$httpResponse = $this->getHttpResponse();
$httpResponse->setCode(Nette\Http\Response::S403_FORBIDDEN);

$response = new \Nette\Application\Responses\JsonResponse($data);
$this->sendResponse($response);

Je to takto v poriadku? Ďakujem za Vaše rady.

Ondřej Kubíček
Člen | 494
+
+2
-

ano, tvůj způsob je správně.
když se podíváš na předchozí příspěvky, vidíš že to měl vlastní upravenou třídu JsonResponse

black1101
Člen | 21
+
0
-

@OndřejKubíček už vidím, ospravedlňujem sa a ďakujem za odpoveď.