Service of type Latte\Engine required by $latte in SMSModel::__construct() not found
- mimacala
- Člen | 113
Ahojte,
nahoře mám
use Latte\Engine;
public function __construct(
private Explorer $db,
private Engine $latte, //tady mi to háže chybu
){
}
public function OdeslatEmail($od,$komu,$predmet,$cesta,$par,$par2)
{
$params = [
'par' => $par,
'par2' => $par2,
];
$mail = new Nette\Mail\Message;
$mail->setFrom($od)
->addTo($komu)
->setSubject($predmet)
->setHtmlBody($this->latte->renderToString($cesta, $params));
$mailer = new Nette\Mail\SendmailMailer;
$mailer->send($mail);
}
Tady je celá chyba
[2022–08–14 21–42–56] Nette\DI\ServiceCreationException: Service of type
App\model\SMSModel: Service of type Latte\Engine required by $latte in
SMSModel::__construct() not found. Did you add it to configuration file? in
/data/web/virtuals/304203/virtual/www/vendor/nette/di/src/DI/Resolver.php:650 @
@@ exception–2022–08–14–21–42–f98557db7e.html
na produkčním serveru vypíše Error 500
Takto vypadá soubor services
services:
- App\Router\RouterFactory::createRouter
- App\Components\Formulare\FormularPrihlaseni
- App\model\Kontrola
- App\model\BaseModelUzivatele
- App\model\UzivatelModel
- App\model\ProvozovnaModel
- App\model\ReklamaceModel
- App\model\ZpravyModel
- App\model\SMSModel
SMS model tam mám chybu mi to hodilo až po přidání LatteEngine :/
Jinak ve vendor samozřejmě je latte.
Bude to nějaká blbost, ale jsem na tom ted zaseklý :D .. prosím nesetkal se
s tím někdo ?
Děkuji
- Marek Bartoš
- Nette Blogger | 1280
Engine není služba, vytváří se skrze službu
Nette\Bridges\ApplicationLatte\LatteFactory
Ale možná budeš chtít spíš
Nette\Bridges\ApplicationLatte\TemplateFactory
. Přidává věci
jako jsou odkazy, cachovací a překladové makro
- Marek Bartoš
- Nette Blogger | 1280
S TemplateFactory takto
$this->templateFactory->createTemplate()->renderToString()
- mimacala
- Člen | 113
Ahoj prosím ještě teď mám chybu
[2022–08–15 17–40–02] Latte\RuntimeException: Missing template file
‚templates/email.latte‘. in
email.latte mám ve složce templates, ale nevím jak udělat cestu protože
{$basePath} mě nasměruje do www.
Zde je kód s cestou
public function OdeslatEmail($od,$komu,$predmet,$cesta,$par,$par2)
{
$params = [
'par' => $par,
'par2' => $par2,
];
$mail = new Nette\Mail\Message;
$mail->setFrom($od)
->addTo($komu)
->setSubject($predmet)
->setHtmlBody($this->latte->createTemplate()->renderToString($cesta, $params));
$mailer = new Nette\Mail\SendmailMailer;
$mailer->send($mail);
}
$this->sms->OdeslatEmail('Aktivace účtu - <>',$data->email,'Aktivační link','templates/email.latte',$klic,$data->email);
=========================================================================================
Jinak ještě mimo to,
v dokumentaci je tento příklad
$latte = new Latte\Engine;
$params = [
'orderId' => 123,
];
$mail = new Nette\Mail\Message;
$mail->setFrom('Franta <franta@example.com>')
->addTo('petr@example.com')
->setHtmlBody(
$latte->renderToString('/path/to/email.latte', $params),
'/path/to/images'
);
Ale latte/engine mi právě dělalo problémy a tvoje řešení funguje
v pořádku.
Dokumentace je tedy zastaralá ?
Děkuji
- nightfish
- Člen | 519
@mimacala
ad cesta: Do renderToString()
posílej absolutní cestu –
v nejjednodušším případě jako
__DIR__.'/templates/email.latte
– což ovšem bude vyžadovat,
aby složka templates
se souborem email.latte
byla ve
stejném adresáři, jako soubor, v němž použiješ konstantu
__DIR__
. Pokud je jinde, bude potřeba cestu nějak upravit.
ad Latte\Engine: je zásadní rozdíl, když si vytvoříš Latte engine
pomocí new Latte\Engine
a když si jej vyžádáš jako závislost
přes konstruktor. Ve druhém případě to vyžaduje, aby byl
Latte\Engine
zaregistrován jako služba v DI kontejneru, což
v Nette standardně není.
- mimacala
- Člen | 113
@nightfish Aha jasné DIR funguje.
Snažím se teda odkaz vytvořit přes link a předat si ho rovnou do emailu,
ale nejak mi nejdou sestavit „. '“.
Neví někdo jak tohle vyřešit ? :D
$url = '<a href="' . $this->link("Prihlaseni:aktivace", $klic, $data->email) . '"></a>'; // tady mi to dělá problémy :D
$this->sms->OdeslatEmail("Aktivace účtu - <info@reklab.cz>",$data->email,"Aktivační link [RekLab]",$url);
na email mi přijde toto ne odkaz ale jako text
<a href="/prihlaseni/aktivace?klic=183&email=mujemail.cz"></a>
Editoval mimacala (15. 8. 2022 20:12)
- mystik
- Člen | 313
To bude tím, že zafunguje automatické escapování, kterým Latte brání tomu, aby tam uživatel podstrčil nějaký škodlivý kód.
Za mě si nesestavuj celé HTML, ale jen URL odkazu a udělej ji absolutní.
$url = $this->link("//Prihlaseni:aktivace", $klic, $data->email)
A nebo jde rozchodit klasická makra link a plink takhle:
$latte->addExtension(new UIExtension(null));
$latte->addProvider('uiControl', $linkGenerator);
$latte->addProvider('uiPresenter', $linkGenerator);
Jako $linkGenerator předáváš buď službu typu LinkGenerator, nebo cokoliv co má metodu link. Makra link a plink ji pak volají.
- mimacala
- Člen | 113
Aha chápu, já měl právě problém s předáním linkgeneratoru do
šablony, tak jsem to chtěl vyřešit takhle :/
EDIT: kdyby někdo řešil stejně jako já .. zde je řešení
$mail = new Nette\Mail\Message;
$mail->setFrom($od)
->addTo($komu)
->setSubject($predmet)
->setHtmlBody('<a href="' . $par . '">Aktivační link</a>');
$mailer = new Nette\Mail\SendmailMailer;
$mailer->send($mail);
Editoval mimacala (16. 8. 2022 20:23)