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

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

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

Есть ли лучший, элегантный способ сделать это в шаблоне Blade?

Ответ 1

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

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

Ответ 2

LARAVEL 5.5 и выше

Директива @php blade больше не принимает встроенные теги. Вместо этого используйте полную форму директивы:

@php
$i = 1
@endphp

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 ${1}; ?>', $value);
});

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

Быстрое решение: если вам лень, просто поместите код в функцию boot() AppServiceProvider.php.

Более удачное решение: создать собственного поставщика услуг. См. fooobar.com/questions/41439/... о том, как расширить блейд в Laravel 5. В этом случае немного больше работы, но хорошее упражнение о том, как использовать провайдеров :)

ЛАРАВЕЛ 4

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


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

@define $i = 1

определить переменную.

Ответ 3

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

Синтаксис комментария {{-- anything here is comment --}} и отображается как

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

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

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

будет отображаться как   <?php /* */$i=0;/* */ ?>, который устанавливает для нас переменную. Без изменения какой-либо строки кода.

Ответ 4

Существует одно обходное решение, которое не требует изменения какого-либо кода, и оно также работает в Laravel 4.

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

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

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

{{ $variable }}

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

Ответ 5

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

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

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

donesies.

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

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

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

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

Ответ 6

Вы можете установить переменные в шаблонном движке Blade следующими способами:

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

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

Ответ 7

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

@php($old_section = "whatever")

или

@php
    $old_section = "whatever"
@endphp

Ответ 8

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

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

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

РЕДАКТИРОВАТЬ: наименование раздела требуется, в противном случае будет выдано исключение.

Ответ 9

В Ларавеле 4:

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

Просто добавьте следующее в app/controllers/BaseController.php

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

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

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

Ответ 10

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

Существует не один способ.

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

Ответ 11

Я продолжу ответ, полученный @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')

Ответ 12

В Laravel 5.1, 5.2:

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

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

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

<?php

namespace App\Providers;

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

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

Ответ 13

Вы можете использовать пакет, который я опубликовал: https://github.com/sineld/bladeset

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

@set('myVariable', $existing_variable)

// or

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

Ответ 14

Что касается моего элегантного способа, то это выглядит как

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

И просто откликните свою переменную $old_section.

{{ $old_section }}

Ответ 15

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

Ответ 16

Если у вас PHP 7.0:

Простой и эффективный способ заключается в назначении внутри скобок.

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

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

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

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

Ответ 17

Назначьте переменную шаблону лезвия. Ниже приведены решения

Мы можем использовать тег <?php ?> на странице клика

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

ИЛИ

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

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

Ответ 18

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

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

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

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

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

... и выполняйте назначение, а не эхо-сообщение.

Ответ 19

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

В противном случае #TLGreg дал лучший ответ.

Ответ 20

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

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

Ответ 21

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

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

Ответ 22

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

Ответ 23

По-моему, было бы лучше сохранить логику в контроллере и передать ее в режим просмотра. Это можно сделать одним из двух способов, используя метод "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

Ответ 24

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

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

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

Ответ 25

работает во всех версиях клинка.

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

Ответ 26

Вы можете расширить лезвие, используя метод расширения, как показано ниже.

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

после этого инициализируйте переменные следующим образом.

@var $var = "var"