it-swarm.com.de

So legen Sie Variablen in einer Laravel-Blade-Vorlage fest

Ich lese die Laravel Blade Dokumentation und kann nicht herausfinden, wie man Variablen in einer Vorlage zur späteren Verwendung zuweist. Ich kann {{ $old_section = "whatever" }} nicht tun, da dies "was auch immer" widerhallt und ich das nicht will.

Ich verstehe, dass ich <?php $old_section = "whatever"; ?> tun kann, aber das ist nicht elegant.

Gibt es eine bessere und elegantere Möglichkeit, dies in einer Blade-Vorlage zu tun?

189
duality_

Es wird davon abgeraten, dies in einer Ansicht zu tun, daher gibt es kein Blade-Tag dafür .. Wenn Sie dies in Ihrer Blade-Ansicht tun möchten, können Sie entweder ein PHP-Tag wie beschrieben öffnen oder ein neues Blade-Tag registrieren . Nur ein Beispiel:

<?php
/**
 * <code>
 * {? $old_section = "whatever" ?}
 * </code>
 */
Blade::extend(function($value) {
    return preg_replace('/\{\?(.+)\?\}/', '<?php ${1} ?>', $value);
});
105
TLGreg

LARAVEL 5.2 UND UP

Sie können einfach verwenden:

@php ($i = 1)

Oder Sie können es in einer Blockanweisung verwenden:

@php
$i = 1
@endphp

LARAVEL 5

Blade so erweitern:

/*
|--------------------------------------------------------------------------
| Extend blade so we can define a variable
| <code>
| @define $variable = "whatever"
| </code>
|--------------------------------------------------------------------------
*/

\Blade::extend(function($value) {
    return preg_replace('/\@define(.+)/', '<?php ${1}; ?>', $value);
});

Führen Sie dann einen der folgenden Schritte aus:

Schnelle Lösung: Wenn Sie faul sind, geben Sie den Code einfach in die boot () - Funktion der AppServiceProvider.php ein.

Schönere Lösung: Erstellen Sie einen eigenen Dienstanbieter. In https://stackoverflow.com/a/28641054/2169147 erfahren Sie, wie Sie Blade in Laravel 5 erweitern. Es ist ein bisschen mehr Arbeit auf diese Weise, aber eine gute Übung, wie Sie Providers verwenden :)

LARAVEL 4

Sie können den obigen Code einfach unter app/start/global.php (oder an einem anderen Ort, wenn Sie das für besser halten) setzen.


Nach den obigen Änderungen können Sie Folgendes verwenden:

@define $i = 1

eine Variable definieren.

265
Pim

In laravel-4 können Sie die Syntax der Vorlagenkommentare verwenden, um Variablen zu definieren/festzulegen.

Die Kommentarsyntax ist {{-- anything here is comment --}} und wird von Blade Engine als gerendert

<?php /* anything here is comment */ ?>

so können wir mit wenig Trick beispielsweise Variablen definieren

{{-- */$i=0;/* --}}

wird von Blade als .__ gerendert. <?php /* */$i=0;/* */ ?>, der die Variable für uns festlegt. Ohne Codezeile zu ändern.

111

Es gibt eine einfache Problemumgehung, bei der Sie keinen Code ändern müssen. In Laravel 4 funktioniert es genauso gut.

Sie verwenden lediglich einen Zuweisungsoperator (=) in dem Ausdruck, der an eine @if-Anweisung übergeben wird, und nicht beispielsweise einen Operator wie ==.

@if ($variable = 'any data, be it string, variable or OOP') @endif

Dann können Sie es überall verwenden, wo Sie eine beliebige andere Variable verwenden können

{{ $variable }}

Der einzige Nachteil ist, dass Ihre Aufgabe aussehen für jemanden wie ein Fehler ist, der sich nicht bewusst ist, dass Sie dies als Problemumgehung tun.

45
BTMPL

Du machst es zu kompliziert. 

Verwenden Sie einfach nur PHP 

<?php $i = 1; ?>
{{$i}}

donesies.

(oder https://github.com/alexdover/blade-set sieht auch recht geradlinig aus)

Wir alle hacken das System irgendwie durch das Setzen von Variablen in Ansichten. Warum also den "Hack" komplizierter machen, als es sein muss?

Getestet in Laravel 4.

Ein weiterer Vorteil ist, dass das Hervorheben der Syntax richtig funktioniert (ich habe vorher Kommentar-Hack verwendet und es war schrecklich zu lesen)

20
Sabrina Leggett

Seit Laravel 5.2.23 haben Sie die Blade-Direktive @php , die Sie als Inline- oder als Blockanweisung verwenden können:

@php($old_section = "whatever")

oder

@php
    $old_section = "whatever"
@endphp
17
Daan

Sie können Variablen in der Blade-Templating Engine wie folgt einstellen:

1. Allgemeiner PHP Block
Einstellvariable: <?php $hello = "Hello World!"; ?>
Ausgabe: {{$hello}}

2. Blade PHP Block
Einstellvariable: @php $hello = "Hello World!"; @endphp
Ausgabe: {{$hello}}

15
Prince Ahmed

In Laravel 4:

Wenn Sie möchten, dass die Variable in allen Ihren Ansichten verfügbar ist, nicht nur in Ihrer Vorlage, ist View::share eine großartige Methode ( weitere Informationen zu diesem Blog ).

Fügen Sie einfach Folgendes in app/controller/BaseController.php ein.

class BaseController extends Controller
{
  public function __construct()
  {                   
    // Share a var with all views
    View::share('myvar', 'some value');
  }
}

und jetzt steht $myvar für alle Ihre Ansichten zur Verfügung - einschließlich Ihrer Vorlage. 

Ich habe dies verwendet, um umgebungsspezifische Asset-URLs für meine Bilder festzulegen.

12
Justin

Sie können eine Variable in der Ansichtsdatei festlegen, sie wird jedoch genauso gedruckt, wie Sie sie festgelegt haben. Auf jeden Fall gibt es eine Problemumgehung. Sie können die Variable in einem nicht verwendeten Abschnitt festlegen. Beispiel:

@section('someSection')
  {{ $yourVar = 'Your value' }}
@endsection

Dann druckt {{ $yourVar }}Your value wo immer Sie möchten, aber Sie erhalten die Ausgabe nicht, wenn Sie die Variable speichern.

EDIT: Benennung des Abschnitts ist erforderlich, andernfalls wird eine Ausnahme ausgelöst.

10
Vasile Goian

Und plötzlich wird nichts auftauchen ... Wenn Sie so etwas tun müssen, bereiten Sie aus meiner Erfahrung heraus die HTML-Methode in einer Modellmethode vor oder reorganisieren Sie Ihren Code in Arrays oder so. 

Es gibt nie nur einen Weg.

{{ $x = 1 ? '' : '' }}
8

Ich werde die Antwort von @Pim erweitern.

Fügen Sie dies der Startmethode Ihres AppServiceProvider hinzu

<?php
/*
|--------------------------------------------------------------------------
| Extend blade so we can define a variable
| <code>
| @set(name, value)
| </code>
|--------------------------------------------------------------------------
*/

Blade::directive('set', function($expression) {
    list($name, $val) = explode(',', $expression);
    return "<?php {$name} = {$val}; ?>";
});

Auf diese Weise können Sie keine PHP-Ausdrücke schreiben.

Sie können diese Anweisung wie folgt verwenden:

@set($var, 10)
@set($var2, 'some string')
5
Carson Evans

Sie können das von mir veröffentlichte Paket verwenden: https://github.com/sineld/bladeset

Dann setzen Sie einfach Ihre Variable:

@set('myVariable', $existing_variable)

// or

@set("myVariable", "Hello, World!")
4
Sinan Eldem

In Laravel 5.1, 5.2:

https://laravel.com/docs/5.2/views#sharing-data-with-all-views

Möglicherweise müssen Sie ein Datenelement für alle Ansichten freigeben, die von Ihrer Anwendung gerendert werden. Sie können dies mit der Share-Methode der View Factory tun. In der Regel sollten Sie Aufrufe für die Freigabe innerhalb der Startmethode eines Dienstanbieters durchführen. Sie können sie dem AppServiceProvider hinzufügen oder einen separaten Dienstanbieter erstellen, um sie unterzubringen.

Datei bearbeiten: /app/Providers/AppServiceProvider.php

<?php

namespace App\Providers;

class AppServiceProvider extends ServiceProvider
{        
    public function boot()
    {
        view()->share('key', 'value');
    }

    public function register()
    {
        // ...
    }
}
4
Justin

Mein eleganter Weg ist wie folgt

{{ ''; $old_section = "whatever"; }}

Und geben Sie einfach Ihre $old_section-Variable wieder.

{{ $old_section }}
3
Set Kyar Wa Lar

Ich glaube nicht, dass Sie das können - aber andererseits sollte diese Art von Logik wahrscheinlich in Ihrem Controller behandelt und in die bereits gesetzte Ansicht übergeben werden.

2
Darren Craig

Wenn Sie PHP 7.0 haben:

Der einfachste und effektivste Weg ist die Zuordnung in eckigen Klammern.

Die Regel ist einfach: Verwenden Sie Ihre Variable mehr als einmal? Dann erkläre es beim ersten Gebrauch in Klammern, bleib ruhig und mach weiter.

@if(($users = User::all())->count())
  @foreach($users as $user)
    {{ $user->name }}
  @endforeach
@else
  There are no users.
@endif

Und ja, ich weiß über @forelse, dies ist nur eine Demo.

Da Ihre Variablen jetzt als und wenn sie verwendet werden, deklariert sind, gibt es keine Notwendigkeit für Blade-Workarounds.

2
Jonathan

Ich habe nach einer Möglichkeit gesucht, einem Schlüssel einen Wert zuzuweisen und ihn aus meiner Sicht oft zu verwenden. In diesem Fall können Sie zunächst @section{"key", "value"} verwenden und dann @yield{"key"} aufrufen, um den Wert an anderen Stellen in Ihrer Ansicht oder in ihrem untergeordneten Element auszugeben.

1
Hafez Divandari

Das Hacken von Kommentaren ist keine sehr lesbare Methode. Auch Editoren färben es als Kommentar und jemand kann es vermissen, wenn er den Code durchblättert.

Versuchen Sie etwas so:

{{ ''; $hello = 'world' }}

Es wird kompilieren in:

<?php echo ''; $hello = 'world'; ?>

... und die Zuordnung ausführen und nichts wiederholen.

1
rotaercz

laravel 5 können Sie dies leicht tun. siehe unten 

{{--*/ @$variable_name = 'value'  /*--}}
1
tapos ghosh

Es ist besser, die Definition der Variablen im Controller zu üben und sie dann mit der compact()- oder ->with()-Methode zur Ansicht zu übergeben.

Ansonsten gab #TLGreg die beste Antwort.

1
Mandeep Gill

Weisen Sie der Blade-Vorlage eine Variable zu. Hier sind die Lösungen

Wir können <?php ?>-Tag auf der Blattseite verwenden

<?php $var = 'test'; ?>
{{ $var }

OR

Wir können den Blade-Kommentar mit einer speziellen Syntax verwenden 

{{--*/ $var = 'test' /*--}}
{{ $var }}
1
Nikunj K.

Es gibt eine sehr gute Erweiterung für Blade Radic/Blade-Extensions . Nachdem Sie es hinzugefügt haben, können Sie @set (Variablenname, Variablenwert) verwenden.

@set(var, 33)
{{$var}}
1
belov91

Ich hatte eine ähnliche Frage und habe mit View Composers die meiner Meinung nach richtige Lösung gefunden.

Mit View Composers können Sie Variablen festlegen, wenn eine bestimmte Ansicht aufgerufen wird. Dabei kann es sich um bestimmte Ansichten oder um ganze Ansichtsvorlagen handeln. Jedenfalls weiß ich, dass es keine direkte Antwort auf die Frage ist (und zwei Jahre zu spät), aber es scheint eine anmutigere Lösung zu sein, als Variablen innerhalb einer Ansicht mit Blade festzulegen.

View::composer(array('AdminViewPath', 'LoginView/subview'), function($view) {
    $view->with(array('bodyClass' => 'admin'));
});
0
dug

Meiner Meinung nach wäre es besser, die Logik in der Steuerung zu behalten und sie der Ansicht zu übergeben. Dies kann auf zwei Arten mit der Methode "View :: make" erfolgen. Ich benutze derzeit Laravel 3, aber ich bin mir ziemlich sicher, dass es in Laravel 4 genauso ist.

public function action_hello($userName)
{
    return View::make('hello')->with('name', $userName);
}

oder

public function action_hello($first, $last)
{
    $data = array(
        'forename'  => $first,
        'surname' => $last
    );
    return View::make('hello', $data);
}

Die 'with'-Methode ist kettenbar. Dann würdest du das oben so verwenden:

<p>Hello {{$name}}</p>

Weitere Informationen hier:

http://three.laravel.com/docs/views

http://codehappy.daylerees.com/using-controllers

0
Robert Brisita

funktioniert in allen Versionen der Klinge.

{{--*/  $optionsArray = ['A', 'B', 'C', 'D','E','F','G','H','J','K'] /*--}}
0
Bakhtawar GIll

Sie können das Blade mithilfe der Erweiterungsmethode wie unten gezeigt erweitern.

Blade::extend(function($value) {
    return preg_replace('/\@var(.+)/', '<?php ${1}; ?>', $value);
});

danach initialisieren Sie die Variablen wie folgt.

@var $var = "var"
0
Lakitha Dias