Laravel Blade Şablonunda Değişkenleri Ayarlama


248

Laravel Blade belgelerini okuyorum ve daha sonra kullanmak üzere bir şablonun içine nasıl değişken atayacağımı anlayamıyorum . Yapamam {{ $old_section = "whatever" }}çünkü bu "ne olursa olsun" yankılanacak ve bunu istemiyorum.

Yapabileceğimi anlıyorum <?php $old_section = "whatever"; ?>, ama bu zarif değil.

Blade şablonunda bunu yapmanın daha iyi ve zarif bir yolu var mı?


1
Bu çekmeyi kontrol et: github.com/laravel/laravel/pull/866
Spir

Bu, özellikle şablon üzerinde çalışıyorsanız, ancak başka biri PHP bölümünde çalışıyorsa, test için genellikle yararlıdır. Testi tamamladığınızda bildirimi kaldırmaya dikkat edin.
trysis

Sadece yapmakta yanlış olan şey <?php $old_section = "whatever"; ?>. Oldukça okunabilir buluyorum.
Jaime Hablutzel

@JaimeHablutzel, bence, soru şu: zarif değil.
duality_

Yanıtlar:


122

Bir görünümde yapılması önerilmez, bu yüzden bunun için bıçak etiketi yoktur. Bunu blade görünümünüzde yapmak istiyorsanız, yazdığınız gibi bir php etiketi açabilir veya yeni bir blade etiketi kaydedebilirsiniz. Sadece bir örnek:

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

9
Görünümlerdeki değişkenlerin bazı kullanımları vardır. Harika görünüyor! Bu kodu koymak için iyi bir yer neresi olurdu?
duality_

1
Uygulamanıza / start.php dosyasına koyabilir veya bunun gibi daha fazla şeye sahip olacaksanız, ayrı bir dosyaya koyun ve oraya ekleyin. Laravel bu şekilde çok gevşek, hatta ince bir kontrolör bile koyabilirsiniz. Bunları yapmanız gereken tek şey görünüm oluşturulmadan önce uzanır.
TLGreg

19
Bu ekstra kodu {?, yalnızca yerel olanı kullanmak yerine yalnızca kullanmak için eklemenin nedeni nedir <??
Justin

1
Bunu yapmaktan vazgeçilirse, aşağıdakileri yapmanın daha "uygun" bir yolu var mı? Başlığın ana uygulama görünümünde {{$ title}} olarak işlendiği, siteye sayfa numarasını eklemesi gereken bir alt sistem içeren bir sitem var ("Başvuru Formu Sayfası {{$ page}}") ve $ Sayfa görünümüne geçiyorum (görünüm içinde aksi kullanılır). Her denetleyici çağrısında başlığı oluşturmak istemiyorum, sadece görünümün sayfa numarasını göndermek istiyorum - bir gün temel başlığı değiştirmek istediğimde. Şimdi <? Php $ title = ...?> Kullanıyorum, ama daha doğru bir yol var mı?
jdavidbakr

4
Değişkenler, görünümünüzde satır içi olarak bildirilmemiş, denetleyiciden geçirilmelidir. Genel şablonun bir değişkene ihtiyacı varsa, bunu bir servis sağlayıcısı stackoverflow.com/a/36780419/922522 içinde ayarlayabilirsiniz . Sayfaya özgü bir şablonun değişkene ihtiyacı varsa, @yield komutunu kullanın ve bunu denetleyiciye sahip alt görünümden iletin. laravel.com/docs/5.1/blade#template-inheritance
Justin

361

LARAVEL 5.5 VE YUKARI

@Php blade yönergesi artık satır içi etiketleri kabul etmiyor. Bunun yerine, direktifin tam biçimini kullanın:

@php
$i = 1
@endphp

LARAVEL 5.2 VE YUKARI

Sadece şunu kullanabilirsiniz:

@php ($i = 1)

Veya bir blok ifadesinde kullanabilirsiniz:

@php
$i = 1
@endphp

LARAVEL 5

Blade'i şu şekilde uzatın:

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

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

Ardından aşağıdakilerden birini yapın:

Hızlı çözüm: Tembelseniz, kodu AppServiceProvider.php dosyasının boot () işlevine koyun.

Güzel çözüm: Kendi servis sağlayıcınızı oluşturun. Laravel 5'te bıçağın nasıl uzatılacağına ilişkin https://stackoverflow.com/a/28641054/2169147 adresine bakın. Bu şekilde biraz daha fazla iş var, ancak Sağlayıcıların nasıl kullanılacağı konusunda iyi bir egzersiz :)

LARAVEL 4

Yukarıdaki kodu app / start / global.php (ya da daha iyi olduğunu düşünüyorsanız başka bir yere) altına koyabilirsiniz .


Yukarıdaki değişikliklerden sonra şunları kullanabilirsiniz:

@define $i = 1

değişken tanımlamak.


5
Güzel! Uygulamanızla birlikte herhangi bir php deyimini yürütebileceğinizi lütfen unutmayın. @Php gibi bir şey olarak yeniden adlandırırdım. Çok kullanışlı
igaster

Çok doğru, igaster. İsterseniz 'tanımla'yı' php 'olarak yeniden adlandırabilirsiniz, ancak şablonlarınızda php'yi aşırı kullanmak için tuzak açar :)
Pim

1
Teşekkürler @ C.delaFonteijne, eğer ad alanı kullanıyorsanız (ve yapmalısınız), \ gerçekten gereklidir. Yukarıdaki kodda \ ekledim.
Pim

1
Laravel 5.2'den bu yana neredeyse tam uygulamanızın standart olduğunu lütfen unutmayın . @php(@i = 1)Bir blok ifadesinde kullanabilir veya kullanabilirsiniz (ile yakın @endphp)
Daan

1
"@Php" "@endphp" nin "<? Php" "?>" Den daha zarif olduğunu anlamıyorum. Hatta birkaç karakter daha uzun! Sadece diğer Blade direktifleri gibi bir "@" ile başlaması mı? Biz geliştiriciler obsesif-kompulsif bir grup! ;-)
OMA

116

İçinde , değişkenleri tanımlamak / ayarlamak için şablon yorumu sözdizimini kullanabilirsiniz.

Yorum sözdizimi {{-- anything here is comment --}}ve tarafından oluşturulur motor olarak

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

yani küçük bir hile ile değişkenleri tanımlamak için kullanabiliriz, örneğin

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

tarafından oluşturulacak olarak <?php /* */$i=0;/* */ ?>bizim için değişken ayarlar. Herhangi bir kod satırını değiştirmeden.


2
@ çalışırken-tobemyself +1 | En İyi Uygulamalar yolu değil, html için satır içi stiller gibi şablonlardaki kodların hızlı bir şekilde kesilmesi için mükemmeldir .
Markus Hofmann

121
Senden nefret ettikten sonra bu koda bakan kimse olarak bu hack yapmayı tavsiye etmem.
Justin

2
Justin ile aynı fikirde, yorum etiketleri yorumlar, yorum içinde uncomment ve başka bir şey yapmaya başlamak için sorun istiyor
Leon

27
Bu düz ol 'php<?php $i=0; ?>
gyo'dan

3
Php etiketleri kullanmak yerine bunu yapmanın anlamı nedir ?? Okunamaz (bir yorum gibi görünür), daha fazla yazmayı gerektirir ve ayrıştırma sistemindeki bir güncellemeyle kırılabilir. Bir noktası olsa bile, bir blade şablonunda bir değişkenin nasıl tanımlanacağının cevabı değildir. Seçmenlerde neyin yanlış olduğunu bilmiyor musun, belki de bunu böyle 'geeky' buldular? meh ...
SuperDuck

52

Herhangi bir kodu değiştirmenizi gerektirmeyen basit bir geçici çözüm var ve Laravel 4'te de çalışıyor.

Bir =ifadeye iletilen @ififadede (örneğin) gibi bir işleç yerine bir atama operatörü ( ) kullanırsınız ==.

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

Sonra başka bir değişkeni kullanabileceğiniz herhangi bir yerde kullanabilirsiniz

{{ $variable }}

Tek dezavantajı, görevinizin bunu geçici bir çözüm olarak yaptığınızı bilmeyen birine bir hata gibi görünecek olmasıdır .


27

Çok karmaşık hale getireceksin.

Sadece düz php kullanın

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

donesies.

(veya https://github.com/alexdover/blade-set de oldukça hızlı görünüyor)

Hepimiz görünümlerde değişkenler belirleyerek sistemi "hackliyoruz", öyleyse neden "hack" i daha karmaşık hale getirmek gerekiyor?

Laravel 4'te test edilmiştir.

Başka bir yararı, sözdizimi vurgulama düzgün çalışır (daha önce yorum kesmek kullanıyordum ve okumak korkunçtu)


21

Blade Templating Motorunda Değişkenleri Ayarlayabilirsiniz Aşağıdaki Yollar:

1. Genel PHP Blok
Ayar Değişkeni: <?php $hello = "Hello World!"; ?>
Çıktı: {{$hello}}

2. Blade PHP Blok
Ayar Değişkeni: @php $hello = "Hello World!"; @endphp
Çıktı: {{$hello}}


19

Laravel 5.2.23'ten beri, satır içi veya blok ifadesi olarak kullanabileceğiniz @php Blade yönergesine sahipsiniz:

@php($old_section = "whatever")

veya

@php
    $old_section = "whatever"
@endphp

15

Görünüm dosyasında bir değişken ayarlayabilirsiniz, ancak tam ayarladığınız gibi yazdırılır. Her neyse, bir çözüm var. Değişkeni kullanılmayan bir bölüm içinde ayarlayabilirsiniz. Misal:

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

Ardından istediğiniz yere {{ $yourVar }}yazdırır Your value, ancak değişkeni kaydettiğinizde çıktı almazsınız.

EDIT: bölüm adlandırma gereklidir aksi takdirde bir istisna atılır.


Eklenmesi gereken başka bir şey yoktur Tanımlanmamış özellik: Illuminate \ View \ Factory :: $ startSection (Görünüm: /home/vagrant/Code/dompetspy/resources/views/reviews/index.blade.php)
MaXi32

14

Laravel 4'te:

Değişkenin yalnızca şablonunuzda değil tüm görünümlerinizde erişilebilir olmasını istiyorsanız View::shareharika bir yöntemdir ( bu blog hakkında daha fazla bilgi ).

Sadece şunu app / controllers / BaseController.php dosyasına ekleyin

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

ve şimdi $myvarşablonunuz da dahil olmak üzere tüm görünümleriniz için kullanılabilir olacak.

Bunu görüntülerim için ortama özgü varlık URL'leri ayarlamak için kullandım.


1
Aradığım şey bu: veritabanında yinelenen çağrıları önlemek için harika bir yol!
clod986

Laravel 5'te bu bir seçenek gibi görünmüyor mu?
Goddard

@Goddard Hala yapabilirsiniz. Sözdizimi yine de değişti: stackoverflow.com/a/36780419/922522
Justin

8

Ve aniden hiçbir şey görünmeyecek. Deneyimlerime göre, böyle bir şey yapmanız gerekiyorsa, html'yi bir modelin yönteminde hazırlayın veya kodunuzu dizilere veya başka bir şeye yeniden düzenleyin.

Asla sadece 1 yolu yoktur.

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

11
Modeldeki HTML hazırlansın mı? Bu hayal edilebilecek en çirkin şey.
duality_

@duality_ Görüşünüzde değişkenleri bildiriyor ve değiştiriyorsunuz. Muhtemelen kodunuzu yanlış düzenlediğinizi söyledim. Lrn 2 mimar.
Michael J.Calkins

3
Elbette, Michael ... Bu değişkenler gibi değişkenler değil $users = ..., çizgiler boyunca bir şeydir $css_class = ..., bu yüzden tasarımcı tarafından belirlendiği gibi modele veya denetleyiciye ait olmayan değişkenleri kesinlikle tasarlayın.
duality_

2
o rotaya gitmeniz gerekiyorsa, daha basit ve zarif çözümü tercih ederim: {{''; $ x = 1}}
Daniel


6

@Pim tarafından verilen cevabı uzatacağım.

Bunu AppServiceProvider'ınızın önyükleme yöntemine ekleyin

<?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}; ?>";
});

Bu şekilde herhangi bir php ifadesi yazma yeteneğini açığa vurmaz.

Bu yönergeyi aşağıdaki gibi kullanabilirsiniz:

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

5

Laravel 5.1, 5.2'de :

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

Bir veri parçasını uygulamanız tarafından oluşturulan tüm görünümlerle paylaşmanız gerekebilir . Bunu, görünüm fabrikasının paylaşım yöntemini kullanarak yapabilirsiniz. Genellikle, bir servis sağlayıcının önyükleme yöntemi içinde paylaşmak için aramalar yapmalısınız. Bunları AppServiceProvider'a ekleyebilir veya barındırmak için ayrı bir hizmet sağlayıcısı oluşturabilirsiniz.

Dosyayı düzenle: /app/Providers/AppServiceProvider.php

<?php

namespace App\Providers;

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

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


3

Zarif yoluma gelince aşağıdaki gibi

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

Ve sadece $old_sectiondeğişkeninizi yankılayın .

{{ $old_section }}

3

Eğer varsa PHP 7.0:

Basit ve en etkili yol parantez içindeki atamadır .

Kural basit: Değişkeninizi bir kereden fazla mı kullanıyorsunuz? Ardından, parantez içinde ilk kez kullanıldığında bildirin, sakin olun ve devam edin.

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

Ve evet, biliyorum @forelse, bu sadece bir demo.

Değişkenleriniz artık ve ne zaman kullanıldıklarına göre bildirildiğinden, herhangi bir blade geçici çözümüne gerek yoktur.


2

Yapabileceğinizi sanmıyorum - ama yine de, bu tür bir mantık muhtemelen kontrol cihazınızda ele alınmalı ve önceden ayarlanmış görünüme geçirilmelidir.


6
Bazı değişkenler kesinlikle görüntüleme içindir. $previous_group_name,, $separator_printedvb.
duality_

2
Yalnızca görünümler içinse, denetleyiciden görünüme geçirmeniz yeterlidir. Tüm görünümlerde kullanılabilir olmasını istiyorsanız, yukarıdaki cevabımı kullanarak bakın app/controllers/BaseController.php.
Justin

1
Tüm $ verilerimi görünüme göndermek için birden fazla dizi kullanıyorum
Hos Mercury

2

Blade şablonuna değişken atayın, İşte çözümler

<?php ?>Blade sayfasında etiketi kullanabiliriz

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

VEYA

Blade açıklamasını özel sözdizimi ile kullanabiliriz

{{--*/ $var = 'test' /*--}}
{{ $var }}

1

Yorumları kesmek, bunu yapmanın çok okunaklı bir yolu değildir. Ayrıca editörler bir yorum olarak renklendirir ve kod bakarken birisi onu özleyebilir.

Bunun gibi bir şey deneyin:

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

Aşağıdakilere derlenecektir:

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

... ve ödevi yap, hiçbir şeyi yankılama.


1

Controller'da değişken tanımlamak ve daha sonra compact()veya ->with()yöntemini kullanarak görünüme geçmek daha iyidir .

Aksi takdirde #TLGreg en iyi yanıtı verdi.



1

Bir anahtara bir değer atamanın ve onu defalarca kullanmanın bir yolunu arıyordum. Bu durumda, @section{"key", "value"}ilk etapta kullanabilir ve daha sonra @yield{"key"}görünümünüzdeki veya alt öğesindeki diğer yerlerdeki değeri çıktılamak için arayabilirsiniz .


0

Bence mantığı kontrolörde tutmak ve kullanılacak görünüme geçirmek daha iyi olur. Bu, 'View :: make' yöntemini kullanarak iki yoldan biriyle yapılabilir. Şu anda Laravel 3 kullanıyorum, ancak Laravel 4'te de aynı şekilde olduğundan eminim.

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

veya

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

'With' yöntemi zincirlenebilir. Daha sonra yukarıdaki gibi kullanırsınız:

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

Daha fazla bilgi burada:

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

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


Sunum mantığı en iyi görünümde tutulur. Bazen, görünümün içinden bir değişken oluşturmanız gerekir. örneğin bir tarihi biçimlendirmek için. $format='Y-m-d H:i:s';böylece bu biçimi görünüm içinde yeniden kullanabilirsiniz. Bu kesinlikle kontrolöre ait değildir. Bununla birlikte, soruya cevap olarak ... <?php ?>Etiketlerle ilgili yanlış bir şey yok .
Gravy

0

Benzer bir sorum vardı ve View Composers ile doğru çözüm olduğunu düşündüğüm şeyi buldum

Görünüm Oluşturucuları, belirli bir görünüm her çağrıldığında değişkenleri ayarlamanıza olanak tanır ve bunlar belirli görünümler veya görünüm şablonlarının tamamı olabilir. Her neyse, sorunun doğrudan bir cevap olmadığını biliyorum (ve 2 yıl çok geç), ancak blade ile bir görünümde değişkenler ayarlamaktan daha zarif bir çözüm gibi görünüyor.

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

0

laravel 5 bunu kolayca yapabilirsiniz. aşağıya bakınız

{{--*/ @$variable_name = 'value'  /*--}}

0

Bıçağı aşağıda gösterildiği gibi uzatma yöntemini kullanarak uzatabilirsiniz.

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

bundan sonra değişkenleri aşağıdaki gibi başlatın.

@var $var = "var"

-1

blade'in tüm sürümlerinde çalışır.

{{--*/  $optionsArray = ['A', 'B', 'C', 'D','E','F','G','H','J','K'] /*--}}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.