Я читаю Laravel Blade templating docs, и я не могу найти, как я могу назначать переменные внутри шаблона для использования позже шаблон. Я не могу сделать {{ $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 И UP
Вы можете просто использовать:
@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/questions/18329541/where-to-place-bladeextend о том, как расширить лезвие в 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 тоже выглядит довольно страшно)
Мы все вроде "взламываем" систему, задавая переменные в представлениях, поэтому зачем "взломать" сложнее, чем это должно быть?
Протестировано в Laravel 4.
Другим преимуществом является то, что подсветка синтаксиса работает должным образом (раньше я пользовался комментарием, и было ужасно читать)
В Laravel 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-адресов ресурсов для конкретных объектов для моих изображений.
Вы можете установить переменную в файле вида, но она будет напечатана так же, как вы ее установили. Во всяком случае, есть обходной путь. Вы можете установить переменную внутри неиспользуемого раздела. Пример:
@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
Возможно, вам понадобится поделиться куском данных с всеми представлениями, которые отображаются вашим приложением. Вы можете сделать это, используя метод представления factory. Как правило, вы должны размещать вызовы для совместного использования в рамках способа загрузки поставщика услуг. Вы можете добавлять их в 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 }}
Я не думаю, что вы можете - но опять же, такая логика, вероятно, должна быть обработана в вашем контроллере и передана в уже установленное представление.
$previous_group_name
, $separator_printed
и т. д.
app/controllers/BaseController.php
.
Назначьте переменную шаблону лезвия. Ниже приведены решения
Мы можем использовать тег <?php ?>
на странице клика
<?php $var = 'test'; ?>
{{ $var }
ИЛИ
Мы можем использовать комментарий к лезвию со специальным синтаксисом
{{--*/ $var = 'test' /*--}}
{{ $var }}
Вы можете использовать пакет, который я опубликовал: https://github.com/sineld/bladeset
Тогда вы легко установите свою переменную:
@set('myVariable', $existing_variable)
// or
@set("myVariable", "Hello, World!")
Если у вас PHP 7.0:
Простой и эффективный способ заключается в назначении внутри скобок.
Правило прост: вы используете свою переменную более одного раза? Затем объявите его в первый раз, когда он используется в скобках, сохраняйте спокойствие и продолжайте.
@if(($users = User::all())->count())
@foreach($users as $user)
{{ $user->name }}
@endforeach
@else
There are no users.
@endif
И да, я знаю о @forelse
, это просто демо.
Так как ваши переменные теперь объявлены как и когда они используются, нет необходимости в каких-либо обходных методах.
laravel 5 вы можете легко это сделать. см. ниже
{{--*/ @$variable_name = 'value' /*--}}
Существует очень хорошее расширение для Blade radic/blade-extensions. После его добавления вы можете использовать @set (variable_name, variable_value)
@set(var, 33)
{{$var}}
Лучше практиковать определение переменной в контроллере, а затем перейти к просмотру с помощью метода compact()
или ->with()
.
В противном случае #TLGreg дал лучший ответ.
Взлом комментариев - это не очень читаемый способ сделать это. Также редакторы будут раскрашивать его как комментарий, и кто-то может пропустить его при просмотре кода.
Попробуйте что-то вроде этого:
{{ ''; $hello = 'world' }}
Он будет скомпилирован в:
<?php echo ''; $hello = 'world'; ?>
... и выполняйте назначение, а не эхо-сообщение.
работает во всех версиях клинка.
{{--*/ $optionsArray = ['A', 'B', 'C', 'D','E','F','G','H','J','K'] /*--}}
Я искал способ присвоить значение ключу и использовать его много раз в моем представлении. В этом случае вы можете использовать @section{"key", "value"}
в первую очередь, а затем вызвать @yield{"key"}
для вывода значения в других местах вашего представления или его дочернего элемента.
У меня был аналогичный вопрос и нашел, что я считаю правильным решением с Просмотр композиторов
View Composers позволяют вам устанавливать переменные каждый раз, когда вызывается определенное представление, и могут быть конкретными представлениями или целыми шаблонами. Во всяком случае, я знаю, что это не прямой ответ на вопрос (и еще 2 года слишком поздно), но это выглядит как более изящное решение, чем установка переменных в виде с лезвием.
View::composer(array('AdminViewPath', 'LoginView/subview'), function($view) {
$view->with(array('bodyClass' => 'admin'));
});
По-моему, было бы лучше сохранить логику в контроллере и передать ее в режим просмотра. Это можно сделать одним из двух способов, используя метод "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>
Дополнительная информация здесь:
$format='Ymd H:i:s';
таким образом, вы можете повторно использовать этот формат в представлении. Это, конечно, не принадлежит контроллеру. Тем не менее, в ответ на вопрос ... В тегах <?php ?>
Нет ничего плохого.