Laravel Blade のドキュメント を読んでいますが、後で使用するためにテンプレート内で変数を割り当てる方法がわかりません。私は{{ $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.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
変数を定義します。
コードを変更する必要のない簡単な回避策があります。それはLaravel 4でも同様に機能します。
=
などの演算子ではなく、@if
ステートメントに渡される式で代入演算子(==
)を使用するだけです。
@if ($variable = 'any data, be it string, variable or OOP') @endif
それからあなたは他の変数を使うことができるどこでもそれを使うことができます
{{ $variable }}
唯一のマイナス面は、あなたの割り当てがが、回避策としてこれをやっていることに気付いていない人への間違いのように見えることです。
屋はそれをあまりにも複雑にしているでしょう。
普通のphpを使うだけ
<?php $i = 1; ?>
{{$i}}
ドネシー。
(または https://github.com/alexdover/blade-set もかなり単純明快です)
私たちはみんなビューに変数を設定することでシステムをちょっと「ハッキング」しているのですが、なぜ「ハック」をもっと複雑にする必要があるのでしょうか。
Laravel 4でテスト済み。
もう1つの利点は、構文の強調表示が正しく機能することです(私は以前はコメントハックを使用していましたが、読むのはひどいことでした)。
以下の方法でBlade Templating Engineに変数を設定できます。
1。一般PHPブロック
設定変数:<?php $hello = "Hello World!"; ?>
出力:{{$hello}}
2。ブレードPHPブロック
設定変数:@php $hello = "Hello World!"; @endphp
出力:{{$hello}}
Laravel 5.2.23以降、 @ php Bladeディレクティブ があります。これは、インラインステートメントまたはブロックステートメントとして使用できます。
@php($old_section = "whatever")
または
@php
$old_section = "whatever"
@endphp
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を設定しました。
ビューファイルで変数を設定できますが、設定したとおりに印刷されます。とにかく、回避策があります。未使用セクション内に変数を設定できます。例:
@section('someSection')
{{ $yourVar = 'Your value' }}
@endsection
そうすると{{ $yourVar }}
はYour value
を好きな場所に表示しますが、変数を保存しても出力は得られません。
EDIT:セクションの命名が必要です。そうでなければ例外が発生します。
そして突然何も現れないでしょう。私の経験からすると、このようなことをする必要がある場合は、モデルのメソッドで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')
私が公開したパッケージを使うことができます。 https://github.com/sineld/bladeset
それからあなたは簡単にあなたの変数を設定します:
@set('myVariable', $existing_variable)
// or
@set("myVariable", "Hello, World!")
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()
{
// ...
}
}
私のエレガントなやり方は以下のようです
{{ ''; $old_section = "whatever"; }}
そして$old_section
変数をエコーするだけです。
{{ $old_section }}
私はあなたができるとは思わない - しかし、この場合もまた、この種のロジックはおそらくあなたのコントローラで処理され、すでに設定されているビューに渡されるべきです。
ブレードテンプレートに変数を割り当てます、これが解決策です
ブレードページで<?php ?>
タグを使用できます
<?php $var = 'test'; ?>
{{ $var }
OR
ブレードコメントは特別な構文で使えます
{{--*/ $var = 'test' /*--}}
{{ $var }}
PHP 7.0がある場合
簡単で最も効果的な方法は、を角括弧で囲むことです。
ルールは簡単です:あなたは複数回あなたの変数を使用しますか?それからそれが括弧の中で使われた最初の時にそれを宣言し、落ち着いて続けてください。
@if(($users = User::all())->count())
@foreach($users as $user)
{{ $user->name }}
@endforeach
@else
There are no users.
@endif
そして、はい、私は@forelse
について知っています、これは単なるデモです。
変数は使用時に宣言されているので、ブレードの回避策は必要ありません。
キーに値を割り当て、私の考えでは何度も使う方法を探していました。この場合、最初の場所で@section{"key", "value"}
を使用してから@yield{"key"}
を呼び出して、ビューまたはその子の他の場所に値を出力できます。
コメントをハックすることはそれをするための非常に読みやすい方法ではありません。また、編集者はそれをコメントとして色付けするでしょう、そしてコードを通して見るとき誰かがそれを見逃すかもしれません。
このようなことを試してください:
{{ ''; $hello = 'world' }}
それはコンパイルされます:
<?php echo ''; $hello = 'world'; ?>
...割り当てを行い、何もエコーしません。
laravel 5あなたは簡単にこれを行うことができます。下記参照
{{--*/ @$variable_name = 'value' /*--}}
Controllerで変数を定義してからcompact()
または->with()
メソッドを使用してビューに渡すことをお勧めします。
そうでなければ#TLGregが最良の答えを出しました。
Blade radic/blade-extensions には非常に良い拡張があります。追加した後は@set(variable_name、variable_value)を使用できます。
@set(var, 33)
{{$var}}
私は同様の質問をして、私が View Composers で正しい解決策であると思うものを見つけました
ビューコンポーザを使用すると、特定のビューが呼び出されるたびに変数を設定でき、それらは特定のビューまたはビューテンプレート全体にすることができます。とにかく、私はそれが質問への直接的な答えではないことを知っています(そして2年が遅すぎます)が、それはブレードでビュー内に変数を設定するよりも優雅な解決策のように思えます。
View::composer(array('AdminViewPath', 'LoginView/subview'), function($view) {
$view->with(array('bodyClass' => 'admin'));
});
私の意見では、ロジックをコントローラ内に保持してそれをビューに渡して使用するほうが良いでしょう。これは '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>
ここでより多くの情報:
ブレードのすべてのバージョンで動作します。
{{--*/ $optionsArray = ['A', 'B', 'C', 'D','E','F','G','H','J','K'] /*--}}
下記のようにextendメソッドを使ってブレードを拡張することができます。
Blade::extend(function($value) {
return preg_replace('/\@var(.+)/', '<?php ${1}; ?>', $value);
});
その後、次のように変数を初期化します。
@var $var = "var"