2017-09-27 1 views
0

Je suis novice dans Laravel, des recherches, mais je ne peux pas trouver une solution pour quelque chose de si simple. J'ai créé une directive personnalisée à savoir « test » pour la lame dans le fichier app/Providers/AppServiceProvider.php:lame directive personnalisée reçoit la valeur comme une chaîne au lieu de sa valeur d'origine

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

Théoriquement, son utilisation doit être très simple à l'intérieur d'un modèle de lame, mais comme le montre l'exemple suivant, la directive est l'impression la valeur littérale des arguments, par exemple var1 $ est l'impression var1 $ au lieu de son contenu réel "test a":

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

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

déjà essayé d'imprimer leurs valeurs en utilisant les balises multiples:

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

Mais ne fonctionne pas non plus, la directive reçoit toujours le nom de la variable au lieu de son contenu. Qu'est-ce que j'ignore dans ce cas? Toute aide est appréciée. J'utilise Laravel 5.4. *.

+0

Modifier le retour à 'retour "";' – Sebastian

Répondre

0

Essayez ce, après avoir effectué votre lame personnalisée:

php artisan view:clear.

0

Edit: Enfin j'ai la vraie solution.

Vous devez ajouter la ligne commence par la liste pour revenir déclaration parce que la lame crée un fichier php dans le répertoire de stockage/cadre/vue après le remplacement des directives. Donc, vous avez besoin de quelque chose comme les suivants.

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

Enfin, vous pouvez l'utiliser comme suit;

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

Note: vous devez créer BladeServiceProvider dans le répertoire des fournisseurs, vous devez l'ajouter aux fournisseurs dans config/app.php. Ensuite, vous pouvez ajouter votre directive à BladeServiceProvider. Ce n'est pas important. C'est juste plus juste que le tien.