Jak ustawić zmienne w szablonie Laravel Blade

Czytam dokumentację Laravel blade i nie mogę rozgryźć, Jak przypisać zmienne w szablonie do wykorzystania później. Nie mogę zrobić {{ $old_section = "whatever" }}, bo to będzie echo "cokolwiek" i nie chcę tego.

Rozumiem, że mogę to zrobić, ale to nie jest eleganckie.

Czy jest lepszy, elegancki sposób, aby to zrobić w szablonie Blade?

Author: Karl Hill, 2012-10-21

29 answers

Odradza się robienie tego w widoku, więc nie ma dla niego znacznika ostrza. Jeśli chcesz to zrobić w widoku blade, możesz po prostu otworzyć znacznik php tak, jak go napisałeś lub zarejestrować nowy znacznik blade. Tylko przykład:

<?php
/**
 * <code>
 * {? $old_section = "whatever" ?}
 * </code>
 */
Blade::extend(function($value) {
    return preg_replace('/\{\?(.+)\?\}/', '<?php ${1} ?>', $value);
});
 132
Author: TLGreg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-22 20:32:18

LARAVEL 5.5 I WIĘCEJ

Dyrektywa @php blade nie akceptuje już znaczników inline. Zamiast tego użyj pełnej formy dyrektywy:

@php
$i = 1
@endphp

LARAVEL 5.2 I WIĘCEJ

Możesz po prostu użyć:

@php ($i = 1)

Lub można go użyć w instrukcji blokowej:

@php
$i = 1
@endphp

LARAVEL 5

Rozciągnij ostrze tak:

/*
|--------------------------------------------------------------------------
| Extend blade so we can define a variable
| <code>
| @define $variable = "whatever"
| </code>
|--------------------------------------------------------------------------
*/

\Blade::extend(function($value) {
    return preg_replace('/\@define(.+)/', '<?php ${1}; ?>', $value);
});

Następnie wykonaj jedną z następujących czynności:

Szybkie rozwiązanie: jeśli jesteś leniwy, po prostu umieść kod w funkcji boot () AppServiceProvider.php.

Ładniejsze rozwiązanie: Stwórz własnego dostawcę usług. Zobacz https://stackoverflow.com/a/28641054/2169147 Jak przedłużyć ostrze w Laravel 5. To trochę więcej pracy w ten sposób, ale dobre ćwiczenie, jak korzystać z dostawców:)

LARAVEL 4

Możesz po prostu umieścić powyższy kod na dole app / start / global.php (lub w dowolnym innym miejscu, jeśli uważasz, że jest to lepsze).

Po powyższych zmianach można użycie:

@define $i = 1

Aby zdefiniować zmienną.

 394
Author: Pim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-03-19 09:49:07

W laravel-4 możesz użyć składni komentarza szablonu do definiowania/ustawiania zmiennych.

Składnia komentarza jest {{-- anything here is comment --}} i jest renderowana przezblade jako

<?php /* anything here is comment */ ?>

Więc za pomocą małej sztuczki możemy użyć go do zdefiniowania zmiennych, na przykład

{{-- */$i=0;/* --}}

Zostanie renderowany przez blade jako <?php /* */$i=0;/* */ ?> który ustawia zmienną dla nas. Bez zmiany linii kodu.

 116
Author: Trying Tobemyself,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-27 11:56:00

Istnieje proste obejście, które nie wymaga zmiany żadnego kodu i działa również w Laravel 4.

Po prostu używasz operatora przypisania (=) w wyrażeniu przekazanym do instrukcji @if, zamiast (na przykład) operatora, takiego jak ==.

@if ($variable = 'any data, be it string, variable or OOP') @endif

Wtedy możesz użyć go wszędzie tam, gdzie możesz użyć dowolnej innej zmiennej

{{ $variable }}

Jedynym minusem jest to, że Twoje zadanie będzie wyglądać Jak błąd dla kogoś, kto nie wie, że robisz to jako obejście.

 55
Author: BTMPL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-21 15:55:30

To zbyt skomplikowane.

Po prostu użyj zwykłego php

<?php $i = 1; ?>
{{$i}}
Donesies.

(lub https://github.com/alexdover/blade-set wygląda też całkiem prosto)

Wszyscy "hakujemy" system ustawiając zmienne w widokach, więc po co utrudniać "hakowanie"?

Testowany w Laravel 4.

Kolejną zaletą jest to, że podświetlanie składni działa poprawnie (wcześniej używałem comment hack i było okropnie read)

 30
Author: Sabrina Leggett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-21 14:18:38

Zmienne W Silniku Szablonów Blade Można Ustawić W Następujący Sposób:

1. Ogólny blok PHP
Ustawianie zmiennej: <?php $hello = "Hello World!"; ?>
wyjście: {{$hello}}

2. Blade PHP Block
Ustawianie zmiennej: @php $hello = "Hello World!"; @endphp
wyjście: {{$hello}}

 22
Author: Prince Ahmed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-13 05:59:23

Od wersji Laravel 5.2.23, masz dyrektywę @php Blade , której możesz użyć w wierszu lub jako instrukcji blokowej:

@php($old_section = "whatever")

Lub

@php
    $old_section = "whatever"
@endphp
 20
Author: Daan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-11 19:34:05

Możesz ustawić zmienną w pliku widoku, ale zostanie ona wydrukowana tak, jak ją ustawisz. W każdym razie, jest obejście. Zmienną można ustawić wewnątrz nieużywanej sekcji. Przykład:

@section('someSection')
  {{ $yourVar = 'Your value' }}
@endsection

Następnie {{ $yourVar }} wydrukuje Your value w dowolnym miejscu, ale nie otrzymasz wyniku podczas zapisywania zmiennej.

EDIT: nazwanie sekcji jest wymagane w przeciwnym razie zostanie wyrzucony wyjątek.

 17
Author: Vasile Goian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-13 11:24:33

W Laravel 4:

Jeśli chcesz, aby zmienna była dostępna we wszystkich widokach, a nie tylko w szablonie, View::share jest świetną metodą ( Więcej informacji na tym blogu ).

Wystarczy dodać następujące elementy w app / controllers / BaseController.php

class BaseController extends Controller
{
  public function __construct()
  {                   
    // Share a var with all views
    View::share('myvar', 'some value');
  }
}

I teraz {[2] } będą dostępne dla wszystkich Twoich widoków-łącznie z Twoim szablonem.

Użyłem tego do ustawienia adresów URL zasobów specyficznych dla środowiska dla moich obrazów.

 15
Author: Justin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-08-20 14:18:13

W dokumencie laravel https://laravel.com/docs/5.8/blade#php Można to zrobić w ten sposób:

@php
     $my_variable = 123;
@endphp
 14
Author: Hamidreza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-03-07 11:45:28

I nagle nic się nie pojawi. Z mojego doświadczenia, jeśli musisz zrobić coś takiego, przygotuj html w metodzie modelu lub zrób jakąś reorganizację kodu w tablicach lub coś takiego.

Nigdy nie ma tylko jednej drogi.
{{ $x = 1 ? '' : '' }}
 8
Author: Michael J. Calkins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-27 15:53:49

Zamierzam rozszerzyć odpowiedź udzieloną przez @Pim.

Dodaj to do metody rozruchowej AppServiceProvider

<?php
/*
|--------------------------------------------------------------------------
| Extend blade so we can define a variable
| <code>
| @set(name, value)
| </code>
|--------------------------------------------------------------------------
*/

Blade::directive('set', function($expression) {
    list($name, $val) = explode(',', $expression);
    return "<?php {$name} = {$val}; ?>";
});

W ten sposób nie ujawniasz możliwości zapisu dowolnego wyrażenia php.

Możesz użyć tej dyrektywy w następujący sposób:

@set($var, 10)
@set($var2, 'some string')
 6
Author: Carson Evans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-02 11:25:35

W Laravel 5.1, 5.2:

Https://laravel.com/docs/5.2/views#sharing-data-with-all-views

Może być konieczne udostępnienie fragmentu danych wszystkim widokom , które są renderowane przez Twoją aplikację. Można to zrobić za pomocą metody udostępniania widoku factory. Zazwyczaj należy umieszczać połączenia do udostępniania w ramach metody rozruchu dostawcy usług. Możesz dodać je do AppServiceProvider lub wygenerować oddzielnego dostawcę usług do domu oni.

Edycja pliku: /app/Providers/AppServiceProvider.php

<?php

namespace App\Providers;

class AppServiceProvider extends ServiceProvider
{        
    public function boot()
    {
        view()->share('key', 'value');
    }

    public function register()
    {
        // ...
    }
}
 5
Author: Justin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-21 21:09:29

Możesz użyć pakietu, który opublikowałem: https://github.com/sineld/bladeset

Następnie łatwo ustawić zmienną:

@set('myVariable', $existing_variable)

// or

@set("myVariable", "Hello, World!")
 5
Author: Sinan Eldem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-11 12:29:10

Jeśli chodzi o mój elegancki sposób jest jak poniżej

{{ ''; $old_section = "whatever"; }}

I po prostu echo swojej $old_section zmiennej.

{{ $old_section }}
 3
Author: Set Kyar Wa Lar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-17 04:30:43

Jeśli masz PHP 7.0:

Najprostszym i najskuteczniejszym sposobem jest przypisanie wewnątrz nawiasów.

Zasada jest prosta: Czy używasz zmiennej więcej niż raz? Następnie zadeklaruj, że jest używany po raz pierwszy w nawiasach, Zachowaj spokój i kontynuuj.

@if(($users = User::all())->count())
  @foreach($users as $user)
    {{ $user->name }}
  @endforeach
@else
  There are no users.
@endif

I tak, Wiem o @forelse, to tylko demo.

Ponieważ twoje zmienne są teraz deklarowane jako i kiedy są używane, nie ma potrzeby stosowania obejść.

 3
Author: Jonathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-26 17:25:05

Przypisz zmienną do szablonu blade, oto rozwiązania

Możemy użyć znacznika <?php ?> na stronie blade

<?php $var = 'test'; ?>
{{ $var }

Lub

Możemy użyć komentarza blade ze specjalną składnią

{{--*/ $var = 'test' /*--}}
{{ $var }}
 3
Author: Nikunj K.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-24 12:56:13

Ja również zmagałem się z tym samym problemem. Ale udało mi się poradzić sobie z tym problemem za pomocą następującego segmentu kodu. Użyj tego w szablonie ostrza.

<input type="hidden" value="{{$old_section = "whatever" }}">

{{$old_section }}
 3
Author: Pasindu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-27 10:16:50

Myślę, że nie możesz - ale z drugiej strony, tego rodzaju logika powinna być obsługiwana w kontrolerze i przekazywana do widoku już ustawionego.

 2
Author: Darren Craig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-21 22:18:32

Hakowanie komentarzy nie jest zbyt czytelnym sposobem na to. Również redaktorzy pokolorują go jako komentarz i ktoś może go przegapić, przeglądając kod.

Spróbuj czegoś takiego:

{{ ''; $hello = 'world' }}

Skompiluje się do:

<?php echo ''; $hello = 'world'; ?>

...i wykonaj zadanie i niczego nie echo.

 1
Author: rotaercz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-11 06:46:07

Lepiej poćwiczyć zdefiniowanie zmiennej w kontrolerze, a następnie przejść do widoku za pomocą metody compact() LUB ->with().

Inaczej #TLGreg dał najlepszą odpowiedź.

 1
Author: Mandeep Gill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-05 12:02:21

Istnieje bardzo dobre rozszerzenie dla Blade radic / blade-extensions . Po dodaniu możesz użyć @set (variable_name, variable_value)

@set(var, 33)
{{$var}}
 1
Author: belov91,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-09 13:04:15

Szukałem sposobu, aby przypisać wartość do klucza i użyć go wiele razy, moim zdaniem. W tym przypadku możesz najpierw użyć @section{"key", "value"}, a następnie wywołać @yield{"key"}, Aby wyświetlić wartość w innych miejscach w widoku lub jego potomku.

 1
Author: Hafez Divandari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-22 22:15:59

Moim zdaniem lepiej byłoby zachować logikę w kontrolerze i przekazać ją do widoku do użycia. Można to zrobić na dwa sposoby używając metody 'View:: make'. Obecnie używam Laravel 3, ale jestem prawie pewien, że tak samo jest w Laravel 4.

public function action_hello($userName)
{
    return View::make('hello')->with('name', $userName);
}

Lub

public function action_hello($first, $last)
{
    $data = array(
        'forename'  => $first,
        'surname' => $last
    );
    return View::make('hello', $data);
}

Metoda 'with' jest łańcuchowa. Następnie użyłbyś powyższego w ten sposób:

<p>Hello {{$name}}</p>

Więcej informacji tutaj:

Http://three.laravel.com/docs/views

Http://codehappy.daylerees.com/using-controllers

 0
Author: Robert Brisita,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-22 18:07:16

Miałem podobne pytanie i znalazłem poprawne rozwiązanie View Composers

Komponenty widoków umożliwiają ustawianie zmiennych za każdym razem, gdy dany widok jest wywoływany, i mogą to być konkretne widoki lub całe szablony widoków. W każdym razie Wiem, że nie jest to bezpośrednia odpowiedź na pytanie (i 2 lata za późno), ale wydaje się to bardziej wdzięcznym rozwiązaniem niż ustawianie zmiennych w widoku za pomocą blade.
View::composer(array('AdminViewPath', 'LoginView/subview'), function($view) {
    $view->with(array('bodyClass' => 'admin'));
});
 0
Author: dug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-18 07:12:50

Laravel 5 możesz to łatwo zrobić . patrz poniżej

{{--*/ @$variable_name = 'value'  /*--}}
 0
Author: tapos ghosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-12 09:19:12

Można rozszerzyć blade za pomocą metody extend, jak pokazano poniżej..

Blade::extend(function($value) {
    return preg_replace('/\@var(.+)/', '<?php ${1}; ?>', $value);
});

Następnie inicjalizuj zmienne w następujący sposób.

@var $var = "var"
 0
Author: Lakitha Dias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-04-19 16:59:26

Wewnątrz pliku blade możesz użyć tego formatu

@php
  $i++
@endphp
 0
Author: Murtdha Dakhil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-09-14 10:18:44

Działa we wszystkich wersjach blade.

{{--*/  $optionsArray = ['A', 'B', 'C', 'D','E','F','G','H','J','K'] /*--}}
 -1
Author: Bakhtawar GIll,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-06 07:05:31