2013-06-01 4 views
9

Z tego co rozumiem:laravel 4 - zrozumienie View :: akcji()

View::share('foo','bar'); 

Uczyni $ foo dostępny we wszystkich widokach.

Jednak czy można powiedzieć, że View::share() może być używany tylko w __construct()?

Ponieważ z zewnątrz __construct() Nie mogę go uruchomić.

+0

możesz umieścić funkcję w jaki sposób użyłeś 'Widok :: udział()'? – Michelle

Odpowiedz

9

View::share powinien być dostępny pod numerem w dowolnym miejscu w aplikacji. Powszechnie używane miejsce to widok kompozytorów, ale powinno być możliwe do wykorzystania na trasie lub w dowolnym miejscu.

+0

Więc jeśli mam 'View :: share ('name', 'Steve');' wewnątrz metody kontrolera, $ nazwa będzie dostępna dla wszystkich innych widoków? Po prostu to? – user2094178

+0

Ok, początkowo źle mi poszło. Umieściłem w routes.php i już przyniosło oczekiwany skutek. Próbowałem od wewnątrz jednej metody do innej metody z innego kontrolera. – user2094178

+2

tylko po to, aby dodać coś dla osób szukających dobrego sposobu na zrobienie tego ... umieść go wewnątrz metody '' '__construct()' '' swojego kontrolera podstawowego. ;) –

8

Tak, dodając:

View::share('foo','bar'); 

w pliku routes.php uczyni $ foo (o wartości 'bar') dostępne we wszystkich widokach. Jest to szczególnie przydatne w przypadku "aktywnych" klas nawigacyjnych na Twitterze Bootstrapa. Na przykład, można zrobić:

View::share('navactive', ''); 

aby upewnić się, że zmienna navactive jest ustawiony we wszystkich widokach (a więc nie rzuci błędy), a następnie podczas dokonywania widoki (w kontrolerze, na przykład), można przekazać:

return View::make('one')->with('navactive', 'one'); 

, a następnie w widoku (najlepiej jakiegoś szablonu ostrza bootstrappy) można wykonać następujące czynności:

<ul class="nav"> 
    @if (Auth::user()) 
    <li @if ($navactive === 'one') class="active" @endif><a href="{{{ URL::to('one/') }}}">One</a></li> 
    <li @if ($navactive === 'three') class="active" @endif><a href="{{{ URL::to('three/') }}}">Three</a></li> 
    <li @if ($navactive === 'five') class="active" @endif><a href="{{{ URL::to('five/') }}}">Five</a></li> 
    @endif 
</ul> 
+0

Jest to całkiem przydatne! Dzięki – titleistfour

+0

Jest to przydatne do tego. Jednak zawsze możesz dodać instrukcję if, aby sprawdzić, czy '$ navactive'' isset() '. Ponieważ wspomniałeś o oznakowaniu nawigacji, innym przydatnym rozwiązaniem byłoby użycie wtyczki, którą zbudowałem dla tego celu, który można znaleźć tutaj: https://github.com/kfirba/markNavigator – kfirba

0

Zasadniczo, jeśli chcesz udostępnić zmienne przez cały v iew, możesz najpierw utworzyć podstawową trasę (E.x .: internalController.php) jako klasę nadrzędną, a następnie rozszerzyć innych kontrolerów jako jej dziecko (E.x: childController.php).

I tak, najprawdopodobniej ustawisz view::share('foo', $bar) w __constructor() z internalController.php, ponieważ jest on uruchamiany zawsze, gdy klasa jest inicjowana, w ten sposób klasa nadrzędna będzie podawać wartości zmiennych do klas potomnych.