drahak/Restful – vytvoreni ukazky
- Bigi
- Člen | 5
Zdravim,
potreboval bych pomoc zprovoznit nejaky priklad pouziti https://github.com/drahak/Restful.
Dle navodu jsem vse potrebne nainstaloval a nastavil. Ale nedari se mi zprovoznit ukazka.
Mohl by nekdo prosim poradit jak nastavit routovani, jaky soubor, kde vytvorit a s cim, … ?
Dekuji
- drahos
- Člen | 18
Bigi napsal(a):
Zdravim,
potreboval bych pomoc zprovoznit nejaky priklad pouziti https://github.com/drahak/Restful.Dle navodu jsem vse potrebne nainstaloval a nastavil. Ale nedari se mi zprovoznit ukazka.
Mohl by nekdo prosim poradit jak nastavit routovani, jaky soubor, kde vytvorit a s cim, … ?
Dekuji
Zdravím,
routy vygenerované z anotací mají svoje specifika. Jednak jim jde nastavit
prefix (restful.routes.prefix
), jdou vypnout
(restful.routes.autoGenerated
), generují se z presenterů jen na
metodách action<Action>()
a cachují se. Raději bych
použil CrudRoute
. Tohle je více méně univerzální routa,
kterou stačí přidat do běžného Nette RouteList
u
new CrudRoute('api/v1/<presenter>[/<id>[/<relation>[/<relationId>]]]', 'Sample');
Tady je pár příkladů URL, na které se vztahuje:
GET /api/v1/articles => ArticlesPresenter metoda actionRead
POST /api/v1/articles => ArticlesPresenter metoda actionCreate
GET /api/v1/articles/5 => ArticlesPresenter metoda actionRead s parametrem id=5
GET /api/v1/articles/5/comments => ArticlesPresenter::actionReadComments s parametrem id=5
GET /api/v1/articles/5/comments/8 => ArticlesPresenter::actionReadComments s parametrem id=5, relationId=8
- Bigi
- Člen | 5
Sice to me to posunulo dal, ale stejne jsem to zatim bohuzel
nezprovoznil.
Kdyz pouziji routu ve tvaru:
„CrudRoute(‚api/<presenter>[/<id>]‘,‚Sample‘);“
A pristoupim pres prohlizec na napr. tedy:
GET /api/teams
tak se v TeamsPresenter zacne provadet metoda actionRead(). Ale $resource nemam
definovane, takze mi to hazi „Cannot read an undeclared property
App\TeamsPresenter::$resource“. Schazi mi takovy vetsi obraz, jak by to melo
fungovat. Co ma reprezentovat $resource?
Budu vdecny za blizsi, podrobnejsi vysvetleni.
Diky
- drahos
- Člen | 18
Bigi napsal(a):
Sice to me to posunulo dal, ale stejne jsem to zatim bohuzel nezprovoznil.
Kdyz pouziji routu ve tvaru: „CrudRoute(‚api/<presenter>[/<id>]‘,‚Sample‘);“
A pristoupim pres prohlizec na napr. tedy:
GET /api/teams
tak se v TeamsPresenter zacne provadet metoda actionRead(). Ale $resource nemam definovane, takze mi to hazi „Cannot read an undeclared property App\TeamsPresenter::$resource“. Schazi mi takovy vetsi obraz, jak by to melo fungovat. Co ma reprezentovat $resource?Budu vdecny za blizsi, podrobnejsi vysvetleni.
Diky
Nejjednodušší je zdědit ResourcePresenter
, který se o vše
postará (předá všechny závislosti, vytvoří resource apod.)
Abych odpověděl na otázku, co je to vlastně Resource
– je
to objekt reprezentující data, která API vrací (konkrétně objekt typu
Drahak\Restful\IResource
) Implementuje ArrayAccess
a
má „magické“ gettery a settry (hodnoty se do něj dají zapisovat stejně
jako do template)
public function actionRead($id)
{
$this->resource->name = 'Lorem ipsum';
$this->resource['description'] = 'Dolor sit amet.';
// pokud má API vracet pole
// $this->resource[] = 'item';
// nebo vytvořit nový resource z dat z pole
// $this->resource = $this->resourceFactory->create(array('item 1', 'item 2'));
$this->sendResource(IResource::JSON);
}
- Bigi
- Člen | 5
Diky mockrat :).
Ted snad uz posledni dotaz.
Nemely by vychozi hodnoty u routy zajistit, ze pro pristup na neexistujici
presenter, se to presmeruje prave na vychozi presenter s vychozi akci?
$route = new
Route(‚<presenter=Homepage>/<action=default>/<id=>‘);
$router[] = new
CrudRoute(‚api/<presenter>[/<id>]‘,‚Sample‘);
Zde pri pristupu na:
/neexistujici_presenter na Homepage:default
/api/neexistujici_presenter na Sample ?
- drahos
- Člen | 18
Bigi napsal(a):
Diky mockrat :).
Ted snad uz posledni dotaz.
Nemely by vychozi hodnoty u routy zajistit, ze pro pristup na neexistujici presenter, se to presmeruje prave na vychozi presenter s vychozi akci?$route = new Route(‚<presenter=Homepage>/<action=default>/<id=>‘);
$router[] = new CrudRoute(‚api/<presenter>[/<id>]‘,‚Sample‘);Zde pri pristupu na:
/neexistujici_presenter na Homepage:default
/api/neexistujici_presenter na Sample ?
Přesměrování je podle mě v REST API nežádoucí. Každý zdroj by měl mít právě jedno URL, odkud se na něj dá dostat. Pokud už na nějaké adrese není, měl by vrátit 410 Gone, ale to se používá pro verzování.
- Bigi
- Člen | 5
drahos napsal(a):
Bigi napsal(a):
Diky mockrat :).
Ted snad uz posledni dotaz.
Nemely by vychozi hodnoty u routy zajistit, ze pro pristup na neexistujici presenter, se to presmeruje prave na vychozi presenter s vychozi akci?$route = new Route(‚<presenter=Homepage>/<action=default>/<id=>‘);
$router[] = new CrudRoute(‚api/<presenter>[/<id>]‘,‚Sample‘);Zde pri pristupu na:
/neexistujici_presenter na Homepage:default
/api/neexistujici_presenter na Sample ?Přesměrování je podle mě v REST API nežádoucí. Každý zdroj by měl mít právě jedno URL, odkud se na něj dá dostat. Pokud už na nějaké adrese není, měl by vrátit 410 Gone, ale to se používá pro verzování.
Ano, tohle je rozumne, chapu. Trochu spatne jsem popsal, co mam za problem. Nyni pri pristup na neexistujici restAPI (neplatne URL) / neexistujici soubor, mi Nette hlasi chybu, ze nemuze najit presenter.
Vim, ze uz je to trochu mimo tema tohoto topicu, ale neporadil bys mi prosim, jak to osetrit? Je to zalezitost routovani nebo nastaveni .htaccess?
- drahos
- Člen | 18
Bigi napsal(a):
drahos napsal(a):
Bigi napsal(a):
Diky mockrat :).
Ted snad uz posledni dotaz.
Nemely by vychozi hodnoty u routy zajistit, ze pro pristup na neexistujici presenter, se to presmeruje prave na vychozi presenter s vychozi akci?$route = new Route(‚<presenter=Homepage>/<action=default>/<id=>‘);
$router[] = new CrudRoute(‚api/<presenter>[/<id>]‘,‚Sample‘);Zde pri pristupu na:
/neexistujici_presenter na Homepage:default
/api/neexistujici_presenter na Sample ?Přesměrování je podle mě v REST API nežádoucí. Každý zdroj by měl mít právě jedno URL, odkud se na něj dá dostat. Pokud už na nějaké adrese není, měl by vrátit 410 Gone, ale to se používá pro verzování.
Ano, tohle je rozumne, chapu. Trochu spatne jsem popsal, co mam za problem. Nyni pri pristup na neexistujici restAPI (neplatne URL) / neexistujici soubor, mi Nette hlasi chybu, ze nemuze najit presenter.
Vim, ze uz je to trochu mimo tema tohoto topicu, ale neporadil bys mi prosim, jak to osetrit? Je to zalezitost routovani nebo nastaveni .htaccess?
Chyby se zpracovávají pomocí error presenteru. V config.neon si můžeš
tenhle presenter nastavit. Aby to správně fungovalo, musí být ještě
vlastnost catchExceptions (Nette\Application) TRUE
.
nette:
application:
errorPresenter: 'Api:Error'
V třída RespurcePresenter
má pak metodu
sendErrorResource
, která se používá třeba i na validační
chyby. Nejjednodušší ErrorPresenter vypadá takhle https://github.com/drahak/Restful#…
V aplikaci by ale bylo vhodné, zpracovávat si chyby sám.
- frees
- Člen | 25
Zdravim, tiez mam problem. Ako testovacieho REST clienta pouzivam rozsirenie Postman do Chromu, po odoslani pozadavku sa mi ale vrati chybova stranka Method is not allowed, pritom mam nastaveny GET, skusal som aj ine rozsirenia ale vsade je ta ista chyba.
http://screencast.com/t/cnOAX45rMxH
Pripadne pokial by ste mi mohli poskytnut nejaky prednastaveny sandbox ktory vam funguje, velmi by som to ocenil, som v tomto zaciatocnik.
Prikladam aj zdrojove kody: https://dl.dropboxusercontent.com/…/backend.zip
Za pomoc dakujem.
- drahos
- Člen | 18
Ahoj, je tam špatně mapování. V config.neon
je mapping
App\*Module\Presenters\*Presenter
, ale presentery jsou v namespace
ResourceModule
. Aby to s tímto mapováním fungovalo, musí být
presenter v namespace App\ResourcesModule\Presenters
a v té
routě musí být buďto přímo uvedený modul:
$router[] = new CrudRoute('users[/<id>]', array(
'module' => 'Resources',
'presenter' => 'Users'
));
nebo se může brát z URL:
$router[] = new CrudRoute('<module>/users[/<id>]', 'Users');