Лезвие Laravel: как я могу установить переменные в шаблоне?
Я читаю что Laravel лезвие templating docs и я не могу найти, как я могу назначить переменные внутри шаблона для использования позже в шаблоне. Я не могу сделать {{ $old_section = "whatever" }}
потому что это будет эхом "что угодно", и я этого не хочу.
Я вижу, что я могу сделать <?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 --}}
и он отображается с помощью 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}}
Я искал способ присвоить значение ключу и использовать его много раз в моем представлении. В этом случае, вы можете использовать
@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>
больше информации здесь:
У меня был аналогичный вопрос и нашел то, что я думаю, чтобы быть правильным решением с Посмотреть Композиторов
View Composers позволяют устанавливать переменные каждый раз, когда вызывается определенное представление, и они могут быть конкретными представлениями или целыми шаблонами представлений. В любом случае, я знаю, что это не прямой ответ на вопрос (и 2 года слишком поздно), но это кажется более изящным решением, чем установка переменных в представлении с blade.
View::composer(array('AdminViewPath', 'LoginView/subview'), function($view) { $view->with(array('bodyClass' => 'admin')); });