drahak/Restful – vytvoreni ukazky

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

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
+
0
-

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 RouteListu

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
+
0
-

Diky mockrat. Tohle dost pomohlo. :)

Bigi
Člen | 5
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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');
frees
Člen | 25
+
0
-

Dik, funguje to krasne.