Kde vezmu LinkGenerator – pouzivani sablon a linku v emailech

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

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

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

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;
    }

    ...
}
nightfish
Člen | 519
+
+1
-

chaky napsal(a):

public function __construct(Nette\Database\Context $database, App\Model\MaiSender $msender) {

Typehint v parametrech konstruktoru změň buď na \App\Model\MailSender $msender nebo jenom MailSender $msender (protože používáš klauzuli use).

CZechBoY
Člen | 3608
+
+1
-

nebo bys musel mít nahoře use App

chaky
Člen | 22
+
0
-

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?

CZechBoY
Člen | 3608
+
0
-

Kde voláš to vytváření šablony a kdy se do property vloží instance té templateFactory? To máš v presenteru nebo komponentě?

chaky
Člen | 22
+
0
-

Mam to v presenteru v metode actionXXX().