web-dev-qa-db-ja.com

Laravelブレードテンプレートに変数を設定する方法

Laravel Blade のドキュメント を読んでいますが、後で使用するためにテンプレート内で変数を割り当てる方法がわかりません。私は{{ $old_section = "whatever" }}をすることができません。なぜならそれは「何でも」を反映し、私はそれを望まないからです。

私は<?php $old_section = "whatever"; ?>を実行できることを理解していますが、それは優雅ではありません。

Bladeテンプレートでこれを行うためのより優れたエレガントな方法はありますか?

202
duality_

ビュー内で行うことはお勧めできません。そのため、ブレードタグはありません。ブレードビューでこれを行いたい場合は、phpタグを書いたとおりに開くか、または新しいブレードタグを登録することができます。ほんの一例です。

<?php
/**
 * <code>
 * {? $old_section = "whatever" ?}
 * </code>
 */
Blade::extend(function($value) {
    return preg_replace('/\{\?(.+)\?\}/', '<?php ${1} ?>', $value);
});
111
TLGreg

LARAVEL 5.5以上

@php bladeディレクティブはインラインタグを受け付けなくなりました。代わりに、完全形式のディレクティブを使用してください。

@php
$i = 1
@endphp

LARAVEL 5.2以上

あなただけを使用することができます:

@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);
});

その後、次のいずれかを行います。

素早い解決策:あなたが怠惰な場合は、AppServiceProvider.phpのboot()関数にコードを入れるだけです。

よりよい解決策:独自のサービスプロバイダを作成してください。 Laravel 5.でブレードを拡張する方法については、 https://stackoverflow.com/a/28641054/2169147 を参照してください。より多くの方法がこのように動作しますが、プロバイダを使用する方法についてのよい練習:)

LARAVEL 4

上記のコードをapp/start/global.phpの一番下に置くことができます(それが良いと感じる場合は他の場所にも)。


上記の変更後は、次のものを使用できます。

@define $i = 1

変数を定義します。

291
Pim

laravel-4 では、テンプレートコメント構文を使用して変数を定義または設定できます。

コメントの構文は{{-- anything here is comment --}}で、 blade エンジンによって次のようにレンダリングされます。

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

そのため、ちょっとしたトリックで、それを使って変数を定義することができます。例えば、

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

blade によって変数が設定される<?php /* */$i=0;/* */ ?>としてレンダリングされます。コードを変更することなく。

111

コードを変更する必要のない簡単な回避策があります。それはLaravel 4でも同様に機能します。

=などの演算子ではなく、@ifステートメントに渡される式で代入演算子(==)を使用するだけです。

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

それからあなたは他の変数を使うことができるどこでもそれを使うことができます

{{ $variable }}

唯一のマイナス面は、あなたの割り当てがが、回避策としてこれをやっていることに気付いていない人への間違いのように見えることです。

47
BTMPL

屋はそれをあまりにも複雑にしているでしょう。

普通のphpを使うだけ

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

ドネシー。

(または https://github.com/alexdover/blade-set もかなり単純明快です)

私たちはみんなビューに変数を設定することでシステムをちょっと「ハッキング」しているのですが、なぜ「ハック」をもっと複雑にする必要があるのでしょうか。

Laravel 4でテスト済み。

もう1つの利点は、構文の強調表示が正しく機能することです(私は以前はコメントハックを使用していましたが、読むのはひどいことでした)。

20
Sabrina Leggett

以下の方法でBlade Templating Engineに変数を設定できます。

1。一般PHPブロック
設定変数:<?php $hello = "Hello World!"; ?>
出力:{{$hello}}

2。ブレードPHPブロック
設定変数:@php $hello = "Hello World!"; @endphp
出力:{{$hello}}

18
Prince Ahmed

Laravel 5.2.23以降、 @ php Bladeディレクティブ があります。これは、インラインステートメントまたはブロックステートメントとして使用できます。

@php($old_section = "whatever")

または

@php
    $old_section = "whatever"
@endphp
17
Daan

In 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を設定しました。

12
Justin

ビューファイルで変数を設定できますが、設定したとおりに印刷されます。とにかく、回避策があります。未使用セクション内に変数を設定できます。例:

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

そうすると{{ $yourVar }}Your valueを好きな場所に表示しますが、変数を保存しても出力は得られません。

EDIT:セクションの命名が必要です。そうでなければ例外が発生します。

12
Vasile Goian

そして突然何も現れないでしょう。私の経験からすると、このようなことをする必要がある場合は、モデルのメソッドでHTMLを準備するか、コードを配列などに再編成する必要があります。

唯一の方法はありません。

{{ $x = 1 ? '' : '' }}
8

@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')
6
Carson Evans

私が公開したパッケージを使うことができます。 https://github.com/sineld/bladeset

それからあなたは簡単にあなたの変数を設定します:

@set('myVariable', $existing_variable)

// or

@set("myVariable", "Hello, World!")
4
Sinan Eldem

In Laravel 5.1、5.2

https://laravel.com/docs/5.2/views#sharing-data-with-all-views

アプリケーションによってレンダリングされる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()
    {
        // ...
    }
}
4
Justin

私のエレガントなやり方は以下のようです

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

そして$old_section変数をエコーするだけです。

{{ $old_section }}
3
Set Kyar Wa Lar

私はあなたができるとは思わない - しかし、この場合もまた、この種のロジックはおそらくあなたのコントローラで処理され、すでに設定されているビューに渡されるべきです。

2
Darren Craig

ブレードテンプレートに変数を割り当てます、これが解決策です

ブレードページで<?php ?>タグを使用できます

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

OR

ブレードコメントは特別な構文で使えます

{{--*/ $var = 'test' /*--}}
{{ $var }}
2
Nikunj K.

PHP 7.0がある場合

簡単で最も効果的な方法は、を角括弧で囲むことです。

ルールは簡単です:あなたは複数回あなたの変数を使用しますか?それからそれが括弧の中で使われた最初の時にそれを宣言し、落ち着いて続けてください。

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

そして、はい、私は@forelseについて知っています、これは単なるデモです。

変数は使用時に宣言されているので、ブレードの回避策は必要ありません。

2
Jonathan

キーに値を割り当て、私の考えでは何度も使う方法を探していました。この場合、最初の場所で@section{"key", "value"}を使用してから@yield{"key"}を呼び出して、ビューまたはその子の他の場所に値を出力できます。

1
Hafez Divandari

コメントをハックすることはそれをするための非常に読みやすい方法ではありません。また、編集者はそれをコメントとして色付けするでしょう、そしてコードを通して見るとき誰かがそれを見逃すかもしれません。

このようなことを試してください:

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

それはコンパイルされます:

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

...割り当てを行い、何もエコーしません。

1
rotaercz

laravel 5あなたは簡単にこれを行うことができます。下記参照

{{--*/ @$variable_name = 'value'  /*--}}
1
tapos ghosh

Controllerで変数を定義してからcompact()または->with()メソッドを使用してビューに渡すことをお勧めします。

そうでなければ#TLGregが最良の答えを出しました。

1
Mandeep Gill

Blade radic/blade-extensions には非常に良い拡張があります。追加した後は@set(variable_name、variable_value)を使用できます。

@set(var, 33)
{{$var}}
1
belov91

私は同様の質問をして、私が View Composers で正しい解決策であると思うものを見つけました

ビューコンポーザを使用すると、特定のビューが呼び出されるたびに変数を設定でき、それらは特定のビューまたはビューテンプレート全体にすることができます。とにかく、私はそれが質問への直接的な答えではないことを知っています(そして2年が遅すぎます)が、それはブレードでビュー内に変数を設定するよりも優雅な解決策のように思えます。

View::composer(array('AdminViewPath', 'LoginView/subview'), function($view) {
    $view->with(array('bodyClass' => 'admin'));
});
0
dug

私の意見では、ロジックをコントローラ内に保持してそれをビューに渡して使用するほうが良いでしょう。これは 'View :: make'メソッドを使用して2つの方法のうちの1つで行うことができます。私は現在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);
}

'with'メソッドは連鎖可能です。そうすると上記のようになるでしょう。

<p>Hello {{$name}}</p>

ここでより多くの情報:

http://three.laravel.com/docs/views

http://codehappy.daylerees.com/using-controllers

0
Robert Brisita

ブレードのすべてのバージョンで動作します。

{{--*/  $optionsArray = ['A', 'B', 'C', 'D','E','F','G','H','J','K'] /*--}}
0
Bakhtawar GIll

下記のようにextendメソッドを使ってブレードを拡張することができます。

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

その後、次のように変数を初期化します。

@var $var = "var"
0
Lakitha Dias