Festlegen von Variablen in einer Laravel-Blade-Vorlage

247

Ich lese die Laravel-Klinge Dokumentation und kann nicht herausfinden, wie Variablen in einer Vorlage zur späteren Verwendung zugewiesen werden. Ich kann es nicht tun, {{ $old_section = "whatever" }}weil das "was auch immer" wiedergibt und ich das nicht will.

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

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

Dualität_
quelle
1
Überprüfen Sie diesen Zug: github.com/laravel/laravel/pull/866
Spir
Dies ist häufig zum Testen nützlich, insbesondere wenn Sie an der Vorlage arbeiten, aber eine andere Person am PHP-Teil arbeitet. Entfernen Sie die Deklaration nur vorsichtig, wenn Sie mit dem Testen fertig sind.
Trysis
Was ist falsch daran, einfach zu tun <?php $old_section = "whatever"; ?>. Ich finde es gut lesbar.
Jaime Hablutzel
@JaimeHablutzel Die Antwort ist meiner Meinung nach in der Frage: Es ist nicht elegant.
Dualität_

Antworten:

122

Es wird davon abgeraten, dies in einer Ansicht zu tun, sodass kein Blade-Tag dafür vorhanden ist. Wenn Sie dies in Ihrer Blade-Ansicht tun möchten, können Sie entweder einfach ein PHP-Tag öffnen, während Sie es geschrieben haben, 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);
});
TLGreg
quelle
9
Variablen in Ansichten haben einige Verwendungszwecke. Das sieht gut aus! Wo wäre ein guter Ort, um diesen Code zu platzieren?
Dualität_
1
Sie können es in Ihre Anwendung / start.php einfügen oder, wenn Sie mehr davon haben, in eine separate Datei einfügen und dort einfügen. Laravel ist auf diese Weise sehr locker, man könnte sogar einen Controller dünn machen. Das einzige, was Sie tun müssen, erstreckt sich, bevor die Ansicht gerendert wird.
TLGreg
19
Was ist der Grund für das Hinzufügen dieses zusätzlichen Codes, um ihn nur zu verwenden, {?anstatt nur den nativen zu verwenden <??
Justin
1
Wenn davon abgeraten wird, gibt es einen "angemesseneren" Weg, um Folgendes zu tun? Ich habe eine Site, auf der der Titel in der Haupt-App-Ansicht als {{$ title}} gerendert wird. Diese enthält ein Subsystem, das die Seitenzahl an den Titel anhängen muss ("Application Form Page {{$ page}}") und Ich übergebe $ page an die Ansicht (die ansonsten in der Ansicht verwendet wird). Ich möchte den Titel nicht in jedem Controller-Aufruf erstellen, sondern nur der Ansicht die Seitenzahl senden - nur für den Fall, dass ich eines Tages den Basistitel ändern möchte. Ich verwende jetzt <? Php $ title = ...?>, Aber gibt es einen korrekteren Weg?
jdavidbakr
4
Variablen sollten vom Controller übergeben und in Ihrer Ansicht nicht inline deklariert werden. Wenn eine globale Vorlage eine Variable benötigt, können Sie diese in einem Dienstanbieter festlegen . Stackoverflow.com/a/36780419/922522 . Wenn eine seitenspezifische Vorlage eine Variable benötigt, verwenden Sie @yield und übergeben Sie sie aus der untergeordneten Ansicht mit einem Controller. laravel.com/docs/5.1/blade#template-inheritance
Justin
361

LARAVEL 5.5 UND AUF

Die @ php Blade-Direktive akzeptiert keine Inline-Tags mehr. Verwenden Sie stattdessen die vollständige Form der Richtlinie:

@php
$i = 1
@endphp

LARAVEL 5.2 UND AUF

Sie können einfach verwenden:

@php ($i = 1)

Oder Sie können es in einer Blockanweisung verwenden:

@php
$i = 1
@endphp

LARAVEL 5

Klinge wie folgt ausfahren:

/*
|--------------------------------------------------------------------------
| 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. Unter https://stackoverflow.com/a/28641054/2169147 erfahren Sie, wie Sie das Blade in Laravel 5 erweitern. Auf diese Weise ist es etwas mehr Arbeit, aber eine gute Übung zur Verwendung von Providern :)

LARAVEL 4

Sie können den obigen Code einfach unten in app / start / global.php (oder an einem anderen Ort, wenn Sie der Meinung sind, dass dies besser ist) einfügen .


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

@define $i = 1

eine Variable definieren.

Pim
quelle
5
Nett! Bitte beachten Sie, dass Sie mit Ihrer Implementierung jede PHP-Anweisung ausführen können. Ich würde es in so etwas wie @php umbenennen. Sehr praktisch ...
Igaster
Sehr wahr, Igaster. Sie können 'define' in 'php' umbenennen, wenn Sie möchten, aber das eröffnet die Gefahr einer übermäßigen Verwendung von PHP in Ihren Vorlagen :)
Pim
1
Danke @ C.delaFonteijne, wenn Sie Namespace verwenden (und Sie sollten), wird das \ tatsächlich benötigt. Ich habe das \ im obigen Code hinzugefügt.
Pim
1
Bitte beachten Sie, dass fast Ihre genaue Implementierung seit Laravel 5.2 Standard ist . Sie können es verwenden @php(@i = 1)oder in einer Blockanweisung verwenden (schließen mit @endphp)
Daan
1
Ich sehe nicht, wie "@php" "@endphp" "eleganter" ist als "<? Php" "?>". Es ist sogar ein paar Zeichen länger! Liegt es nur daran, dass es wie bei anderen Blade-Anweisungen mit einem "@" beginnt? Wir Entwickler sind ein zwanghafter Haufen! ;-)
OMA
116

Im können Sie die Vorlagenkommentarsyntax verwenden, um Variablen zu definieren / festzulegen.

Kommentarsyntax ist {{-- anything here is comment --}} und wird von gerendert Motor als

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

Mit wenig Trick können wir damit beispielsweise Variablen definieren

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

wird von gerendert als <?php /* */$i=0;/* */ ?>was die Variable für uns setzt. Ohne eine Codezeile zu ändern.

Ich versuche es mit Tobemyself
quelle
2
@ try-tobemyself +1 | Nicht die Best-Practices- Methode, aber perfekt für das schnelle Hacken von Code in Vorlagen wie bei Inline-Stilen für HTML.
Markus Hofmann
121
Ich würde diesen Hack nicht empfehlen, da jeder, der sich diesen Code ansieht, nachdem Sie Sie hassen werden.
Justin
2
Stimmen Sie mit Justin überein, Kommentar-Tags sind für Kommentare, um innerhalb des Kommentars zu kommentieren und etwas anderes zu tun, bittet um Ärger
Leon
27
Dies ist nicht besser als einfach ol 'php<?php $i=0; ?>
gyo
3
Was bringt es, dies zu tun, anstatt PHP-Tags zu verwenden? Es ist nicht lesbar (sieht aus wie ein Kommentar), erfordert mehr Eingabe und kann durch ein Update des Parsing-Systems beschädigt werden. Selbst wenn es einen Punkt hat, ist es nicht die Antwort darauf, wie eine Variable in einer Blade-Vorlage definiert wird. Sie wissen nicht, was mit den Wählern los ist, vielleicht fanden sie das so "geeky"? meh ...
SuperDuck
52

Es gibt eine einfache Problemumgehung, bei der Sie keinen Code ändern müssen, und sie funktioniert auch in Laravel 4.

Sie verwenden einfach einen Zuweisungsoperator ( =) in dem an eine @ifAnweisung übergebenen Ausdruck anstelle von (zum Beispiel) einem Operator wie z ==.

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

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

{{ $variable }}

Der einzige Nachteil ist, dass Ihre Aufgabe für jemanden, der nicht weiß, dass Sie dies als Problemumgehung tun , wie ein Fehler aussieht .

BTMPL
quelle
27

Du wirst es zu kompliziert machen.

Verwenden Sie einfach nur PHP

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

donesies.

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

Wir alle "hacken" das System, indem wir Variablen in Ansichten festlegen. Warum also den "Hack" komplizierter machen, als es sein muss?

Getestet in Laravel 4.

Ein weiterer Vorteil ist, dass die Syntaxhervorhebung ordnungsgemäß funktioniert (ich habe zuvor einen Kommentar-Hack verwendet und es war schrecklich zu lesen).

Sabrina Leggett
quelle
21

Sie können Variablen in der Blade Templating Engine auf folgende Arten festlegen:

1. Allgemeine
Variable für die Einstellung von PHP-Blöcken : <?php $hello = "Hello World!"; ?>
Ausgabe: {{$hello}}

2.
Variable für die Einstellung von Blade-PHP-Blöcken : @php $hello = "Hello World!"; @endphp
Ausgabe: {{$hello}}

Prinz Ahmed
quelle
19

Seit Laravel 5.2.23 haben Sie die @ php Blade-Direktive , die Sie inline oder als block-Anweisung verwenden können:

@php($old_section = "whatever")

oder

@php
    $old_section = "whatever"
@endphp
Daan
quelle
15

Sie können eine Variable in der Ansichtsdatei festlegen, diese 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 {{ $yourVar }}wird gedruckt, Your valuewo immer Sie möchten, aber Sie erhalten die Ausgabe nicht, wenn Sie die Variable speichern.

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

Vasile Goian
quelle
Funktioniert nicht, es muss etwas anderes enthalten sein. Undefinierte Eigenschaft: Illuminate \ View \ Factory :: $ startSection (Ansicht: /home/vagrant/Code/dompetspy/resources/views/reviews/index.blade.php)
MaXi32
14

In Laravel 4:

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

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

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

und jetzt $myvarsteht es allen Ihren Ansichten zur Verfügung - einschließlich Ihrer Vorlage.

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

Justin
quelle
1
Dies ist, wonach ich gesucht habe: eine großartige Möglichkeit, doppelte Anrufe in der Datenbank zu vermeiden!
Clod986
Dies scheint in Laravel 5 keine Option zu sein?
Goddard
@ Goddard Du kannst es immer noch. Die Syntax hat sich jedoch geändert: stackoverflow.com/a/36780419/922522
Justin
8

Und plötzlich wird nichts mehr erscheinen. Wenn Sie so etwas tun müssen, bereiten Sie meiner Erfahrung nach das HTML in der Methode eines Modells vor oder reorganisieren Sie Ihren Code in Arrays oder ähnliches.

Es gibt nie nur einen Weg.

{{ $x = 1 ? '' : '' }}
Michael J. Calkins
quelle
11
HTML im Modell vorbereiten? Das ist das Hässlichste, was man sich vorstellen kann.
Dualität_
@duality_ Sie deklarieren und ändern Variablen in Ihrer Ansicht. Ich sagte, Sie organisieren Ihren Code wahrscheinlich falsch. Lrn 2 Architekt.
Michael J. Calkins
3
Sicher, Michael ... Diese Variablen sind keine Variablen wie $users = ..., sondern etwas in der Art $css_class = ..., also streng Designvariablen, die nicht zum Modell oder Controller gehören, wie sie vom Designer festgelegt werden.
Dualität_
2
Wenn Sie diesen Weg gehen müssen, bevorzuge ich die einfachere und elegantere Lösung: {{''; $ x = 1}}
Daniel
6

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 keinen PHP-Ausdruck schreiben.

Sie können diese Direktive wie folgt verwenden:

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

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 Freigabemethode der View Factory tun. In der Regel sollten Sie Anrufe zur Freigabe innerhalb der Startmethode eines Dienstanbieters tätigen. Sie können sie dem AppServiceProvider hinzufügen oder einen separaten Dienstanbieter generieren, 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()
    {
        // ...
    }
}
Justin
quelle
5

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!")
Sinan Eldem
quelle
3

Mein eleganter Weg ist wie folgt

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

Und geben Sie einfach Ihre $old_sectionVariable wieder.

{{ $old_section }}
Stellen Sie Kyar Wa Lar ein
quelle
3

Wenn Sie PHP 7.0 haben:

Der einfachste und effektivste Weg ist die Zuordnung in Klammern .

Die Regel ist einfach: Verwenden Sie Ihre Variable mehrmals? Erklären Sie es dann, wenn es zum ersten Mal in Klammern verwendet wird, bleiben Sie ruhig und machen Sie weiter.

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

Und ja, ich weiß davon @forelse , das ist nur eine Demo.

Da Ihre Variablen jetzt als und deklariert werden, wenn sie verwendet werden, sind keine Blade-Problemumgehungen erforderlich.

Jonathan
quelle
2

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

Darren Craig
quelle
6
Einige Variablen sind ausschließlich für Ansichten bestimmt. $previous_group_name, $separator_printedEtc.
duality_
2
Wenn es sich nur um Ansichten handelt, sollten Sie es einfach von der Steuerung an die Ansicht übergeben. Wenn Sie möchten, dass es für alle Ansichten verfügbar ist, lesen Sie meine Antwort oben unter app/controllers/BaseController.php.
Justin
1
Ich verwende mehrere Arrays, um alle meine $ -Daten an die Ansicht zu senden
Hos Mercury
2

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

Wir können <?php ?>Tag in Blade-Seite verwenden

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

ODER

Wir können den Blade-Kommentar mit spezieller Syntax verwenden

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

Das Hacken von Kommentaren ist keine gut lesbare Methode. Auch Redakteure färben es als Kommentar und jemand kann es beim Durchsuchen des Codes vermissen.

Versuchen Sie so etwas:

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

Es wird kompiliert in:

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

... und die Aufgabe erledigen und nichts wiedergeben.

rotaercz
quelle
1

Es ist besser zu üben, Variablen in Controller zu definieren und dann mit compact()oder ->with()Methode an die Ansicht zu übergeben .

Ansonsten gab #TLGreg die beste Antwort.

Mandeep Gill
quelle
1

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}}
belov91
quelle
1

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

Hafez Divandari
quelle
0

Meiner Meinung nach ist es besser, die Logik in der Steuerung zu belassen und an die zu verwendende Ansicht zu übergeben. Dies kann auf zwei Arten mit der Methode 'View :: make' erfolgen. Ich verwende derzeit Laravel 3, bin mir aber ziemlich sicher, dass dies 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 verkettbar. Sie würden dann die oben genannten wie folgt verwenden:

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

Weitere Informationen hier:

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

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

Robert Brisita
quelle
Die Präsentationslogik bleibt am besten im Blick. Manchmal müssen Sie eine Variable in der Ansicht erstellen. zB um ein Datum zu formatieren. $format='Y-m-d H:i:s';Auf diese Weise können Sie dieses Format in der Ansicht wiederverwenden. Dies gehört sicherlich nicht in die Steuerung. Das heißt, als Antwort auf die Frage ... Es ist nichts falsch mit <?php ?>Tags.
Soße
0

Ich hatte eine ähnliche Frage und fand, was ich für die richtige Lösung halte View Composers

Mit View Composers können Sie bei jedem Aufruf einer bestimmten Ansicht Variablen festlegen. Dies können bestimmte Ansichten oder ganze Ansichtsvorlagen sein. Wie auch immer, ich weiß, dass es keine direkte Antwort auf die Frage ist (und 2 Jahre zu spät), aber es scheint eine elegantere Lösung zu sein, als Variablen in einer Ansicht mit Blade festzulegen.

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

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

{{--*/ @$variable_name = 'value'  /*--}}
Tapos Ghosh
quelle
0

Sie können die Klinge mit der Verlängerungsmethode wie unten gezeigt verlängern.

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

Danach initialisieren Sie die Variablen wie folgt.

@var $var = "var"
Lakitha Dias
quelle
-1

funktioniert in allen Versionen von Blade.

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