Kde vezmu LinkGenerator – pouzivani sablon a linku v emailech
- chaky
- Člen | 22
Pokousim se pochopit priklad z dokumentace, ve kterem je vysvetleno pouzivani sablon pri generovani mailHtmlBody, viz https://doc.nette.org/cs/mail#…
V prikladu je trida MailSender, ktera potrebuje templateFactory a linkGenerator. Muj MailSender je soucasti komponenty MailSenderComponent, kterou vytvarim z presenteru. Moje komponenta ma definovany konstruktor: function __construct($templateFactory, $linkGenerator).
Oba parametry tedy musim vzit nekde z presenteru, templateFactory v presenteru ziskam pres $msCpnt = new MailSenderComponent($this->getTemplateFactory(), … ), ale nepodarilo se mi prijit na to jak v presenteru ziskam linkGenerator. Pripadne nevim, zda mi nahodou neunika neco mnohem podstatnejsiho a oba parametry by mi tam mel umet nejak dosadit container pres DI?
Predem dekuji za radu.
- David Matějka
- Moderator | 6445
Ahoj, jen v bodech:
- neco jako MailSender by pravdepobodne nemela byt komponenta, ale obycejna sluzba, kterou registrujes v configu a pak si ji nekde predas jako zavislost (do presenteru treba)
- kdyz chces dosadit do sluzby zavislosti, tak musis uvest v konstruktoru
typehinty (tedy treba
Nette\Application\LinkGenerator
) - kdyz potrebujes dostat zavislost do komponenty (coz by ale nemel byt tento pripad, viz prvni bod), tak si vytvoris tovarnu
mrkni taky na clanek o generovani odkazu v mailech
- chaky
- Člen | 22
Dekuji za odpoved. Bohuzel asi mi stale jeste neco velmi podstatneho unika, protoze se mi ten service nejak nedari iniciovat a koncim s chybou:
Nette\DI\ServiceCreationException
Service 'application.30': Class App\Presenters\App\Model\MaiSender needed by App\Presenters\TestPresenter::__construct() not found. Check type hint and 'use' statements
config.neon:
services:
authenticator: App\Model\UserManager
router: App\RouterFactory::createRouter
- App\Model\MailSender
MailSender.php:
namespace App\Model;
use Nette\Application\LinkGenerator;
class MailSender {
/** @var Nette\Application\LinkGenerator */
private $linkGenerator;
function __construct(LinkGenerator $generator) {
$this->linkGenerator = $generator;
}
function sendEmail() {
die('ted uz zbyva jen dopsat odeslani emailu');
}
}
TestPresenter.php:
use App\Model\MailSender;
class TestPresenter extends BaseAdminPresenter {
/** @var App\Model\MailSender */
public $msender;
public function __construct(Nette\Database\Context $database, App\Model\MaiSender $msender) {
parent::__construct($database);
$this->msender = $msender;
}
...
}
- chaky
- Člen | 22
Dekuji. Tato drobnost mne docela potrapila a myslim, ze byla pricinou spousty mych dosavadnich zaseku.
Vyzkousel jsem tedy konecne kod tohoto navodu https://phpfashion.com/…lech-a-nette
Obe verze s pouzitim Latte ($latte = new \Latte\Engine; nebo $latte =
$this->latteFactory->create();)
mi chodi – mohl bych byt tedy spokojeny. Vyzkousel jsem vsak i verzi, kde se
pouziva templateFactory a ta mi na tomhle radku
$template = $this->templateFactory->createTemplate();
generuje chybu ‚Call to a member function createTemplate() on null‘, pritom jsem ale podle Debugger::barDump() zjevne v konstruktoru nejaky objekt obdrzel. Proc mi tedy tato varianta nefunguje?