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

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

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

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

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

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

LARAVEL 5.2 И ВВЕРХ

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

 @php ($i = 1) 

Или вы можете использовать его в блочном выражении:

 @php $i = 1 @endphp 

LARAVEL 5

Расширьте Blade следующим образом:

 /* |-------------------------------------------------------------------------- | 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.

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

LARAVEL 4

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


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

 @define $i = 1 

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

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

Синтаксис комментария – {{-- anything here is comment --}} и он обрабатывается клиентом в качестве

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

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

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

будет обрабатываться клином как <?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.

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

В Laravel 4:

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

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

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

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

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

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

 @section {{ $yourVar = 'Your value' }} @endsection 

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

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

 @php($old_section = "whatever") 

или

 @php $old_section = "whatever" @endphp 

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

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

 {{ $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') 

В 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() { // ... } } 

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

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

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

И просто $old_section переменную $old_section .

 {{ $old_section }} 

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

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

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

ИЛИ

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

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

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

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

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

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

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

… и выполняйте задание, а не эхо ничего.

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

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

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

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

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

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

Если у вас есть PHP 7.0:

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

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

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

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

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

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

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

 @set('myVariable', $existing_variable) // or @set("myVariable", "Hello, World!") 

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

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

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

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

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

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