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


Я читаю что Laravel лезвие templating docs и я не могу найти, как я могу назначить переменные внутри шаблона для использования позже в шаблоне. Я не могу сделать {{ $old_section = "whatever" }} потому что это будет эхом "что угодно", и я этого не хочу.

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

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

25 177

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 --}} и он отображается с помощью blade двигатель

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

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

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

будет отображаться bladeкак <?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 тоже выглядит довольно straighforward)

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

проверено в Laravel 4.

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

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

@php($old_section = "whatever")

или

@php
    $old_section = "whatever"
@endphp

В Laravel 4:

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

просто добавьте следующее в приложение/контроллеры/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 ? '' : '' }}

Я собираюсь расширить ответ, данный @Pim.

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

Вы Можете Установить Переменные В Blade Templating Engine Следующими Способами:

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

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

В Laravel 5.1, 5.2:

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

возможно, Вам придется поделиться частью данных с все взгляды которые отображаются вашим приложением. Это можно сделать с помощью метода общего доступа фабрики представлений. Как правило, вы должны размещать вызовы для совместного использования в методе загрузки поставщика услуг. Вы можете добавить их в 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'] /*--}}