2016-05-25 55 views
5

Sto provando a creare la direttiva blade che restituisce la variabile echo (se la variabile è definita) o echo "nessun dato" se la variabile non è definita.Verificare se la variabile esiste nella direttiva blade di laravel

Questo è il mio codice in AppServiceProvider.php:

<?php 

namespace App\Providers; 

use Blade; 
use Illuminate\Support\ServiceProvider; 


class AppServiceProvider extends ServiceProvider 
{ 
    /** 
    * Bootstrap any application services. 
    * 
    * @return void 
    */ 
    public function boot() 
    { 
     Blade::directive('p', function($ex) { 
      error_log(print_r($ex,true)); 
      return '<?php $defined_vars = get_defined_vars(); if(array_key_exists(\''. $ex .'\', $defined_vars)): echo ' . $ex . ' ; else: echo \'no data\'; endif;?>'; 
     }); 
    } 

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

Ecco il mio index.blade.php:

<p class="lead">@p($myvar)</p> 

Ma la mia direttiva "p" dà "non ci sono dati" se la variabile definita. Se si verifica un errore isset: Cannot use isset() on the result of an expression (you can use "null !== expression" instead)

Come è possibile controllare le direttive interne se la variabile è stata definita?

+0

Quindi stai dicendo che se (isset ($ myvar)) non funziona? –

risposta

1

Che cosa stai cercando di passare alla direttiva personalizzata? Se è solo una stringa/int, dovrebbe funzionare.

Blade::directive('p', function($expression){ 
    $output = $expression ? $expression : 'nodata'; 
    return "<?php echo {$output}; ?>"; 
}); 

In Template lama

@p('Foo') 
+0

Voglio usarlo in questo modo '@p ($ sottotitolo)' nella mia vista. E se utilizzo la tua soluzione ho ricevuto questo errore: 'Variabile non definita: sottotitolo' – pupadupa

+0

@pupadupa Hai passato la variabile $ sottotitoli alla tua vista? Sembra che la lama non trovi la tua variabile. – Jeemusu

+0

questo è il problema - controlla le direttive se la variabile non esiste. C'è un modo per restituire 'nodata' dalla direttiva, se non ho passato la variabile per visualizzare? – pupadupa

7

È possibile utilizzare la funzionalità Lama per il controllo isset cioè

{{ $checkvariable or 'not-exist' }} 

https://laravel.com/docs/5.2/blade#displaying-data

+0

In futuro voglio aggiungere logiche più complesse alla mia direttiva. Ad esempio uno stile diverso per l'utente auth. Quindi voglio solo digitare 'p ($ foo)' in vista invece di ripetere '{{$ checkvariable o 'not-exist'}}' e le logiche per il controllo auth. – pupadupa

2

Prova a controllare se la variabile è vuota:

@if(empty($myvar)) 
    <p>Data does not exist</p> 
@else 
    <p>Your data is here!</p> 
@endif 

può anche controllare this thread