Лезвие фреймворк Laravel: как я могу задать переменные в шаблоне?

Я читаю Laravel Blade templating docs и я не могу найти, как я могу назначить переменные внутри шаблона для использования позже в шаблоне. Я не могу этого сделать!--0--> потому что это "эхо", "что" и я этого не хочу.

Я вижу, что могу сделать <?php $old_section = "whatever"; ?>, но это не элегантно.

есть ли элегантный способ сделать это в Blade?

25 ответов


это не рекомендуется делать в представлении, поэтому для него нет тега blade. Если вы хотите сделать это в своем представлении blade, Вы можете просто открыть тег php, как вы его написали, или зарегистрировать новый тег blade. Просто пример:

<?php
/**
 * <code>
 * {? $old_section = "whatever" ?}
 * </code>
 */
Blade::extend(function($value) {
    return preg_replace('/\{\?(.+)\?\}/', '<?php  ?>', $value);
});

LARAVEL 5.2 И ВЫШЕ

вы можете просто использовать:

@php ($i = 1)

или вы можете использовать его в заявлении блока:

@php
$i = 1
@endphp

фреймворк Laravel 5

расширить лезвие, как это:

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

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

затем выполните одно из следующих действий:

быстрое решение: если вы ленивы, просто поместите код в функцию boot () AppServiceProvider.РНР.

лучше решение: Создайте собственного поставщика услуг. Видеть https://stackoverflow.com/a/28641054/2169147 о том, как расширить лезвие в Laravel 5. Это немного больше работы таким образом, но хорошее упражнение о том, как использовать провайдеров :)

что Laravel 4

вы можете просто поставить выше код app / start / global.в PHP (или любое другое место, если вы чувствуете, что лучше).


после вышеуказанных изменений, вы можете использовать:

@define $i = 1

для определения переменной.


на фреймворк Laravel-4, вы можете использовать синтаксис комментария шаблона для определения / установки переменных.

синтаксис комментария {{-- anything here is comment --}} и он отображается лопатки двигатель as

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

таким образом, с небольшим трюком мы можем использовать его для определения переменных, например

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

будет отображаться лопаткиas <?php /* */$i=0;/* */ ?> задает переменную для нас. Не меняя ни строчки кода.


существует простой обходной путь, который не требует изменения кода, и он также работает в Laravel 4.

вы просто используете оператор присваивания (=) в выражении для @if оператор, а не (например) оператор, такой как ==.

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

затем вы можете использовать его в любом месте вы можете использовать любую другую переменную

{{ $variable }}

единственным недостатком является ваше назначение будет посмотреть как ошибку кто-то не знает, что вы делаете это в качестве обходного пути.


Вы делаете это слишком сложным.

просто используйте простой php

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

donesies.

(или https://github.com/alexdover/blade-set выглядит довольно прямолинейно тоже)

мы все своего рода" взламываем "систему, устанавливая переменные в представлениях, так зачем усложнять" взлом", тогда это должно быть?

протестировано в Laravel 4.

еще одно преимущество заключается в том, что подсветка синтаксиса работает правильно (я был используя comment hack раньше, и это было ужасно читать)


начиная с Laravel 5.2.23, у вас есть @php Blade директива, который вы можете использовать inline или как оператор блока:

@php($old_section = "whatever")

или

@php
    $old_section = "whatever"
@endphp

В Laravel 4:

Если вы хотите, чтобы переменная была доступна во всех ваших представлениях, а не только в вашем шаблоне, View::share большой метод (подробнее об этом блоге).

просто добавьте следующее в app / контроллеры / BaseController.в PHP

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

и теперь $myvar будет доступен для всех ваших представлений , включая ваш шаблон.

я использовал это, чтобы установить URL-адреса конкретных активов среды для моего изображения.


вы можете установить переменную в файле представления, но она будет напечатана так же, как вы ее установили. В любом случае, есть обходной путь. Вы можете установить переменную внутри неиспользуемого раздела. Пример:

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

затем {{ $yourVar }} печати Your value везде, где вы хотите, но вы не получаете результат при сохранении переменной.

EDIT: именование раздела требуется, иначе будет создано исключение.


и вдруг ничего не появится. По моему опыту, если вам нужно сделать что-то вроде этого, подготовьте html в методе модели или сделайте некоторую реорганизацию своего кода в массивы или что-то еще.

никогда не бывает только 1 способ.

{{ $x = 1 ? '' : '' }}

я расширю ответ @Пим.

добавьте это в метод загрузки вашего 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}; ?>";
});

таким образом, вы не предоставляете возможность писать любое выражение php.

Вы можете использовать эту директиву, как:

@set($var, 10)
@set($var2, 'some string')

Вы Можете Установить Переменные В Движке Шаблонов Лезвий Следующими Способами:

1. Общий блок PHP
Настройки Переменной: <?php $hello = "Hello World!"; ?>
выход: {{$hello}}

2. Blade PHP Block
Настройки Переменной: @php $hello = "Hello World!"; @endphp
выход: {{$hello}}


В Laravel 5.1, 5.2:

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

вам может потребоваться поделиться частью данных с все взгляды которые отображаются вашим приложением. Это можно сделать с помощью метода share фабрики представлений. Как правило, вызовы для совместного использования следует размещать в методе загрузки поставщика услуг. Вы можете добавить их в AppServiceProvider или создать отдельную службу поставщик, чтобы разместить их.

редактировать файл: /app/Providers/AppServiceProvider.php

<?php

namespace App\Providers;

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

    public function register()
    {
        // ...
    }
}

вы можете использовать пакет я написал: https://github.com/sineld/bladeset

тогда вы легко установите переменную:

@set('myVariable', $existing_variable)

// or

@set("myVariable", "Hello, World!")

Я не думаю, что вы можете - но опять же, такая логика, вероятно, должна обрабатываться в вашем контроллере и передаваться в уже установленное представление.


Что касается моего элегантного способа, то это похоже на следующее

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

и просто эхо вашего $old_section переменной.

{{ $old_section }}

Если у вас PHP 7.0:

простой и самый эффективный способ-с назначением внутри скобок.

правило простое: вы используете переменную более одного раза? Затем объявите его в первый раз, когда он используется в скобках, сохраняйте спокойствие и продолжайте.

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

и да, я знаю, о @forelse, это просто демо.

поскольку ваши переменные были объявлены как и когда они используются, есть не надо никаких лезвие обходные пути.


хакерские комментарии не очень читаемый способ сделать это. Также редакторы раскрасят его как комментарий, и кто-то может пропустить его при просмотре кода.

попробуйте что-то вроде этого:

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

Он будет компилироваться в:

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

...и выполняйте задание и не повторяйте ничего.


лучше практиковать, чтобы определить переменную в контроллере, а затем перейти к просмотру с помощью compact() или ->with() метод.

иначе #TLGreg дал лучший ответ.


существует очень хорошее расширение для Blade radic / blade-extensions. После его добавления вы можете использовать @set (variable_name, variable_value)

@set(var, 33)
{{$var}}

laravel 5 Вы можете легко сделать это . смотрите ниже

{{--*/ @$variable_name = 'value'  /*--}}

Я ищу способ, чтобы присвоить значение ключа и использовать его много раз, на мой взгляд. Для этого случая можно использовать @section{"key", "value"} в первую очередь, а затем вызвать @yield{"key"} для вывода значения в других местах вашего представления или его дочернего элемента.


назначить переменную шаблону лезвия, вот решения

можно использовать <?php ?> метка в blade page

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

или

мы можем использовать комментарий blade со специальным синтаксисом

{{--*/ $var = 'test' /*--}}
{{ $var }}

на мой взгляд было бы лучше, чтобы сохранить логику в контроллере и передать его в представление. Это можно сделать одним из двух способов с помощью метода "View::make". В настоящее время я использую Laravel 3, но я уверен, что это то же самое в Laravel 4.

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

или

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

метод " С " является цепным. Затем вы будете использовать вышеизложенное следующим образом:

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

больше информации здесь:

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

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


У меня был аналогичный вопрос и нашел то, что я думаю, чтобы быть правильным решением с Посмотреть Композиторов

View Composers позволяет устанавливать переменные при каждом вызове определенного представления, и они могут быть конкретными представлениями или целыми шаблонами представлений. Во всяком случае, я знаю, что это не прямой ответ на вопрос (и 2 года слишком поздно), но это кажется более изящным решением, чем установка переменных в представлении с помощью blade.

View::composer(array('AdminViewPath', 'LoginView/subview'), function($view) {
    $view->with(array('bodyClass' => 'admin'));
});

работает во всех версиях blade.

{{--*/  $optionsArray = ['A', 'B', 'C', 'D','E','F','G','H','J','K'] /*--}}