Mithilfe der Klassen SiteFinder und PageRouter ist es möglich, im CLI-Context (einfache) Frontend Links zu erzeugen. Diese Art der Implementierung ist recht schlank und hat den Vorteil, dass im Gegensatz zu anderen Varianten nicht das komplette TSFE erzeugt werden muss.

SiteFinder + PageRouter

/**
 * getUnsubscribeUrl
 * 
 * @param int $pageId
 * @param Recipient $recipient
 * @return string
 */    
private function getUnsubscribeUrl(int $pageId, Recipient $recipient) {
	
	/** @var SiteFinder $siteFinder */
	$siteFinder = GeneralUtility::makeInstance(SiteFinder::class);
	
	/** @var Site $site */
	$site = $siteFinder->getSiteByPageId($pageId);
	
	$parameters = [
		'tx_newsletter_subscription' => [
			'action' => 'edit',
			'controller' => 'Subscription',
			'r' => $recipient->getUid(),
			'rH' => HashUtility::calculateHash($recipient->getUid())
		]
	];
	
	return (string) $site->getRouter()->generateUri($pageId, $parameters);
}

In diesem Zusammenhang auch hilfreich eine ebenfalls (sehr schlanke) Methode, um mithilfe der Klassen TemplateService und PageRepository anhand einer gegebenen PageId die TypoScript Konfiguration im CLI Context verfügbar zu machen.

TemplateService + PageRepository

/**
 * loadTypoScript
 * 
 * @param int $pageId
 * @return void
 */
private function loadTypoScript(int $pageId) {
	/** @var TemplateService $template */
	$template = GeneralUtility::makeInstance(TemplateService::class);
	$template->tt_track = 0;
	$template->init();
	$sys_page = GeneralUtility::makeInstance(PageRepository::class);
	$rootline = $sys_page->getRootLine($pageId);
	$template->runThroughTemplates($rootline, 0);
	$template->generateConfig();
	// Now setup and constants are available like this
	$this->setup = $template->setup['plugin.']['tx_newsletter_subscription.']['settings.']; 
	$this->constants = $template->setup_constants['plugin.']['tx_newsletter_subscription.']['settings.']; 
}




Kommentare

David schrieb am 29.07.2021:
Weil wir selbst immer wieder nach solchen "einfachen" Lösungen gesucht haben, hier eine schöne Extension, die viel suchen und Zeit spart und (fast) alle Funktionen dieser Art auf einen Einzeiler destilliert hat:

https://extensions.typo3.org/extension/nnhelpers

Im Beispiel oben wäre es ein einfacher Aufruf dieser Methode:
\nn\t3::Page()->getLink( $pid, $params );

Die Extension ist voll von solchen Lösungen – hinter jedem Einzeiler stecken einige Stunden an Sucharbeit... alle Methoden sind wunderbar in einem übersichtlichen Backend-Modul zusammengefasst.