Zakázání funkcí require, require_once, include a include_once

Niro
Člen | 6
+
0
-

Ahoj,
ve firme se snazime zaintegrovat legacy aplikaci do aktualni pouzivajici Nette a Latte. Pro starou cast aplikace mam pripraveny jeden konkretni presenter slouzici jako adapter a jednu latte sablonu, ktera nacita obsah ze starych sablon (obsahujicich hromadu volani funkci echo) pomoci:

{php require_once('legacy_view.php'); }

Vše fungovalo podle ocekavani, nicmene po stahnuti aktualni verzi Latte, jsou v sablone funkce require, require_once, include i include_once zakazany, viz: Forbidden keyword ‚require_once‘ inside tag in …/defaul.latte

Existuje nějaký workaround? Jediné co mne aktuálně napadá, je si obsah pomoci funkci ob_start a ob_end_flush ulozit do promenne a v sablone pak vypsat obsah promenne. Ale todle reseni se mi moc nelibi.

Děkuji za nápady

Martk
Člen | 651
+
0
-

Vytvoříš vlastní latte funkci přes $engine->addFunction(...) a tam bude require_once.

Niro
Člen | 6
+
0
-

To mne take napadlo, problem ale je, ze tim prijdu o promenne lokalniho kontextu.
takze je treba je predat do funkce obalujici require_once, s tim ze se musi zachovat nazvy promennych.
Pripadne je obalit do pole napr. $parameters a pak v ramci obalovaci funkce zavolat extract.

Martk
Člen | 651
+
+1
-

Tak si můžeš udělat makro

$set->addMacro('require', function (MacroNode $node, PhpWriter $writer): string {
	return $writer->write('require %node.word;');
});

Ale stejně by sis měl udělat vlastní funkci a tam předat proměnné. Protože require ti může přepsat hodnotu tvých proměnných. Předání všech proměnných v makru by mělo být asi takhle:

get_defined_vars() + $this->params;