8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Laravel5.4ではbladeファイル内で`{{--*/ $hoge = 'hoge' /*--}}`といった書き方で変数代入できない

Posted at

「Laravel blade 変数 代入」でググると、一番上にこちらのサイトが出てきます。

こちらによると以下の書き方で変数代入が行えるとあります。

またはBladeのコメントを使うこともできます

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

> Bladeのコメントは以下の形式を利用しているため、上記のコメントを使った代入方法で動作させる事が出来ます
>
> ```php
<?php /*COMMENT*/ ?>

したがって、上記の変数の代入は次のPHPコードに変換されます


# Laravel5.4ではこの書き方が使えない

そのまんまです。先述の書き方をしても変数に値が代入されませんでした。

## 検証

bladeファイルのコンパイル結果は`storage/framework/views`配下に出力されるので、コンパイル前とコンパイル後の内容を比較してみます。
※Laravel5.4と5.2でしか検証していないです。

```php:コンパイル前(blade)
<?php $hoge = 'hoge'; ?>
{{--*/ $hoge = 'hoge'; /*--}}
<?php /* こめんと */ ?>
{{-- こめんと --}}

こちらのファイルがコンパイル後どういったphpファイルに変換されるかを見てみます。

Laravel5.4

$ php artisan -V
Laravel Framework 5.4.26
コンパイル後
<?php $hoge = 'hoge'; ?>

<?php /* こめんと */ ?>

Laravel5.2

$ php artisan -V
Laravel Framework version 5.2.45
コンパイル後
<?php $hoge = 'hoge'; ?>
<?php /**/ $hoge = 'hoge'; /**/ ?>
<?php /* こめんと */ ?>
<?php /* こめんと */ ?>

上記検証からわかったこと

Laravel5.4からは{{-- --}}のblade用のコメントは、コンパイル後のphpにそもそも出力されないことがわかります。
この変更の背景としては、開発を行っているときに実際に見るファイルはコンパイル前のbladeファイルだけなので、コンパイル後の素のphpファイルにはコメントを出力する必要がない(こちらのファイルを確認することは基本的にない)といった感じでしょうか?あくまで予想です。

「Laravel blade 変数 代入」でググると、一番上に出てくるサイト

こちらのサイトはLaravel4.0-4.2向けの情報を日本語訳したものらしいので、5系で使用すること自体が間違っていました(たまたま5.2ではまだ有効な記述方法だった)。

対策

簡単な方法

普通にphpのタグを使って代入すれば問題ありません。<?php $hoge = 'hoge'; ?>
もしくは@php https://laravel.com/docs/5.5/blade#php を使えばOKです。

bladeの拡張構文

bladeを拡張して変数代入用の構文を追加することも出来ます。勉強も兼ねて今回はこっちで対応してみました。
公式にしっかり手順が書かれています。

この例は文字列型の引数を1つしか受け取らないような場合の話ですが、
今行いたいのは変数への代入なので、「変数名」と「値」といった2引数を扱う必要があります。
最初から提供されている@section(引数を2つ受け取る)の定義を見てみると正規表現で頑張っていることがわかりました。
あとは https://laracasts.com/discuss/channels/laravel/how-to-do-this-blade-directive?page=1 では配列で渡すか正規表現で分割しなってコメントが書かれています。
今回は正規表現で分割してみました。
※単純な使い方しか想定していないです(変数が配列の場合などは一切テストしていないです)。

AppServiceProvider.php
    public function boot()
    {
        \Blade::directive('set', function($arg){
            list($key, $value) = explode(',', $arg);
            return "<?php $key = $value; ?>";
        });
    }
blade.php
@set($hoge,'hogehoge')
{{ $hoge }}
8
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?