刀片自定义指令将值作为字符串而不是其原始值接收

时间:2017-09-27 09:59:18

标签: laravel laravel-5 blade laravel-blade

我是Laravel的新手,经过研究但我找不到这么简单的解决方案。我创建了一个自定义指令,即" test"对于app/Providers/AppServiceProvider.php文件中的Blade:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

use Illuminate\Support\Facades\Blade;

class AppServiceProvider extends ServiceProvider
{
    /**
    * Bootstrap any application services.
    *
    * @return void
    */
    public function boot()
    {
        Blade::directive('test', function($expression){
            // Dumps as well: "$var1 , $var2"
            dump($expression);

            list($arg1, $arg2) = explode(',',str_replace(['(',')',' '], '', $expression));

            // will print: $var1 , $var2
            return "<?php echo '$arg1 , $arg2'; ?>";
        }); 
    }

    /**
    * Register any application services.
    *
    * @return void
    */
    public function register()
    {
        //
    }
}

理论上,它在刀片模板中的使用应该非常简单,但是如下例所示,该指令正在打印参数的文字值,例如$ var1正在打印$ var1而不是其真实内容&#34; test一个&#34;:

<?php 
    $var1 = 'test a'; 
    $var2 = 'test b'; 
?>

// Prints: $var1 , $var2
// Expected: "test a test b"
@test($var1 , $var2)

已尝试使用多个标记打印其值:

@test( {{ $var1  }}, {{ $var2  }})
@test( {!! $var1 !!}, {!! $var2 !!})
@test( {{{ $var1 }}}, {{{ $var2 }}})

但两种方法都不起作用,指令总是接收变量的名称而不是其内容。在这种情况下我无视什么?任何帮助表示赞赏。我正在使用Laravel 5.4。*。

2 个答案:

答案 0 :(得分:1)

编辑:最后,我有了真正的解决方案。

您需要将list以list开头添加到return语句,因为在替换指令后,blade会在storage / framework / views目录中创建一个php文件。所以你需要类似下面的内容。

Blade::directive('test', function($expression){
    return
       '<?php
           list($arg1, $arg2) = explode(\',\',str_replace([\'(\',\')\',\' \'], \'\', ' . $expression . '));
           echo "$arg1 -- $arg2";
       ?>';
});

最后你可以像以下一样使用它;

@php($expression = "(0,1)")
@test($expression)
@test("(10,12)") //It works now

注意:您应该在Providers目录中创建BladeServiceProvider,然后您应该将它添加到config / app.php中的提供程序。然后,您可以将指令添加到BladeServiceProvider。这不重要。这比你的方式更恰当。

答案 1 :(得分:0)

在制作自定义刀片后尝试此操作:

php artisan view:clear