Я читаю документы шаблонов 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>
Дополнительная информация здесь:
У меня был аналогичный вопрос, и я нашел, что считаю правильным решением с 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'] /*--}}