2017-09-27 49 views
0

我是Laravel新手,研究,但我找不到一個如此簡單的解決方案。我創建了刀片服務器的自定義指令,即「測試」中的app/Providers/AppServiceProvider.php文件:刀片自定義指令接收價值作爲一個字符串,而不是其原始值

<?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的,而不是其真正的內容「測試」的:

<?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。*。

+0

將返回值更改爲'return「<?php echo $ arg1。'。。$ arg2;?>」;' – Sebastian

回答

0

試試這個,你做了讓你自定義的刀片:

php artisan view:clear

0

編輯:最後我有真正的解決方案。

由於刀片在替換指令後在storage/framework/views目錄中創建了一個php文件,因此您需要將行開始的列表添加到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 

注意:你應該在供應商目錄中創建BladeServiceProvider那麼你應該將其添加到配置/ app.php提供商。然後,您可以將您的指令添加到BladeServiceProvider。這不重要。這是比你更合適的方式。

相關問題