Class variable global ?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Wouter Van Marrum

Wouter Van Marrum

07/12/2014 13:34:56
Quote Anchor link
Hello iedereen,

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.
 
PHP hulp

PHP hulp

25/04/2024 01:49:48
 
Wouter J

Wouter J

07/12/2014 15:36:43
Quote Anchor link
Een router die kan echoën, dat is al een probleempje. Functies moet je zoveel mogelijk puur houden. Dat betekend dat functies argumenten krijgen, daar iets mee doen en dan een waarde returnen. In dit geval krijgt hij de route naam en returned hij de URI/URL. Het maakt niet uit in welke context je de router aanroept, met dezelfde waarde krijg je hetzelfde resultaat (dat is hier niet 100% waar, aangezien het ook afhankelijk is van de "class" context, welke routes gedefinieerd zijn, maar dat laten we nu even buiten beschouwing).
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)
PHP script in nieuw venster Selecteer het PHP script
1
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]);
?>


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.
 
Wouter Van Marrum

Wouter Van Marrum

07/12/2014 15:46:36
Quote Anchor link
Heej wouter,
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
@route('login')

Dan zou ik: www.domeinnaam.nl/login/ moeten krijgen.
 
Wouter J

Wouter J

07/12/2014 15:48:38
Quote Anchor link
Dan moet je kijken naar de blade documentatie, die heeft vast wel een manier om custom functies toe te voegen.
 
Wouter Van Marrum

Wouter Van Marrum

07/12/2014 15:53:26
Quote Anchor link
Ja heb ik gedaan maar op een of andere manier werkt het niet naar behoren.
Als ik de functie statisch maak met een voor opgegeven waarde doet hij het.
Maak ik het dynamisch dan stop het met werkten.
 
Wouter J

Wouter J

07/12/2014 17:15:46
Quote Anchor link
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?
 
Wouter Van Marrum

Wouter Van Marrum

07/12/2014 17:39:24
Quote Anchor link
Sorry voor het gebrek van informatie, op me telefoon typen is niet bepaald handig.

Hier is mijn code hoe het niet werkt :
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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')


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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.