Drahak validace + default JSON

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
xPablos
Člen | 5
+
0
-

Ahoj,
snazim se vytvorit jednoduche API pomoci Nette 2.4 a Drahak/Restful

Presenter vypada takto:

<?php
namespace ApiModule;

use Drahak\Restful\IResource;
use Drahak\Restful\Application\UI\ResourcePresenter;
use Drahak\Restful\Validation\IField;
use Drahak\Restful\Validation\IValidator;
use Drahak\Restful\Validation;

class EmailsPresenter extends ResourcePresenter
{

	public function validateReadVerify(string $q) {
		$this->input->field('q')
					->addRule(IValidator::EMAIL);
	}

	public function actionReadVerify(string $q, string $fields = 'valid') {
		$this->resource->valid = true;
        $this->sendResource(IResource::JSON);
	}
}
?>

Aktualne resim 3 problemy:

  1. Trace mi pise: User Deprecated: Missing annotation @property for ApiModule\EmailsPresenter::$input used in /var/www/html/apinator.dev/app/ApiModule/EmailsPresenter.php:18
  2. Pokud dam Skip error, tak vypada, ze validace funguje. Zobrazi se chyba „Validation Failed: 'neco@cokoliv' is invalid value: Please enter a valid email address.“. Ale zobrazuje se v XML (jde nejak zapnout defaultne JSON)?
  3. Jde se zbavit $this->sendResource(IResource::JSON); na konci kazde metody (nastavit centralne), pokud chci pouzivat veskere vystupy v JSON?

Dekuji predem za odpovedi
Pablos

Zuben45
Člen | 268
+
0
-

xPablos napsal(a):

1. Trace mi pise: User Deprecated: Missing annotation @property for ApiModule\EmailsPresenter::$input used in /var/www/html/apinator.dev/app/ApiModule/EmailsPresenter.php:18

Toto ti hlásí, že nezná $input zkontroluj ResourcePresenter, popřípadě jeho rodiče a dej vědět ;)

Editoval Zuben45 (26. 8. 2016 11:53)

xPablos
Člen | 5
+
0
-

Na produkci (nebo s vypnutym debugem) to funguje spravne, takze urcite ten input zna. Ale byl bych rad, aby to fungovalo i v pristi verzi Nette :-)

Vzhledem k tomu, ze vypisuje (viz nize), tak ta samotna validace ocividne probiha.

<root>
<code>422</code>
<status>error</status>
<message>
Validation Failed: 'neco@cokoliv' is invalid value: Please enter a valid email address.
</message>
<errors>
<field>q</field>
<message>
'neco@cokoliv' is invalid value: Please enter a valid email address.
</message>
<code>0</code>
</errors>
</root>

xPablos
Člen | 5
+
0
-

Bod 1. se mi podarilo vyresit.

<?php
    public function validateReadVerify(string $q) {
        $this->input->field('q')
                    ->addRule(IValidator::EMAIL);
    }
?>

stacilo vymenit input za getInput()

<?php
	public function validateReadVerify() {
		$this->getInput()->field('q')
			->addRule(IValidator::EMAIL);
	}
?>

Ohledne servirovani v JSON je problem v tom, ze prohlizec (Chrome) posila v:

<?php
$accept = $request->getHeader('Accept');
?>

hodnotu: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8

Proto se vystup automaticky prepina na XML misto JSON.

Zuben45
Člen | 268
+
0
-

omlouvám se za delší odmlku, měl jsem toho víc na práci.

Změnit hlavičku můžete třeba následovně

$httpResponse->setHeader('Accept', 'application/json, text/javascript, */*; q=0.01');
$httpResponse->setHeader('X-Requested-With', 'XMLHttpRequest');

více v dokumentaci https://doc.nette.org/cs/http/request#…

3. bod by šel pořešil poděděním a změněním původní hodnoty na JSON ;)