Cara Mengatur Variabel dalam Templat Blade Laravel

247

Saya membaca dokumentasi Laravel Blade dan saya tidak tahu cara menetapkan variabel di dalam templat untuk digunakan nanti. Saya tidak dapat melakukannya {{ $old_section = "whatever" }}karena itu akan menggemakan "apa pun" dan saya tidak menginginkan itu.

Saya mengerti bahwa saya bisa melakukannya <?php $old_section = "whatever"; ?>, tetapi itu tidak elegan.

Apakah ada cara yang lebih baik dan elegan untuk melakukannya di templat Blade?

dualitas_
sumber
1
Periksa tarikan ini: github.com/laravel/laravel/pull/866
Spir
Ini sering berguna untuk pengujian, terutama jika Anda mengerjakan template tetapi orang lain bekerja pada bagian PHP. Berhati-hatilah untuk menghapus deklarasi ketika Anda selesai menguji.
trysis
Apa yang salah dengan hanya melakukan <?php $old_section = "whatever"; ?>. Saya merasa itu cukup mudah dibaca.
Jaime Hablutzel
@JaimeHablutzel jawabannya, menurut saya, ada di pertanyaan: tidak elegan.
dualitas_

Jawaban:

122

Tidak disarankan melakukan dalam tampilan sehingga tidak ada tag blade untuk itu. Jika Anda ingin melakukan ini dalam tampilan blade Anda, Anda bisa membuka tag php saat Anda menulisnya atau mendaftarkan tag blade baru. Contoh saja:

<?php
/**
 * <code>
 * {? $old_section = "whatever" ?}
 * </code>
 */
Blade::extend(function($value) {
    return preg_replace('/\{\?(.+)\?\}/', '<?php ${1} ?>', $value);
});
TLGreg
sumber
9
Variabel dalam tampilan memiliki beberapa kegunaan. Ini terlihat hebat! Di mana tempat yang baik untuk meletakkan kode ini?
dualitas_
1
Anda dapat memasukkannya ke dalam aplikasi / start.php Anda atau jika Anda akan memiliki lebih banyak hal seperti ini, letakkan di file terpisah dan sertakan di sana. Laravel sangat longgar dengan cara ini, Anda bahkan bisa meletakkan pengontrol tipis. Satu-satunya hal yang harus Anda lakukan ini meluas sebelum tampilan diberikan.
TLGreg
19
Apa alasan untuk menambahkan kode tambahan ini hanya untuk digunakan {?daripada hanya menggunakan asli <??
Justin
1
Jika tidak dianjurkan, apakah ada cara yang lebih "tepat" untuk melakukan hal berikut? Saya memiliki situs tempat judul ditampilkan dalam tampilan aplikasi utama sebagai {{$ title}}, yang berisi subsistem yang perlu menambahkan nomor halaman ke judul ("Halaman Formulir Aplikasi {{$ halaman}}") dan Saya memberikan $ page ke view (yang digunakan sebaliknya dalam view). Saya tidak ingin membuat judul di setiap panggilan pengontrol, saya hanya ingin mengirim tampilan nomor halaman - kalau-kalau suatu hari saya ingin mengubah judul dasar. Saya menggunakan <? Php $ title = ...?> Sekarang, tetapi apakah ada cara yang lebih benar?
jdavidbakr
4
Variabel harus dilewatkan dari controller, tidak dinyatakan inline dalam pandangan Anda. Jika templat global membutuhkan variabel, Anda dapat mengaturnya di penyedia layanan stackoverflow.com/a/36780419/922522 . Jika templat khusus halaman memerlukan variabel, gunakan @yield dan berikan dari tampilan anak yang memiliki pengontrol. laravel.com/docs/5.1/blade#template-inheritance
Justin
361

LARAVEL 5.5 DAN ATAS

Arahan blade @php tidak lagi menerima tag inline. Alih-alih, gunakan bentuk lengkap dari arahan:

@php
$i = 1
@endphp

LARAVEL 5.2 DAN ATAS

Anda bisa menggunakan:

@php ($i = 1)

Atau Anda dapat menggunakannya dalam pernyataan blokir:

@php
$i = 1
@endphp

LARAVEL 5

Perpanjang Blade seperti ini:

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

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

Kemudian lakukan salah satu dari yang berikut:

Solusi cepat: Jika Anda malas, cukup masukkan kode pada fungsi boot () dari AppServiceProvider.php.

Solusi yang lebih baik: Buat penyedia layanan sendiri. Lihat https://stackoverflow.com/a/28641054/2169147 tentang cara memperpanjang blade di Laravel 5. Ini sedikit lebih banyak bekerja dengan cara ini, tetapi latihan yang bagus tentang cara menggunakan Penyedia :)

LARAVEL 4

Anda bisa meletakkan kode di atas di bagian bawah app / start / global.php (atau tempat lain jika Anda merasa itu lebih baik).


Setelah perubahan di atas, Anda dapat menggunakan:

@define $i = 1

untuk menentukan suatu variabel.

Pim
sumber
5
Bagus! Harap dicatat bahwa Anda dapat menjalankan pernyataan php apa pun dengan implementasi Anda. Saya akan mengubah nama menjadi soemething seperti @php. Sangat berguna ...
igaster
Sangat benar, igaster. Anda dapat mengganti nama 'define' menjadi 'php' jika Anda mau, tetapi hal itu membuka perangkap untuk menggunakan php secara berlebihan di templat Anda :)
Pim
1
Terima kasih @ C.delaFonteijne, jika Anda menggunakan namespacing (dan Anda harus), \ memang diperlukan. Saya telah menambahkan \ dalam kode di atas.
Pim
1
Harap dicatat bahwa implementasi Anda yang hampir pasti adalah standar sejak Laravel 5.2 . Anda dapat menggunakan @php(@i = 1)atau menggunakannya dalam pernyataan blokir (dekat dengan @endphp)
Daan
1
Saya tidak melihat bagaimana "@php" "@endphp" "lebih elegan" daripada "<? Php" "?>". Bahkan beberapa karakter lagi! Apakah ini hanya karena diawali dengan "@" seperti arahan Blade lainnya? Kami pengembang adalah sekelompok obsesif-kompulsif! ;-)
OMA
116

Di , Anda dapat menggunakan sintaks komentar templat untuk mendefinisikan / mengatur variabel.

Sintaks komentar adalah {{-- anything here is comment --}}dan diberikan oleh mesin sebagai

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

jadi dengan sedikit trik kita bisa menggunakannya untuk mendefinisikan variabel, misalnya

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

akan ditampilkan oleh sebagai <?php /* */$i=0;/* */ ?>yang menetapkan variabel bagi kita. Tanpa mengubah baris kode apa pun.

Mencoba Tobemyself
sumber
2
@ coba-coba sendiri +1 | Bukan cara Praktik Terbaik , tetapi sempurna untuk peretasan cepat kode dalam template seperti dengan gaya inline untuk html.
Markus Hofmann
121
Saya tidak akan merekomendasikan melakukan hack ini sebagai orang yang melihat kode ini setelah Anda akan membenci Anda.
Justin
2
Setuju dengan Justin, tag komentar untuk komentar, tanda komentar dalam komentar dan mulai melakukan sesuatu yang lain meminta masalah
Leon
27
Ini tidak lebih baik daripada polos 'php<?php $i=0; ?>
gyo
3
Apa gunanya melakukan ini daripada menggunakan tag php ?? Ini tidak dapat dibaca (seperti komentar), membutuhkan lebih banyak pengetikan, dan mungkin rusak dengan pembaruan ke sistem parsing. Bahkan jika ada benarnya, itu bukan jawaban untuk cara mendefinisikan variabel dalam templat blade. Tidak tahu apa yang salah dengan para pemilih, mungkin mereka menganggap ini 'culun'? meh ...
SuperDuck
52

Ada solusi sederhana yang tidak mengharuskan Anda untuk mengubah kode apa pun, dan itu berfungsi di Laravel 4 juga.

Anda cukup menggunakan operator penugasan ( =) dalam ekspresi yang diteruskan ke @ifpernyataan, alih-alih (misalnya) operator seperti ==.

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

Kemudian Anda bisa menggunakannya di mana saja Anda bisa menggunakan variabel lain

{{ $variable }}

Satu-satunya downside adalah tugas Anda akan terlihat seperti kesalahan bagi seseorang yang tidak menyadari bahwa Anda melakukan ini sebagai solusi.

BTMPL
sumber
27

Ya akan membuatnya terlalu rumit.

Cukup gunakan php biasa

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

donesies.

(atau https://github.com/alexdover/blade-set juga terlihat cukup lurus)

Kita semua agak "meretas" sistem dengan mengatur variabel dalam tampilan, jadi mengapa membuat "retas" lebih rumit dari yang seharusnya?

Diuji dalam Laravel 4.

Manfaat lain adalah bahwa penyorotan sintaks berfungsi dengan baik (saya menggunakan hack komentar sebelumnya dan itu mengerikan untuk dibaca)

Sabrina Leggett
sumber
21

Anda Dapat Mengatur Variabel Di Mesin Templating Blade Cara-Cara berikut:

1.
Variabel Pengaturan Blok PHP Umum : <?php $hello = "Hello World!"; ?>
Output: {{$hello}}

2.
Variabel Pengaturan Blok PHP Blade : @php $hello = "Hello World!"; @endphp
Output: {{$hello}}

Pangeran Ahmed
sumber
19

Sejak Laravel 5.2.23, Anda memiliki arahan @php Blade , yang dapat Anda gunakan inline atau sebagai pernyataan blok:

@php($old_section = "whatever")

atau

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

Anda dapat mengatur variabel dalam file tampilan, tetapi itu akan dicetak seperti Anda mengaturnya. Lagi pula, ada solusinya. Anda dapat mengatur variabel di dalam bagian yang tidak digunakan. Contoh:

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

Kemudian {{ $yourVar }}akan mencetak di Your valuemana saja Anda inginkan, tetapi Anda tidak mendapatkan output ketika Anda menyimpan variabel.

EDIT: penamaan bagian diperlukan jika tidak pengecualian akan dilempar.

Vasile Goian
sumber
Tidak berfungsi, sesuatu yang lain harus dimasukkan Properti tidak terdefinisi: Menyinari \ Lihat \ Pabrik :: $ startSection (Lihat: /home/vagrant/Code/dompetspy/resources/views/reviews/index.blade.php)
MaXi32
14

Dalam Laravel 4:

Jika Anda ingin variabel dapat diakses di semua tampilan Anda, bukan hanya template Anda, View::shareadalah metode yang hebat ( info lebih lanjut di blog ini ).

Cukup tambahkan berikut ini di app / controllers / BaseController.php

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

dan sekarang $myvarakan tersedia untuk semua tampilan Anda - termasuk template Anda.

Saya menggunakan ini untuk mengatur URL aset khusus lingkungan untuk gambar saya.

Justin
sumber
1
Inilah yang saya cari: cara terbaik untuk menghindari panggilan duplikat di basis data!
clod986
Sepertinya ini bukan opsi di Laravel 5?
Goddard
@ Goddard Anda masih bisa. Sintaks telah berubah: stackoverflow.com/a/36780419/922522
Justin
8

Dan tiba-tiba tidak ada yang muncul. Dari pengalaman saya, jika Anda harus melakukan sesuatu seperti ini, siapkan html dalam metode model atau lakukan pengorganisasian ulang kode Anda ke array atau sesuatu.

Tidak pernah hanya 1 cara.

{{ $x = 1 ? '' : '' }}
Michael J. Calkins
sumber
11
Siapkan HTML dalam model? Itu hal terburuk yang bisa dibayangkan.
dualitas_
@kualitas_ Anda mendeklarasikan dan mengubah variabel dalam tampilan Anda. Saya bilang Anda mungkin salah mengatur kode Anda. Arsitek 2 Lrn.
Michael J. Calkins
3
Tentu, Michael ... Variabel-variabel itu bukan variabel seperti $users = ..., tetapi sesuatu di sepanjang garis $css_class = ..., sehingga variabel desain yang bukan milik model atau controller, karena mereka ditentukan oleh desainer.
dualitas_
2
jika Anda perlu menempuh rute itu, saya lebih suka solusi yang lebih sederhana dan elegan: {{''; $ x = 1}}
Daniel
6

Saya akan memperluas jawaban yang diberikan oleh @Pim.

Tambahkan ini ke metode boot AppServiceProvider Anda

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

Dengan cara ini Anda tidak mengekspos kemampuan untuk menulis ekspresi php apa pun.

Anda dapat menggunakan arahan ini seperti:

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

Dalam Laravel 5.1, 5.2 :

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

Anda mungkin perlu berbagi sepotong data dengan semua tampilan yang diberikan oleh aplikasi Anda. Anda dapat melakukannya menggunakan metode bagikan tampilan pabrik. Biasanya, Anda harus melakukan panggilan untuk dibagikan dalam metode boot penyedia layanan. Anda bebas menambahkannya ke AppServiceProvider atau menghasilkan penyedia layanan terpisah untuk menampungnya.

Edit file: /app/Providers/AppServiceProvider.php

<?php

namespace App\Providers;

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

    public function register()
    {
        // ...
    }
}
Justin
sumber
5

Anda dapat menggunakan paket yang saya publikasikan: https://github.com/sineld/bladeset

Maka Anda dengan mudah mengatur variabel Anda:

@set('myVariable', $existing_variable)

// or

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

Adapun cara elegan saya adalah seperti berikut

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

Dan gema saja $old_sectionvariabel Anda .

{{ $old_section }}
Atur Kyar Wa Lar
sumber
3

Jika Anda memiliki PHP 7.0:

Cara sederhana dan paling efektif adalah dengan penugasan di dalam tanda kurung .

Aturannya sederhana: Apakah Anda menggunakan variabel Anda lebih dari sekali? Kemudian nyatakan itu pertama kali digunakan dalam kurung, tetap tenang dan lanjutkan.

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

Dan ya, saya tahu @forelse, ini hanya demo.

Karena variabel Anda sekarang dideklarasikan sebagai dan ketika digunakan, tidak perlu ada solusi blade apa pun.

Jonathan
sumber
2

Saya tidak berpikir Anda bisa - tetapi sekali lagi, jenis logika ini mungkin harus ditangani di controller Anda dan diteruskan ke tampilan yang sudah ditetapkan.

Darren Craig
sumber
6
Beberapa variabel hanya untuk tampilan. $previous_group_name,, $separator_printeddll.
duality_
2
Jika hanya untuk tampilan, Anda harus meneruskannya ke tampilan dari controller. Jika Anda ingin itu tersedia untuk semua tampilan, lihat jawaban saya di atas menggunakan app/controllers/BaseController.php.
Justin
1
Saya menggunakan banyak array untuk mengirim semua $ data saya ke tampilan
Hos Mercury
2

Tetapkan variabel ke templat blade, Inilah solusinya

Kita dapat menggunakan <?php ?>tag di halaman blade

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

ATAU

Kita dapat menggunakan komentar blade dengan sintaks khusus

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

Komentar peretasan bukan cara yang sangat mudah dibaca untuk melakukannya. Juga editor akan mewarnainya sebagai komentar dan seseorang mungkin melewatkannya ketika melihat melalui kode.

Coba sesuatu seperti ini:

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

Ini akan dikompilasi menjadi:

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

... dan melakukan tugas dan tidak menggemakan apa pun.

rotaercz
sumber
1

Lebih baik berlatih mendefinisikan variabel di Controller dan kemudian meneruskan untuk melihat menggunakan compact()atau->with() metode.

Kalau tidak, #TLGreg memberikan jawaban terbaik.

Mandeep Gill
sumber
1

Ada ekstensi yang sangat bagus untuk Blade radic / blade-extensions . Setelah Anda menambahkannya, Anda dapat menggunakan @set (variable_name, variable_value)

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

Saya mencari cara untuk menetapkan nilai ke kunci dan menggunakannya berkali-kali dalam pandangan saya. Untuk kasus ini, Anda dapat menggunakan @section{"key", "value"}di tempat pertama dan kemudian panggilan @yield{"key"}untuk menampilkan nilai di tempat lain dalam pandangan Anda atau anaknya.

Hafez Divandari
sumber
0

Menurut pendapat saya akan lebih baik untuk menjaga logika di controller dan meneruskannya ke tampilan untuk digunakan. Ini dapat dilakukan salah satu dari dua cara menggunakan metode 'View :: make'. Saat ini saya menggunakan Laravel 3 tetapi saya cukup yakin bahwa itu adalah cara yang sama di Laravel 4.

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

atau

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

Metode 'with' dapat dilakukan dengan rantai. Anda kemudian akan menggunakan seperti di atas:

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

Informasi lebih lanjut di sini:

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

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

Robert Brisita
sumber
Logika presentasi sebaiknya disimpan dalam tampilan. Terkadang, Anda perlu membuat variabel dari dalam tampilan. misalnya untuk memformat tanggal. $format='Y-m-d H:i:s';dengan cara itu Anda bisa menggunakan kembali format itu dalam tampilan. Ini tentu bukan milik controller. Yang mengatakan, dalam menanggapi pertanyaan ... Tidak ada yang salah dengan <?php ?>tag.
Gravy
0

Saya memiliki pertanyaan serupa dan menemukan apa yang saya pikir sebagai solusi yang tepat dengan View Composers

View Composers memungkinkan Anda untuk mengatur variabel setiap kali tampilan tertentu dipanggil, dan mereka bisa berupa tampilan spesifik, atau seluruh templat tampilan. Ngomong-ngomong, saya tahu itu bukan jawaban langsung untuk pertanyaan (dan 2 tahun terlambat) tetapi sepertinya solusi yang lebih anggun daripada mengatur variabel dalam tampilan dengan blade.

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

Laravel 5 Anda dapat dengan mudah melakukan ini. Lihat di bawah

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

Anda dapat memperluas bilah dengan menggunakan metode bentang seperti yang ditunjukkan di bawah ini ..

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

setelah itu inisialisasi variabel sebagai berikut.

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

berfungsi di semua versi blade.

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