nette API – error: Declaration of ..Presenter::run(Request $request) must be compatible

- Petr64
- Člen | 22
Ahoj,
jsem věčný začátečník. Po letech se snažím udělat v nette aplikaci
API rozhraní. Na seznámení jsem si na foru jednoduchý příklad.
"Jan Tvrdík :HelloWorldApi ":https://forum.nette.org/…tte-aplikaci
Okopíroval jsem presenter:
namespace App\Presenters;
/**
* Description of HelloWorldApi
*/
class HelloWorldApiPresenter implements Nette\Application\IPresenter
{
public function run(Request $request) : IResponse
{
$name = $request->getParameter('name');
return new JsonResponse(['message' => "Hello $name"]);
}
}
přidal jsem routu: $router->addRoute(‚/Api[/<name>]‘, ‚HelloWorldApi:default‘);
declare(strict_types=1);
namespace App\Router;
use Nette;
use Nette\Application\Routers\RouteList;
final class RouterFactory
{
use Nette\StaticClass;
public static function createRouter(): RouteList
{
$router = new RouteList;
$router->addRoute('/Api[/<name>]', 'HelloWorldApi:default');
$router->addRoute('<presenter>/<action>[/<id>]', 'Homepage:default');
return $router;
}
}
Těšil jsem se jak je to jednoduché, až spustím http://api.local/api/Petr a objeví se mi nápis „Hello Petr“
Testuji pomocí postman a dostávám v odpovědi:
500Internal Server Error
Fatal error: Declaration of HelloWorldApiPresenter::run(Request $request) must be compatible with
Nette\Application\IPresenter::run(Nette\Application\Request $request): Nette\Application\IResponse in
C:\WWW\Apache24\htdocs\rest73\app\Presenters\HelloWorldApiPresenter.php on line 11
<!DOCTYPE html><!-- "' --></textarea></script>
...
Mohl by mi někdo poradit co ta chyba znamená a jak to opravit?
Editoval Petr64 (4. 2. 2020 16:28)

- David Matějka
- Moderator | 6445
u run metody na IPresenter interface je nyni return
type, tak stejny return type pridej i k HelloWorldApiPresenter

- David Matějka
- Moderator | 6445
kdyz se kouknes do te chybove hlasky, tak vidis, ze ten return type je
Nette\Application\IResponse. kdyz tam uvedes jen
IResponse, tak to php vyresolvuje na
App\Presenters\IResponse. musis tedy
pridat use Nette\Application\IResponse
vice o tom, jak funguji namespace, najdes v dokumentaci php

- Petr64
- Člen | 22
David Matějka napsal(a):
kdyz se kouknes do te chybove hlasky, tak vidis, ze ten return type je
Nette\Application\IResponse. kdyz tam uvedes jenIResponse, tak to php vyresolvuje naApp\Presenters\IResponse. musis tedy pridatuse Nette\Application\IResponsevice o tom, jak funguji namespace, najdes v dokumentaci php
Pročetl jsem odkaz. Snad maličko chápu a upravil jsem HelloWorldApiPresenter takto
přidal jsem:
use Nette\Application\IResponse;`
upravil jsem na absolutní odkaz :
implements \Nette\Application\IPresenter
namespace App\Presenters;
use Nette\Application\IResponse;
/**
* Description of HelloWorldApi
*/
class HelloWorldApiPresenter implements \Nette\Application\IPresenter
{
public function run(Request $request) : IResponse
{
$name = $request->getParameter('name');
return new JsonResponse(['message' => "Hello $name"]);
}
}
Teď snad to resolvuje se správně, ale chyba nezmizela:
Fatal error: Declaration of
App\Presenters\HelloWorldApiPresenter::run(App\Presenters\Request $request):
Nette\Application\IResponse must be compatible with
Nette\Application\IPresenter::run(Nette\Application\Request
$request): Nette\Application\IResponse in
C:\WWW\Apache24\htdocs\rest73\app\Presenters\HelloWorldApiPresenter.php on
line 9
Editoval Petr64 (4. 2. 2020 19:29)

- Marek Bartoš
- Nette Blogger | 1313
Pořád to nemáš stejné, podívej se pořádně na chybu. Ještě
potřebuješ buď use statement nebo absolutní namespace pro Request.
run(App\Presenters\Request $request): Nette\Application\IResponse
run(Nette\Application\Request $request): Nette\Application\IResponse
Používáš nějaké IDE? Mělo by ti chybu zvýraznit. phpstorm, netbeans, …
Editoval Mabar (4. 2. 2020 20:37)

- Petr64
- Člen | 22
Mabar napsal(a):
Pořád to nemáš stejné, podívej se pořádně na chybu. Ještě potřebuješ buď use statement nebo absolutní namespace pro Request.
run(App\Presenters\Request $request): Nette\Application\IResponse
run(Nette\Application\Request $request): Nette\Application\IResponsePoužíváš nějaké IDE? Mělo by ti chybu zvýraznit. phpstorm, netbeans, …
Ahoj, používám netbeans ale nic mi to nezdůraznilo.
Už to chybu neháže, dopsal do jsem Request i nakonec do JsonResponse
absolutní odkaz.
Jde to nějak jinak?
Jinak už to chodí. Díky moc tobě i Davidovi, za trpělivost.
namespace App\Presenters;
use Nette\Application\IResponse;
/**
* Description of HelloWorldApi
*/
class HelloWorldApiPresenter implements \Nette\Application\IPresenter
{
public function run(\Nette\Application\Request $request) : IResponse
{
$name = $request->getParameter('name');
return new \Nette\Application\Responses\JsonResponse(['message' => "Hello $name"]);
}
}
Editoval Petr64 (4. 2. 2020 21:56)

- Marek Bartoš
- Nette Blogger | 1313
Můžeš používat use statements, tak jak jsi to měl u IResponse. Pak můžeš používat ty krátké názvy.
Netbeans jsem zmínil jen, aby jeden nejmenovaný uživatel nepřišel s tím, že tu propaguju placený software :)
V phpstormu bys takovou třídu měl podtrženou vlnovkou a pomocí
klávesové zkratky alt+enter by ti to i nabídlo import třídy ze správného
namespace.
Když kód nebudeš kopírovat, ale psát, tak se ti nabídnutá třída po
zvolení přidá mezi use statements automaticky.
Editoval Mabar (5. 2. 2020 4:50)