web-dev-qa-db-fra.com

Vérifier s'il existe une variable dans la directive de la lame de laravel

J'essaie de créer une directive de lame indiquant la variable d'écho (si variable définie) ou l'écho "pas de données" si la variable est non définie.

Ceci est mon code dans 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()
    {
        //
    }
}

Voici mon index.blade.php:

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

Mais ma directive "p" ne donne "pas de données" si la variable est définie . Si j'utilise isset error se produit: Cannot use isset() on the result of an expression (you can use "null !== expression" instead)

Comment puis-je vérifier les directives internes si la variable est définie?

13
pupadupa

Vous pouvez utiliser la fonctionnalité de lame pour vérifier isset i.e

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

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

15
Ali

Essayez de vérifier si la variable est vide:

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

Peut aussi vérifier ce fil

10
Connor Leech

Blade a une directive pour vérifier si une variable est définie:

@isset($var)

@endisset
10
sanchezcl

Le moyen le plus propre et le plus propre de vérifier s’il existe une variable dans la lame:

 {!! !empty($myvariable) ? $myvariable : 'variable does not exist' !!}
8
TechPotter

Pour Laravel 5.7 et plus, utilisez.

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

3
George John

Qu'essayez-vous de transmettre à votre directive personnalisée? Si c'est juste une chaîne/int, ce qui suit devrait fonctionner.

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

Dans le modèle de lame

@p('Foo')
1
Jeemusu

Vous pouvez le faire de différentes manières.

Échantillon-1:

@if( !empty($data['var']))
   {{ $data['var'] }} 
@endif

Échantillon 2: 

{{ $data['var'] or 'no data found' }}

Exemple 3: Utilisation de l'opérateur ternaire

<a href="" class="{{ ( ! empty($data['var'] ? $data['var'] : 'no data found') }}">
0
Dibyendu Mitra Roy

La directive @empty pourrait être utile:

@empty($var)
   $var is unset or false-y
@endempty
0
crishoj