Как установить переменные в шаблоне лезвия 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
В laravel-4, вы можете использовать синтаксис комментария шаблона для определения/установки переменных.
Синтаксис комментария {{-- anything here is comment --}}
и отображается blade как
<?php /* anything here is comment */ ?>
поэтому с небольшим трюком мы можем использовать его для определения переменных, например
{{-- */$i=0;/* --}}
будет отображаться blade как <?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"