Laravel Blade自定义指令以字符串形式接收值,而不是其原始值

Laravel Blade自定义指令以字符串形式接收值,而不是其原始值,laravel,laravel-5,blade,laravel-blade,Laravel,Laravel 5,Blade,Laravel Blade,我是拉威尔的新手,经过研究,但我找不到这么简单的解决方案。我在app/Providers/AppServiceProvider.php文件中为Blade创建了一个自定义指令,即“test”: <?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Blade; class AppServiceProvider extends Servi

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

<?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()
    {
        //
    }
}

但也不起作用,指令总是接收变量的名称而不是其内容。在这种情况下,我忽略了什么?感谢您的帮助。我正在使用Laravel 5.4...

在完成定制刀片制作后,请尝试以下操作:


php artisan视图:清除

在完成定制刀片制作后,尝试以下操作:


php artisan视图:清除

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

您需要添加以list to return语句开头的行,因为blade在替换指令后会在storage/framework/views目录中创建一个php文件。所以你需要像下面这样的东西

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

注意:您应该在Providers目录中创建BladeServiceProvider,然后将其添加到config/app.php中的Providers中。然后,您可以将指令添加到BladeServiceProvider。这并不重要。这比你的方法更合适。

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

您需要添加以list to return语句开头的行,因为blade在替换指令后会在storage/framework/views目录中创建一个php文件。所以你需要像下面这样的东西

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

注意:您应该在Providers目录中创建BladeServiceProvider,然后将其添加到config/app.php中的Providers中。然后,您可以将指令添加到BladeServiceProvider。这并不重要。这比你的方法更合适。

将返回改为
return”“将返回更改为
返回“”
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