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


247

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

できることはわかっていますが<?php $old_section = "whatever"; ?>、エレガントではありません。

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


1
:このプルチェックgithub.com/laravel/laravel/pull/866
SPIR

これは、特にテンプレートで作業しているが、他の誰かがPHPの部分で作業している場合は特に、テストに役立ちます。テストが終了したら、宣言を削除するように注意してください。
トリシス

単に行うことの何が問題になってい<?php $old_section = "whatever"; ?>ますか。かなり読みやすいと思います。
Jaime Hablutzel、

@JaimeHablutzel私の意見では、答えは疑問です:それはエレガントではありません。
duality_

回答:


122

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

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

9
ビューの変数にはいくつかの用途があります。いいね!このコードをどこに置くのが良いでしょうか?
duality_ 2012年

1
あなたはそれをあなたのapplication / start.phpに置くことができます、またはあなたがこのようなより多くのものを持っているならば、それを別のファイルに入れて、そこに含めてください。Laravelはこのように非常にルーズです。コントローラーを薄くすることもできます。これらを行う必要があるのは、ビューがレンダリングされる前に拡張することだけです。
TLGreg 2012年

19
{?ネイティブを使用するだけでなく、使用するためだけにこの追加コードを追加する理由は何<?ですか?
ジャスティン

1
やる気がなければ、次のことを行う「より適切な」方法はありますか?タイトルがメインのアプリビューで{{$ title}}としてレンダリングされるサイトがあります。これには、タイトルにページ番号を追加する必要があるサブシステムが含まれています( "Application Form Page {{$ page}}")および$ pageをビューに渡します(ビュー内で使用されます)。各コントローラーコールでタイトルを作成したくありません。ビューにページ番号を送信したいだけです-いつかベースタイトルを変更したい場合に備えて。現在<?php $ title = ...?>を使用していますが、もっと正しい方法はありますか?
jdavidbakr

4
変数は、ビューでインラインで宣言するのではなく、コントローラーから渡す必要があります。グローバルテンプレートに変数が必要な場合は、サービスプロバイダー内に設定できます。stackoverflow.com/ a/ 36780419/922522。ページ固有のテンプレートに変数が必要な場合は、@ yieldを使用して、コントローラーを持つ子ビューから渡します。laravel.com/docs/5.1/blade#template-inheritance
Justin

361

LARAVEL 5.5以上

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

@php
$i = 1
@endphp

LARAVEL 5.2以上

あなたはただ使うことができます:

@php ($i = 1)

または、ブロックステートメントで使用できます。

@php
$i = 1
@endphp

ララヴェル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);
});

次に、次のいずれかを実行します。

簡単な解決策:怠惰な場合は、AppServiceProvider.phpのboot()関数にコードを追加してください。

より良いソリューション:独自のサービスプロバイダーを作成します。Laravel 5でブレードを拡張する方法については、https://stackoverflow.com/a/28641054/2169147を参照してください。この方法では少し作業が増えますが、プロバイダーの使用方法については良い練習になります:)

ララヴェル4

上記のコードをapp / start / global.php(または、それが良いと感じた場合は他の場所)の下部に置くだけです。


上記の変更後、以下を使用できます。

@define $i = 1

変数を定義します。


5
いいね!実装で任意のphpステートメントを実行できることに注意してください。@phpのようなsoemethingに名前を変更します。非常に便利...
igaster

非常に本当です。必要に応じて、 'define'を 'php'に名前変更できますが、テンプレートでphpを使いすぎるという落とし穴があります:)
Pim

1
@ C.delaFonteijneに感謝します。ネームスペースを使用している場合(必要な場合)、\は本当に必要です。上記のコードに\を追加しました。
ピム

1
Laravel 5.2以降、ほぼ正確な実装が標準となっていることに注意してください。@php(@i = 1)ブロックステートメントで使用または使用できます(で閉じる@endphp
Daan

1
「@php」「@ endphp」が「<?php」「?>」よりも「エレガント」なのはわかりません。数文字長くなります!それは、他のブレードディレクティブのように「@」で始まるからでしょうか。私たちの開発者は強迫的な束です!;-)
OMA

116

、テンプレートのコメント構文を使用して変数を定義/設定できます。

コメント構文は {{-- anything here is comment --}}、それによってレンダリングされます エンジンとして

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

だから少しのトリックでそれを使って変数を定義することができます、例えば

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

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


2
@ trying-tobemyself +1 | ベストプラクティスの方法ではありませんが、HTMLのインラインスタイルのように、テンプレート内のコードをすばやくハッキングするのに最適です。
Markus Hofmann 2013

121
あなたがあなたを憎むつもりの後でこのコードを見る人は誰でもいるので、このハックをすることはお勧めしません。
ジャスティン

2
ジャスティンに同意します。コメントタグはコメント用であり、コメント内でコメントを外して他のことを始めると問題が生じます
Leon

27
これはプレーンなol 'phpに勝るものではありません<?php $i=0; ?>
gyo

3
phpタグを使用する代わりにこれを行う意味は何ですか?読みづらい(コメントのように見える)ため、より多くの入力が必要であり、解析システムの更新により壊れる可能性があります。ポイントがあっても、ブレードテンプレートで変数を定義する方法に対する答えではありません。有権者の何が悪いのか分からない、おそらく彼らはこれをとても「マニアック」だと思ったのだろうか?meh ...
SuperDuck 2016年

52

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

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

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

次に、他の変数を使用できる場所ならどこでも使用できます

{{ $variable }}

唯一の欠点は、あなたの課題が回避策としてこれを行っていることに気付いていない誰かにとって間違いのように見えることです。


27

複雑すぎます。

単純なphpを使用するだけ

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

ドネシー。

(またはhttps://github.com/alexdover/blade-setもかなりまっすぐに見えます)

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

Laravel 4でテスト済み。

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


21

次の方法でブレードテンプレートエンジンに変数を設定できます

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

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


19

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

@php($old_section = "whatever")

または

@php
    $old_section = "whatever"
@endphp

15

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

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

次に、出力先をどこにでも{{ $yourVar }}印刷Your valueしますが、変数を保存しても出力は得られません。

編集:セクションの命名は必須です。そうでない場合、例外がスローされます。


機能しない何か他のものが含まれる必要があるUndefinedプロパティ:Illuminate \ View \ Factory :: $ startSection(ビュー:/home/vagrant/Code/dompetspy/resources/views/reviews/index.blade.php)
MaXi32

14

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


1
これは私が探していたものです:データベースでの重複した呼び出しを回避する素晴らしい方法!
clod986 2014年

これはLaravel 5のオプションではないようですか?
Goddard

@Goddardまだできます。ただし、構文は変更されています:stackoverflow.com/a/36780419/922522
Justin

8

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

たった1つの方法はありません。

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

11
モデルにHTMLを準備しますか?それは想像できる最も醜いものです。
duality_ 2013年

@duality_ビューで変数を宣言して変更しています。あなたはおそらくあなたのコードを間違って整理していると私は言った。Lrn 2アーキテクト。
マイケルJ.カルキンス2013年

3
確かに、マイケル...これらの変数はなどの変数ではなく$users = ...、に沿ったものな$css_class = ...ので、厳密には設計者が決定するモデルまたはコントローラーに属さない変数を設計します。
duality_ 2013年

2
そのルートに進む必要がある場合、私はよりシンプルでエレガントなソリューションを好みます。$ x = 1}}
Daniel

6

@Pimからの回答を拡張します。

これをAppServiceProviderのbootメソッドに追加します

<?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')


5

Laravel 5.1、5.2では

https://laravel.com/docs/5.2/views#sharing-data-with-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()
    {
        // ...
    }
}


3

私のエレガントな方法は次のようです

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

$old_section変数をエコーします。

{{ $old_section }}

3

PHP 7.0 を使用している場合

シンプルで最も効果的な方法は、括弧内の代入です。

ルールは簡単です。変数を複数回使用していますか?次に、括弧内で初めて使用するときに宣言し、落ち着いて続行します。

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

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

これで変数が使用されたときに宣言されるため、ブレードの回避策は必要ありません。


2

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


6
一部の変数はビュー専用です。$previous_group_name$separator_printedなど
duality_ 2012年

2
ビュー専用の場合は、コントローラーからビューに渡すだけです。すべてのビューで使用できるようにする場合は、上記の私の回答を使用してくださいapp/controllers/BaseController.php
ジャスティン

1
複数の配列を使用して、すべての$ dataをビューに送信しています
Hos Mercury

2

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

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

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

または

特別な構文でブレードコメントを使用できます

{{--*/ $var = 'test' /*--}}
{{ $var }}

1

コメントをハッキングすることは、読みやすい方法ではありません。また、編集者はコメントとしてそれを色付けし、コードを見ていると誰かがそれを見逃す可能性があります。

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

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

コンパイルされます:

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

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


1

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

それ以外の場合は#TLGregが最良の答えを出しました。



1

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


0

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


プレゼンテーションロジックはビュー内に保持するのが最適です。場合によっては、ビュー内から変数を作成する必要があります。たとえば、日付をフォーマットします。$format='Y-m-d H:i:s';そうすれば、ビュー内でそのフォーマットを再利用できます。これは確かにコントローラーには属していません。とはいえ、質問に答えて... <?php ?>タグに問題はありません。
グレイビー

0

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

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

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

0

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

{{--*/ @$variable_name = 'value'  /*--}}

0

以下に示すように、extendメソッドを使用してブレードを拡張できます。

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

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

@var $var = "var"

-1

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

{{--*/  $optionsArray = ['A', 'B', 'C', 'D','E','F','G','H','J','K'] /*--}}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.