Sluba vyzadovana v constructoru nenalezena
- markoska
- Člen | 12
Mam nasledujici tridy:
App/Presenters/MerakyPresenter.php:
declare(strict_types=1);
namespace App\Presenters;
use Nette;
use Nette\Application\UI\Form;
final class MerakyPresenter extends Nette\Application\UI\Presenter
{
use Nette\SmartObject;
private Nette\Database\Explorer $database;
public function __construct (Nette\Database\Explorer $database)
{
$this->database = $database;
}
App/Presenters/OdectyPresenter.php:
namespace App\Presenters;
use Nette;
use Nette\Application\UI\Form;
final class OdectyPresenter extends Nette\Application\UI\Presenter
{
use Nette\SmartObject;
private Nette\Database\Explorer $database;
private MerakyPresenter $meraky;
public function __construct (Nette\Database\Explorer $database, MerakyPresenter $meraky)
{
$this->database = $database;
$this->meraky = $meraky;
}
V souboru common.neon mam toto:
application:
errorPresenter: Error
mapping:
*: App\Presenters\*Presenter
A v souboru services.neon toto:
services:
- App\Router\RouterFactory::createRouter
- App\Presenters\MerakyPresenter
- App\Presenters\OdectyPresenter
A Nette mi porad vraci chybu:
Service of type App\Presenters\OdectyPresenter: Service of type App\Presenters\MerakyPresenter required by $meraky in OdectyPresenter::__construct() not found. Did you add it to configuration file?
Co delam spatne? Dekuji
- Kamil Valenta
- Člen | 822
Proč se snažíš používat presenter jako service? Udělej si z Meraky normální modelovou classu.
- SankaCoffee
- Člen | 8
markoska napsal(a):
Aha to ja nevedel. Ja myslel, ze trida jako trida, ze je to jedno.
Mam tomu tedy rozumet tak, ze kdyz trida Meraky nebude potomkem Nette\Application\UI\Presenter, ze to bude fungovat?
Dekuji, jdu to vyzkouset
Presenter slouží k tomu, aby reagoval na vstup od uživatele, tj. vybere požadovanou šablonu, vytahá z modelu potřebná data, ty předá šabloně a nic víc. V tvém případě by přístup na http://mojeurl.cz/odecty spustil OdectyPresenter. Pokud tam chceš vytahat data z měřáků, tak k tomu slouží modelová třída a ne presenter, tak jak píše @KamilValenta.
Třídu MerakyPresenter přejmenuj a přesuň do app/Model/… a náležitě tomu přizpůsob i namespace. V této třídě si pak už implementuj získávání hodnot po svém. Dědění z Nette\Application\UI\Presenter samozřejmě u této třídy zruš.
xxxPresenter by se měla jmenovat pouze třída, která má sloužit jako
presenter.
Více o presenterech najdeš zde: https://doc.nette.org/…n/presenters
- markoska
- Člen | 12
SankaCoffee napsal(a):
markoska napsal(a):
Aha to ja nevedel. Ja myslel, ze trida jako trida, ze je to jedno.
Mam tomu tedy rozumet tak, ze kdyz trida Meraky nebude potomkem Nette\Application\UI\Presenter, ze to bude fungovat?
Dekuji, jdu to vyzkouset
Presenter slouží k tomu, aby reagoval na vstup od uživatele, tj. vybere požadovanou šablonu, vytahá z modelu potřebná data, ty předá šabloně a nic víc. V tvém případě by přístup na http://mojeurl.cz/odecty spustil OdectyPresenter. Pokud tam chceš vytahat data z měřáků, tak k tomu slouží modelová třída a ne presenter, tak jak píše @KamilValenta.
Třídu MerakyPresenter přejmenuj a přesuň do app/Model/… a náležitě tomu přizpůsob i namespace. V této třídě si pak už implementuj získávání hodnot po svém. Dědění z Nette\Application\UI\Presenter samozřejmě u této třídy zruš.
xxxPresenter by se měla jmenovat pouze třída, která má sloužit jako presenter.
Více o presenterech najdeš zde: https://doc.nette.org/…n/presenters
Diky, uz jsem tak ucinil a funguje to jak ma. Je to pro me vsechno nove, vcetne samotneho OOP
Ale uz jsem si uvedomil, kde jsem udelal chybu: ignoroval jsem v tutorialu kapitolu Autentifikace, protoze ji nepotrebuji, a tim padem jsem se nedostal do kapitoly Model. Jestli by to nechtelo kapitolu Model predradit te Autentifikaci
Diky vsem za pomoc a mejte se!