Как установить переменные в шаблоне лезвия Laravel

php laravel laravel-4 laravel-blade

272534 просмотра

26 ответа

Я читал Laravel Клинок документации , и я не могу понять, как назначить переменные в шаблоне для последующего использования. Я не могу {{ $old_section = "whatever" }}этого сделать, потому что это будет звучать «что угодно», и я этого не хочу.

Я понимаю, что я могу сделать <?php $old_section = "whatever"; ?>, но это не элегантно.

Есть ли лучший, элегантный способ сделать это в шаблоне Blade?

Автор: duality_ Источник Размещён: 20.08.2019 05:18

Ответы (26)


112 плюса

Решение

Это не рекомендуется делать в представлении, поэтому для него нет метки лезвия. Если вы хотите сделать это в своем блейд-представлении, вы можете просто открыть тег php, как вы его написали, или зарегистрировать новый блейд-тег. Просто пример:

<?php
/**
 * 
 * {? $old_section = "whatever" ?}
 * 
 */
Blade::extend(function($value) {
    return preg_replace('/\{\?(.+)\?\}/', '', $value);
});
Автор: TLGreg Размещён: 22.10.2012 08:32

309 плюса

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
| 
| @define $variable = "whatever"
| 
|--------------------------------------------------------------------------
*/

\Blade::extend(function($value) {
    return preg_replace('/\@define(.+)/', '', $value);
});

Затем выполните одно из следующих действий:

Быстрое решение: если вам лень, просто поместите код в функцию boot () AppServiceProvider.php.

Более удачное решение: создать собственного поставщика услуг. См. Https://stackoverflow.com/a/28641054/2169147 о том, как расширить блейд в Laravel 5. Таким образом, немного больше работы, но хорошее упражнение о том, как использовать провайдеров :)

ЛАРАВЕЛ 4

Вы можете просто поместить приведенный выше код внизу app / start / global.php (или в любое другое место, если считаете, что это лучше).


После вышеуказанных изменений вы можете использовать:

@define $i = 1

определить переменную.

Автор: Pim Размещён: 02.09.2014 08:19

113 плюса

В вы можете использовать синтаксис комментария шаблона для определения / установки переменных.

Синтаксис комментария есть {{-- anything here is comment --}}и он обрабатывается движком как

<?php /* anything here is comment */ ?>

поэтому с небольшой хитростью мы можем использовать его для определения переменных, например,

{{-- */$i=0;/* --}}

будет оказывать , как , <?php /* */$i=0;/* */ ?>который устанавливает переменные для нас. Без изменения какой-либо строки кода.

Автор: Trying Tobemyself Размещён: 18.06.2013 07:05

48 плюса

Существует простой обходной путь, который не требует от вас изменения какого-либо кода, и он также работает в Laravel 4.

Вы просто используете оператор присваивания ( =) в выражении, переданном в @ifоператор, вместо (например) оператора, такого как ==.

@if ($variable = 'any data, be it string, variable or OOP') @endif

Тогда вы можете использовать его везде, где вы можете использовать любую другую переменную

{{ $variable }}

Единственным недостатком является то, что ваше назначение будет выглядеть как ошибка для кого-то, кто не знает, что вы делаете это в качестве обходного пути.

Автор: BTMPL Размещён: 30.05.2013 01:06

21 плюса

Я сделаю это слишком сложным.

Просто используйте обычный PHP

<?php $i = 1; ?>
{{$i}}

donesies.

(или https://github.com/alexdover/blade-set тоже выглядит довольно просто)

Мы все как бы "взламываем" систему, устанавливая переменные в представлениях, так зачем же делать "взлом" более сложным, чем нужно?

Проверено в Laravel 4.

Еще одним преимуществом является то, что подсветка синтаксиса работает должным образом (раньше я использовал хак комментариев, и это было ужасно читать)

Автор: Sabrina Leggett Размещён: 26.05.2015 01:16

18 плюса

Переменные можно задать в шаблонизаторе Blade следующими способами:

1. Общая
переменная настройки блока PHP : <?php $hello = "Hello World!"; ?>
Вывод: {{$hello}}

2.
Переменная настройки блока Blade PHP : @php $hello = "Hello World!"; @endphp
Вывод: {{$hello}}

Автор: Prince Ahmed Размещён: 13.05.2018 05:59

17 плюса

Начиная с Laravel 5.2.23, у вас есть директива @php Blade , которую вы можете использовать inline или как блок block:

@php($old_section = "whatever")

или же

@php
    $old_section = "whatever"
@endphp
Автор: Daan Размещён: 21.07.2016 09:21

12 плюса

Вы можете установить переменную в файле представления, но она будет напечатана так же, как вы ее установили. Во всяком случае, есть обходной путь. Вы можете установить переменную внутри неиспользуемого раздела. Пример:

@section('someSection')
  {{ $yourVar = 'Your value' }}
@endsection

Затем {{ $yourVar }}напечатает в Your valueлюбом месте, где вы хотите, но вы не получите вывод при сохранении переменной.

РЕДАКТИРОВАТЬ: наименование раздела требуется, в противном случае будет выдано исключение.

Автор: Vasile Goian Размещён: 10.05.2013 04:19

12 плюса

В Ларавеле 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-адреса ресурсов для своих изображений.

Автор: Justin Размещён: 06.02.2014 07:55

8 плюса

И вдруг ничего не появится. По моему опыту, если вам нужно сделать что-то подобное, подготовьте HTML-код в методе модели или сделайте некоторую реорганизацию своего кода в массивы или что-то в этом роде.

Там никогда не бывает только 1 способ.

{{ $x = 1 ? '' : '' }}
Автор: Michael J. Calkins Размещён: 27.03.2013 03:53

6 плюса

Я собираюсь расширить ответ, данный @Pim.

Добавьте это в метод загрузки вашего AppServiceProvider

<?php
/*
|--------------------------------------------------------------------------
| Extend blade so we can define a variable
| 
| @set(name, value)
| 
|--------------------------------------------------------------------------
*/

Blade::directive('set', function($expression) {
    list($name, $val) = explode(',', $expression);
    return "";
});

Таким образом, вы не предоставляете возможность писать любые выражения php.

Вы можете использовать эту директиву как:

@set($var, 10)
@set($var2, 'some string')
Автор: Carson Evans Размещён: 02.05.2016 11:25

4 плюса

В 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()
    {
        // ...
    }
}
Автор: Justin Размещён: 21.04.2016 09:02

4 плюса

Вы можете использовать пакет, который я опубликовал: https://github.com/sineld/bladeset

Тогда вы легко устанавливаете свою переменную:

@set('myVariable', $existing_variable)

// or

@set("myVariable", "Hello, World!")
Автор: Sinan Eldem Размещён: 11.10.2016 12:29

3 плюса

Что касается моего элегантного способа, как следующий

{{ ''; $old_section = "whatever"; }}

И просто повторить вашу $old_sectionпеременную.

{{ $old_section }}
Автор: Set Kyar Wa Lar Размещён: 17.10.2014 04:30

2 плюса

Я не думаю, что вы можете - но опять же, такая логика, вероятно, должна обрабатываться в вашем контроллере и передаваться в уже установленное представление.

Автор: Darren Craig Размещён: 21.10.2012 10:18

2 плюса

Если у вас PHP 7.0:

Самый простой и эффективный способ - с назначением внутри скобок .

Правило простое: вы используете свою переменную более одного раза? Затем объявите это в первый раз, когда оно будет использовано в скобках, сохраняйте спокойствие и продолжайте.

@if(($users = User::all())->count())
  @foreach($users as $user)
    {{ $user->name }}
  @endforeach
@else
  There are no users.
@endif

И да, я знаю @forelse, это просто демо.

Поскольку ваши переменные теперь объявляются как и когда они используются, нет необходимости в каких-либо обходных решениях.

Автор: Jonathan Размещён: 15.06.2016 10:38

2 плюса

Присвойте переменную шаблону блейда. Вот решения

Мы можем использовать <?php ?>тег на странице лезвия

<?php $var = 'test'; ?>
{{ $var }

ИЛИ ЖЕ

Мы можем использовать комментарий лезвия со специальным синтаксисом

{{--*/ $var = 'test' /*--}}
{{ $var }}
Автор: Nikunj K. Размещён: 24.10.2016 12:56

1 плюс

Взломать комментарии не очень читабельный способ сделать это. Редакторы также раскрасят его как комментарий, и кто-то может пропустить его при просмотре кода.

Попробуйте что-то вроде этого:

{{ ''; $hello = 'world' }}

Он будет скомпилирован в:

<?php echo ''; $hello = 'world'; ?>

... и делать задание и ничего не повторять.

Автор: rotaercz Размещён: 11.12.2014 06:46

1 плюс

Лучше попрактиковаться в определении переменной в Controller, а затем перейти к просмотру с помощью метода compact()или ->with().

В противном случае #TLGreg дал лучший ответ.

Автор: Mandeep Gill Размещён: 05.07.2015 12:02

1 плюс

Существует очень хорошее расширение для radic / blade-расширений Blade . После добавления вы можете использовать @set (имя_переменной, значение_переменной)

@set(var, 33)
{{$var}}
Автор: belov91 Размещён: 09.12.2015 01:04

1 плюс

Вы можете легко сделать это. увидеть ниже

{{--*/ @$variable_name = 'value'  /*--}}
Автор: tapos ghosh Размещён: 12.03.2016 09:19

1 плюс

Я искал способ присвоить значение ключу и использовать его много раз, на мой взгляд. В этом случае вы можете использовать @section{"key", "value"}в первую очередь, а затем вызывать @yield{"key"}для вывода значения в других местах вашего представления или его дочернего элемента.

Автор: Hafez Divandari Размещён: 22.04.2016 10:15

0 плюса

На мой взгляд, было бы лучше сохранить логику в контроллере и передать ее для использования. Это можно сделать одним из двух способов, используя метод 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

Автор: Robert Brisita Размещён: 15.08.2013 04:37

0 плюса

У меня был похожий вопрос, и я нашел то, что я считаю правильным решением с View Composers

Композиторы представлений позволяют устанавливать переменные каждый раз, когда вызывается определенное представление, и они могут быть конкретными представлениями или шаблонами представления целиком. В любом случае, я знаю, что это не прямой ответ на вопрос (и на 2 года позже), но кажется, что это более изящное решение, чем установка переменных в представлении с лезвием.

View::composer(array('AdminViewPath', 'LoginView/subview'), function($view) {
    $view->with(array('bodyClass' => 'admin'));
});
Автор: dug Размещён: 18.08.2014 07:12

0 плюса

работает во всех версиях клинка.

{{--*/  $optionsArray = ['A', 'B', 'C', 'D','E','F','G','H','J','K'] /*--}}
Автор: Bakhtawar GIll Размещён: 06.10.2016 07:05

0 плюса

Вы можете расширить лезвие, используя метод расширения, как показано ниже.

Blade::extend(function($value) {
    return preg_replace('/\@var(.+)/', '<?php ${1}; ?>', $value);
});

после этого инициализируйте переменные следующим образом.

@var $var = "var"
Автор: Lakitha Dias Размещён: 19.04.2019 04:59
Вопросы из категории :
32x32