Class variable global ?
Ik maak gebruik van router die de links kan echo'en die zijn opgeslagen.
Maar nu loop ik tegen het probleem aan dat ik of via glob "$router" moet opvangen of via een andere manier in mijn views de router moet opvangen.
Weet iemand hoe ik de "$router" global kan opvangen zonder teveel veiligheids problemen ?
Gr,
Wouter.
Zodra je iets gaat "echoën" is de functie niet langer puur. Naast het krijgen van argumenten en returnen van waardes kan hij nu ook praten met de context. Hij kan een opdracht doen naar de "output stream" om iets te tonen. De functie is dus afhankelijk geworden van zijn context.
De router moet dus alleen een URL maken en die teruggeven, je template moet vervolgens bepalen of die "geëchoed" moet worden.
Als je OO nog iets verder doordrijft zal ik zelfs het genereren van routes niet de taak van een router willen noemen en daar een speciale UrlGenerator voor maken.
Nu terug naar je vraag, je zult vast iets gebruiken om templates te renderen. Ik weet niet hoe je het doet, maar vaak kun je op makkelijke wijze variabele beschikbaar maken doordat een include alle variabelen van de scope waar hij instaat overneemt:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
function render($template, array $vars) {
extract($vars); // transformeert waardes van array naar variabelen, met key = variabele naam en value = variabele value
require $template; // $template heeft nu toegang tot alle variabelen van deze functie
}
render('something.phtml', ['router' => $router]);
?>
function render($template, array $vars) {
extract($vars); // transformeert waardes van array naar variabelen, met key = variabele naam en value = variabele value
require $template; // $template heeft nu toegang tot alle variabelen van deze functie
}
render('something.phtml', ['router' => $router]);
?>
Ik zou je echter willen aanraden om te kijken naar een templating engine als Twig of Smarty. Die maken dit soort dingen veel makkelijker, veiliger en bieden je tientallen andere hele mooie features.
Ik maak zelf gebruik van autoroutes.
Dit in combinatie met blade engine.
Mij gaat het erom dat ik de functie die de router aanbiedt wil gaan gebruiken om snel en makkelijk mijn url's te weergeven in mijn template.
Wil dus zoiets doen:
Dan zou ik: www.domeinnaam.nl/login/ moeten krijgen.
Dan moet je kijken naar de blade documentatie, die heeft vast wel een manier om custom functies toe te voegen.
Als ik de functie statisch maak met een voor opgegeven waarde doet hij het.
Maak ik het dynamisch dan stop het met werkten.
Wat gaat er dan mis? Wat heb je geprobeerd? Waar denk je dat de fout zit en hoe heb je het geprobeerd om op te lossen?
Hier is mijn code hoe het niet werkt :
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
$this->blade->getCompiler()->extend(function($view, $compiler)
{
$pattern = $compiler->createMatcher('router');
return preg_replace($pattern, '<?php global $router; echo $router->generate($1); ?>', $view);
});
?>
in de view : @router('login')
$this->blade->getCompiler()->extend(function($view, $compiler)
{
$pattern = $compiler->createMatcher('router');
return preg_replace($pattern, '<?php global $router; echo $router->generate($1); ?>', $view);
});
?>
in de view : @router('login')
dit geeft de error : Fatal error: Method Illuminate\View\View::__toString() must not throw an exception in /blade_test/system/core/Blade.core.php on line 0
Haal ik @router weg op dit moment verdwijnt de code.
Aks ik de code statische maak dan doet hij het wel.
En wordt het volgende weer gegeven : /d/login/
Gewijzigd op 07/12/2014 17:39:57 door Wouter Van Marrum