LinkGenerator a persistentní parametr

n3t
Člen | 37
+
0
-

Ahoj,

pro generování odkazů v šablonách pro emaily používám LinkGenerator předaný do Latte takto

$template = $this->templateFactory->createTemplate();
$template->getLatte()->addProvider('uiControl', $this->linkGenerator);
$template->getLatte()->renderToString('email.latte', $params);

Lze nějak tomu LinkGenerator podstrčit „persistentní parametry“, tj. aby se přidaly do každého linku? (konkrétně mi jde o locale)
Něco ve smyslu

$this->linkGenerator->setPersistantParams(['locale' => $this->locale]);

Nebo musím ty parametry zapsat přímo v Latte? Popř. je nějaký jiný elegantnější způsob (vlastní LinkGenerator asi)?

Díky

Martk
Člen | 661
+
+1
-

Stačilo by udělat něco podobného, když se jedná jen o latte:

class LinkGeneratorWithPersistentParams {

	__construct(private LinkGenerator $linkGenerator, private array $persistentParams)

	link($dest, $params) {
		return $this->linkGenerator->link($dest, $params + $persistentParams);
	}

}

a create:

interface LinkGeneratorWithPersistentParamsFactory {

	create(array $persistentParams): LinkGeneratorWithPersistentParams;

}
Felix
Nette Core | 1247
+
0
-

Tez bych to resil pres vlastni LinkGenerator. Pokud to maji byt parametry pro celou aplikaci, tak bych to definoval v NEONu uz. Pokud treba v ramci nejakeho workflow, tak bych si vytahnul factory/builder a slozil to az za pochodu.

n3t
Člen | 37
+
+2
-

Dík za tipy, nevěděl jsem že ten LinkGenerator předaný do Latte nemusí být LinkGenerator :)
Vyřešil jsem tedy takto (možná to někomu v budoucnu pomůže)

namespace App\System;

class MailLinkGenerator
{
  private $linkGenerator;
  private $persistentParams;

  public function __construct(\Nette\Application\LinkGenerator $linkGenerator, array $persistentParams)
  {
    $this->linkGenerator = $linkGenerator;
    $this->persistentParams = $persistentParams;
  }

  public function link(string $dest, array $params = []): string
  {
    return $this->linkGenerator->link($dest, $params + $this->persistentParams);
  }
}

interface MailLinkGeneratorFactory
{
  /** @return MailLinkGenerator */
  function create(array $persistentParams);
}

v configu

services:
  - App\System\MailLinkGeneratorFactory

A volání pak takto (Factory je předaná konstruktorem)

    $template->getLatte()->addProvider('uiControl', $this->linkGeneratorFactory->create([
      'locale' => $this->translator->getLocale(),
    ]));

PS: jestli tam mám něco špatně dejte vědět :), ale funguje to