Лезвие фреймворк Laravel: как я могу задать переменные в шаблоне?
Я читаю Laravel Blade templating docs и я не могу найти, как я могу назначить переменные внутри шаблона для использования позже в шаблоне. Я не могу этого сделать!--0--> потому что это "эхо", "что" и я этого не хочу.
Я вижу, что могу сделать <?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 --}}
и он отображается лопатки двигатель as
<?php /* anything here is comment */ ?>
таким образом, с небольшим трюком мы можем использовать его для определения переменных, например
{{-- */$i=0;/* --}}
будет отображаться лопаткиas
<?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.
еще одно преимущество заключается в том, что подсветка синтаксиса работает правильно (я был используя comment hack раньше, и это было ужасно читать)
начиная с Laravel 5.2.23, у вас есть @php Blade директива, который вы можете использовать inline или как оператор блока:
@php($old_section = "whatever")
или
@php
$old_section = "whatever"
@endphp
В Laravel 4:
Если вы хотите, чтобы переменная была доступна во всех ваших представлениях, а не только в вашем шаблоне, View::share
большой метод (подробнее об этом блоге).
просто добавьте следующее в app / контроллеры / 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 ? '' : '' }}
я расширю ответ @Пим.
добавьте это в метод загрузки вашего 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')
Вы Можете Установить Переменные В Движке Шаблонов Лезвий Следующими Способами:
1. Общий блок PHP
Настройки Переменной: <?php $hello = "Hello World!"; ?>
выход: {{$hello}}
2. Blade PHP Block
Настройки Переменной: @php $hello = "Hello World!"; @endphp
выход: {{$hello}}
В 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()
{
// ...
}
}
вы можете использовать пакет я написал: 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'));
});
работает во всех версиях blade.
{{--*/ $optionsArray = ['A', 'B', 'C', 'D','E','F','G','H','J','K'] /*--}}