Drahak validace + default JSON
- xPablos
- Člen | 5
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:
- Trace mi pise: User Deprecated: Missing annotation @property for ApiModule\EmailsPresenter::$input used in /var/www/html/apinator.dev/app/ApiModule/EmailsPresenter.php:18
- 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)?
- 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
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
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
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
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 ;)