Buku "Laravel. Panduan lengkap. Edisi ke-2

gambarHalo, habrozhiteli! Apa yang membedakan Laravel dari kerangka kerja PHP lainnya? Kecepatan dan kesederhanaan. Pengembangan aplikasi yang cepat, ekosistem yang luas, dan toolkit Laravel memungkinkan Anda untuk dengan cepat membuat situs dan aplikasi dengan kode yang bersih dan mudah dibaca.

Matt Staffer, seorang guru terkenal dan pengembang utama, menawarkan ikhtisar umum kerangka kerja dan contoh-contoh spesifik untuk bekerja dengannya. Buku ini akan membantu pengembang PHP yang berpengalaman dengan cepat memasukkan topik baru untuk mengimplementasikan proyek di Laravel. Publikasi ini juga mencakup topik Laravel Dusk dan Horizon, mengumpulkan informasi tentang sumber daya komunitas dan paket lain yang bukan bagian dari inti Laravel. Dalam buku ini Anda akan menemukan: • Alat untuk mengumpulkan, memeriksa, menormalkan, memfilter data pengguna • Blade, mesin templat kustom Laravel yang kuat • Model ORM Eloquent Ekspresif untuk bekerja dengan database aplikasi • Informasi tentang peran objek Illuminate Request dalam siklus hidup aplikasi • PHPUnit, Cemoohan dan Senja untuk menguji kode PHP Anda • Alat untuk menulis JSON dan RESTful API • Antarmuka untuk mengakses sistem file, sesi, cookie,cache dan pencarian • Menerapkan antrian, pekerjaan, acara, dan penerbitan acara WebSocket

Mesin Templat Blade


PHP sebagai bahasa templat berfungsi relatif baik. Tetapi ada kekurangannya, jadi Anda tidak bisa menggunakan <? Php sebaris di mana-mana. Sebagian besar kerangka kerja modern memiliki bahasa templat sendiri.

Laravel menawarkan mesin templat Blade sendiri berdasarkan mesin .NET Razor. Ini memiliki sintaksis singkat, cukup dimengerti, disertai dengan model pewarisan yang kuat dan intuitif dan ekstensibilitas yang mudah.

Anda dapat dengan cepat membiasakan diri dengan apa yang tampak seperti Blade pada Contoh 4.1.

Contoh 4.1 Contoh Blade

<h1>{{ $group->title }}</h1>
{!! $group->heroImageHtml() !!}

@forelse ($users as $user)
       • {{ $user->first_name }} {{ $user->last_name }}<br>
@empty
       No users in this group.
@endforelse

Seperti yang Anda lihat, kode Blade menggunakan kurung kurawal untuk Echo dan perjanjian di mana tag penggunanya, yang disebut "arahan", diawali dengan @. Anda akan menerapkan arahan untuk semua struktur manajemen Anda, serta untuk warisan dan fungsi kustom apa pun yang ingin Anda tambahkan.

Sintaks Blade bersih dan ringkas, jadi bekerja dengannya lebih mudah dan lebih menyenangkan daripada dengan alternatif. Tetapi pada saat Anda membutuhkan sesuatu yang rumit dalam templat Anda - warisan bersarang, kondisi kompleks atau rekursi - mesin menunjukkan sisi terbaiknya. Seperti komponen terbaik Laravel, komponen ini menyederhanakan dan membuat akses ke persyaratan aplikasi yang berat.

Selain itu, karena semua sintaks Blade dikompilasi ke dalam kode PHP biasa dan kemudian di-cache, itu cepat dan memungkinkan Anda untuk menggunakan PHP asli di file mesin ini jika diinginkan. Namun, saya akan merekomendasikan untuk tidak menggunakan PHP jika memungkinkan - biasanya jika Anda perlu melakukan sesuatu yang tidak mungkin dengan Blade atau petunjuk penggunanya, ini tidak berlaku untuk templat.

Tampilan data


Seperti yang Anda lihat pada Contoh 4.1, tanda kurung {{and}} digunakan untuk membungkus kode PHP yang ingin Anda tampilkan. Kode {{$ $ variable}} bertindak seperti <? = $ Variable?> Dalam PHP sederhana.

Namun, ada perbedaan: Blade melindungi semua pemetaan secara default dengan fungsi htmlentities () PHP untuk melindungi pengguna Anda dari menempelkan skrip berbahaya. Ini berarti bahwa {{$ variable}} secara fungsional setara dengan <? = Htmlentities ($ variable)?>. Jika Anda tidak ingin lepas dari output, gunakan {!!! dan !!} sebagai gantinya.
{{ }} -

, Blade ({{}}) -. Laravel , Blade Handlebars?

Blade {{ @. , , :

// Blade; $bladeVariable
//
{{ $bladeVariable }}

// @ "{{ handlebarsVariable }}"
//
@{{ handlebarsVariable }}

verbatim( http://bit.ly/2OnrPRP ).

Struktur pemerintahan


Sebagian besar struktur kontrol di Blade akan familier. Banyak yang secara langsung menduplikasi nama dan struktur dari tag yang sama di PHP.

Ada beberapa pembantu untuk kenyamanan, tetapi secara keseluruhan struktur kontrol terlihat lebih bersih daripada di PHP.

Konstruksi Bersyarat


Pertimbangkan struktur logis manajemen.

@if

Ekspresi @jika (kondisi $) di Blade mengkompilasi ke <? Php if ($ kondisi):?>.lain, lainjika dan berakhir jika- dengan gaya sintaks yang persis sama di PHP. Lihatlah

Contoh 4.2. Contoh 4.2. @jikalain, lainjika dan berakhir jika

@if (count($talks) === 1)
     There is one talk at this time period.
@elseif (count($talks) === 0)
     There are no talks at this time period.
@else
     There are {{ count($talks) }} talks at this time period.
@endif

Seperti halnya ekspresi kondisional PHP sendiri, Anda dapat mencampur dan menggabungkannya sesuka Anda. Mereka tidak memiliki logika tertentu; Ada penganalisis dengan pencarian dalam bentuk @jika (kondisi $) dan penggantian dengan kode PHP yang sesuai.

@unless @endunless

@unless, di sisi lain, adalah sintaks baru yang tidak memiliki padanan langsung dalam PHP. Ini kebalikan dari @jika. @unless ($ condition) sama dengan <? php if (! $ condition). Anda dapat melihatnya di Contoh 4.3.

Contoh 4.3 @unless dan @endunless

@unless ($user->hasPaid())
       You can complete your payment by switching to the payment tab.
@endunless

Siklus


Selanjutnya, pertimbangkan siklusnya.

@for, @foreach @while

untuk, untuk setiap dan sementarabekerja di Blade dengan cara yang sama seperti di PHP (contoh 4.4-4.4.6).

Contoh 4.4untuk dan @ endfor

@for ($i = 0; $i < $talk->slotsCount(); $i++)
      The number is {{ $i }}<br>
@endfor

Contoh 4.5 untuk setiap dan @ endforeach

@foreach ($talks as $talk)
       • {{ $talk->title }} ({{ $talk->length }} minutes)<br>
@endforeach

Contoh 4.6. sementara dan @ sementara

@while ($item = array_pop($items))
       {{ $item->orSomething() }}<br>
@endwhile

@forelse @endforelse

untukselain itu untuk setiap, yang dapat dieksekusi bahkan jika objek yang Anda cari kosong. Kami melihat ini beraksi di awal bab. Contoh 4.7 menunjukkan opsi lain.

Contoh 4.7.untuklain

@forelse ($talks as $talk)
       • {{ $talk->title }} ({{ $talk->length }} minutes)<br>
@empty
       No talks this day.
@endforelse

VARIABEL $ LOOP DALAM ARAH UNTUK SETIAPDan @FORELSE

Directiveuntuk setiap dan untukselain itu (diperkenalkan pada Laravel 5.3) menambahkan variabel $ loop, yang tidak tersedia dalam PHP foreach loop. Saat digunakan di dalam lingkaranuntuk setiap atau untukelse stdClass .

• index — 0 ; 0 — « ».

• iteration — 1 ; 1 — « ».

• remaining — , .

• count — .

• first — , , .

• last — , , .

• depth — «» : 1 , 2 . .

• parent — $loop , foreach; jika tidak, null.

Berikut ini contoh cara kerjanya:

<ul>
@foreach ($pages as $page)
       <li>{{ $loop->iteration }}: {{ $page->title }}
             @if ($page->hasChildren())
             <ul>
             @foreach ($page->children() as $child)
             <li>{{ $loop->parent->iteration }}
                   .{{ $loop->iteration }}:
                   {{ $child->title }}</li>
             @endforeach
             </ul>
             @endif
       </li>
@endforeach
</ul>

Warisan Templat


Blade menyediakan kerangka kerja warisan templat yang memungkinkan tampilan untuk diperluas, dimodifikasi, dan termasuk tampilan lainnya.

Mari kita lihat bagaimana warisan disusun dengan Blade.

Menentukan bagian halaman menggunakan @ bagian / @ arahan acara dan menghasilkan


Mari kita mulai dengan tata letak Blade tingkat atas, seperti pada Contoh 4.8. Ini adalah definisi dari pembungkus halaman universal yang nantinya akan kami tempatkan konten spesifik halaman.

Contoh 4.8. Struktur Blade

<!-- resources/views/layouts/master.blade.php -->
<html>
       <head>
              <title>My Site | @yield('title', 'Home Page')</title>
       </head>
       <body>
              <div class="container">
                    @yield('content')
              </div>
              @section('footerScripts')
                     <script src="app.js"></script>
              @show
       </body>
</html>

Ini menyerupai halaman HTML biasa, tetapi Anda dapat melihat hasil di dua tempat (judul dan konten), dan kami mendefinisikan bagian di bagian ketiga (catatan kaki). Di sini kita memiliki tiga arahan Blade: hanyamenghasilkan('kandungan'), menghasilkan('title', 'Home Page') dengan nilai default dan @ section / @ show dengan konten aktual di dalamnya.

Meskipun mereka terlihat sedikit berbeda, mereka pada dasarnya berfungsi sama. Ketiganya menentukan bahwa ada bagian dengan nama yang diberikan (parameter pertama) yang dapat diperluas kemudian, dan apa yang harus dilakukan jika bagian tersebut belum diperluas. Mereka melakukan ini baik dengan garis balik ('Halaman Beranda'), atau tanpa pengembalian (hanya tidak ada yang akan ditampilkan jika arahan tidak diperluas), atau dengan pengembalian seluruh blok (dalam kasus ini).

Apa bedanya? Dimenghasilkan('konten') tidak ada konten default. Selain itu, dimenghasilkan('judul') hanya akan ditampilkan jika arahan tidak diperluas. Jika tidak, bagian turunannya tidak akan memiliki akses terprogram ke nilai default. @ section / @ show secara bersamaan menentukan nilai default dan membuat kontennya dapat diakses oleh anak-anaknya melalui @parent.

Jika Anda memiliki tata letak induk seperti itu, Anda dapat mengembangkannya dalam file templat baru, seperti pada contoh 4.9.

Contoh 4.9. Ekstensi Tata Letak Blade

<!-- resources/views/dashboard.blade.php -->
@extends('layouts.master')

@section('title', 'Dashboard')

@section('content')
       Welcome to your application dashboard!
@endsection

@section('footerScripts')
      @parent
      <script src="dashboard.js"></script>
@endsection

Tampilan anak ini memungkinkan kami untuk menunjukkan kepada Anda beberapa konsep baru pewarisan Blade.

@extends

Dalam Contoh 4.9, menggunakan @extends ('layouts.master'), kami menentukan bahwa tampilan ini tidak boleh ditampilkan sendiri, tetapi memperluas tampilan lain. Ini berarti bahwa perannya adalah untuk menetapkan konten dari berbagai bagian, tetapi tidak untuk bekerja sendiri. Lebih mirip serangkaian blok konten daripada halaman HTML. Baris ini juga menentukan bahwa tampilan yang diperluas terletak pada resource / views / layouts / master.blade.php.

Setiap file harus memperluas hanya satu file lain, dan panggilan tambahan harus menjadi baris pertama file.

@section @endsection

Menggunakan @section ('title', 'Dashboard') kami menyediakan konten kami untuk bagian pertama, judul. Karena kontennya sangat singkat, alih-alih @section dan @endsection kami menggunakan formulir yang disingkat. Ini memungkinkan Anda untuk melewatkan konten sebagai parameter bagian kedua, dan kemudian melanjutkan. Jika Anda sedikit bingung dengan @section tanpa @endsection, Anda dapat menggunakan sintaksis yang biasa.

Dari @section ('content') dan seterusnya, kami menggunakan sintaksis yang biasa untuk mendefinisikan konten dari bagian konten. Sampai kita menyisipkan sedikit salam. Namun, perhatikan: saat Anda menggunakan @section dalam tampilan anak, Anda diakhiri dengan @endection (atau aliasnyaberhenti) sebagai gantinya menunjukkan, yang dicadangkan untuk mendefinisikan bagian dalam tampilan induk.

@parent

Dari @section ('footerScripts') dan seterusnya, kami menggunakan sintaks yang biasa untuk mendefinisikan konten dari bagian footerScripts.

Ingatlah bahwa kami benar-benar mendefinisikan konten ini (atau setidaknya "nilai default" -nya) sudah ada di tata letak utama. Jadi kali ini kami memiliki dua opsi: menimpa konten dari tampilan induk, atau menambahkannya.
Anda dapat melihat bahwa kami memiliki kemampuan untuk memasukkan konten dari tampilan induk menggunakan arahan @parent di dalam bagian ini. Jika tidak, isi bagian akan sepenuhnya ditulis ulang dengan segala sesuatu yang ditentukan dalam induk dari bagian ini.

Pencantuman komponen presentasi


Sekarang kami telah menemukan dasar-dasar pewarisan, beberapa trik lagi dapat digunakan.

@include

Bagaimana jika kita berada dalam satu tampilan dan ingin menggunakan yang lain? Mungkin ada tombol pendaftaran, yang diinginkan untuk ditambahkan kembali di seluruh situs. Dan mungkin saya ingin memilih tombol teks setiap kali kita menggunakannya. Lihatlah Contoh 4.10.

Contoh 4.10. Sertakan komponen tampilan dengantermasuk

<!-- resources/views/home.blade.php -->
<div class="content" data-page-name="{{ $pageName }}">
      <p>Here's why you should sign up for our app: <strong>It's Great.</strong></p>

      @include('sign-up-button', ['text' => 'See just how great it is'])
</div>

<!-- resources/views/sign-up-button.blade.php -->
<a class="button button--callout" data-page-name="{{ $pageName }}">
      <i class="exclamation-icon"></i> {{ $text }}
</a>

termasukmenarik komponen dan mentransfer data ke sana (opsional). Harap dicatat bahwa Anda tidak hanya dapat secara eksplisit mengirimkan data untuk dimasukkan melalui parameter keduatermasuk, tetapi juga merujuk ke variabel apa pun dalam file yang disertakan yang tersedia untuk tampilan yang disertakan (dalam contoh ini, $ pageName). Anda dapat melakukan apa pun yang Anda inginkan, tetapi saya akan merekomendasikan untuk kejelasan untuk selalu melewati setiap variabel yang ingin Anda terapkan.

Anda juga bisa menggunakan arahantermasukJika termasukKapan dan termasukPertama, seperti ditunjukkan pada Contoh 4.11.

Contoh 4.11. Sertakan tampilan bersyarat

{{--  ,    --}}
@includeIf('sidebars.admin', ['some' => 'data'])

{{--  ,     true --}}
@includeWhen($user->isAdmin(), 'sidebars.admin', ['some' => 'data'])

{{--        --}}
@includeFirst(['customs.header', 'header'], ['some' => 'data'])

@each

Anda dapat membayangkan keadaan saat Anda perlu beralih di atas array, koleksi dan termasukbagian untuk setiap item. Ada arahan untuk ini.setiap.

Katakanlah kita memiliki panel modular samping dan kami ingin memasukkan beberapa modul dengan nama mereka sendiri. Lihatlah Contoh 4.12.

Contoh 4.12. Menggunakan komponen tampilan dalam satu lingkaran dengansetiap

<!-- resources/views/sidebar.blade.php -->
<div class="sidebar">
      @each('partials.module', $modules, 'module', 'partials.empty-module')
</div>

<!-- resources/views/partials/module.blade.php -->
<div class="sidebar-module">
      <h1>{{ $module->title }}</h1>
</div>

<!-- resources/views/partials/empty-module.blade.php -->
<div class="sidebar-module">
      No modules :(
</div>

Pertimbangkan sintaksisnya setiap. Parameter pertama adalah nama komponen tampilan. Yang kedua adalah array atau koleksi untuk iterasi. Ketiga, nama variabel di mana setiap elemen (dalam hal ini, setiap elemen dalam array $ modules) akan diteruskan ke tampilan. Dan parameter opsional keempat adalah tampilan yang menunjukkan apakah array atau koleksi kosong (atau jika Anda inginkan, Anda dapat meneruskan string di sini yang akan digunakan sebagai templat Anda).

Menggunakan tumpukan


Template umum mungkin sulit dikelola dengan Blade dasar - ketika setiap tampilan dalam hierarki Blade perlu menambahkan sesuatu ke bagian tertentu - seperti menambahkan entri ke array.

Situasi yang paling umum adalah ketika halaman tertentu (dan kadang-kadang dalam arti yang lebih luas bagian tertentu dari situs) memiliki file CSS dan JavaScript unik khusus yang harus mereka muat. Bayangkan Anda memiliki file CSS "global" untuk seluruh situs, file CSS untuk bagian pekerjaan, dan file CSS untuk halaman "Dapatkan Pekerjaan".

Tumpukan blade dibuat hanya untuk itu. Di templat induk, tentukan tumpukan placeholder. Kemudian, di setiap templat anak, Anda dapat "mendorong" catatan di sana menggunakanDorong/ @ endpush, yang menambahkannya ke ujung tumpukan pada gambar akhir. Anda juga dapat menggunakan @ prepend / @ endprepend untuk menambahkannya ke awal. Contoh 4.13 menggambarkan hal ini.

Contoh 4.13. Menggunakan Blade Stacks

<!-- resources/views/layouts/app.blade.php -->
<html>
<head><!--  --></head>
<body>
       <!--    -->
       <script src="/css/global.css"></script>
       <!-- ,       -->
       @stack('scripts')
</body>
</html>

<!-- resources/views/jobs.blade.php -->
@extends('layouts.app')

@push('scripts')
        <!--  -    -->
        <script src="/css/jobs.css"></script>
@endpush

<!-- resources/views/jobs/apply.blade.php -->
@extends('jobs')

@prepend('scripts')
       <!--  -    -->
       <script src="/css/jobs--apply.css"></script>

@endprepend

Ini mengarah pada hasil berikut:

<html>
<head><!--  --></head>
<body>
       <!--    -->
       <script src="/css/global.css"></script>
       <!-- ,       -->
       <script src="/css/jobs--apply.css"></script>
       <script src="/css/jobs.css"></script>
</body>
</html>

Menggunakan komponen dan slot


Laravel menawarkan templat lain untuk memasukkan konten di antara tampilan, yang diperkenalkan di 5.4: komponen dan slot. Yang pertama paling efektif dalam konteks ketika Anda menggunakan tampilan komponen dan meneruskan sebagian besar konten ke dalamnya sebagai variabel. Lihatlah Contoh 4.14 untuk ilustrasi model atau tooltip yang mungkin mengingatkan pengguna akan kesalahan atau tindakan lain.

Contoh 4.14. Jendela modal adalah contoh buruk tampilan komponen

<!-- resources/views/partials/modal.blade.php -->
<div class="modal">
      <div>{{ $content }}</div>
      <div class="close button etc">...</div>
</div>

<!--    -->
@include('partials.modal', [
       'body' => '<p>The password you have provided is not valid. Here are the rules
       for valid passwords: [...]</p><p><a href="#">...</a></p>'
])

Ini terlalu banyak untuk variabel seperti itu dan sangat ideal untuk komponen.

Komponen dengan slot adalah komponen tampilan yang dirancang untuk memasukkan sebagian besar ("slot") untuk mengambil konten dari templat yang disertakan. Contoh 4.15 menunjukkan cara merekayasa balik kode dari contoh 4.14 menggunakan komponen dan slot.

Contoh 4.15. Modal window sebagai komponen yang lebih cocok dengan slot

<!-- resources/views/partials/modal.blade.php -->
<div class="modal">
      <div>{{ $slot }}</div>
      <div class="close button etc">...</div>
</div>

<!--    -->
@component('partials.modal')
        <p>The password you have provided is not valid.
        Here are the rules for valid passwords: [...]</p>

        <p><a href="#">...</a></p>
@endcomponent

Seperti yang Anda lihat pada Contoh 4.15, arahannya komponenmemungkinkan Anda untuk mengekstrak kode HTML kami dari string terkompresi variabel dan kembali ke ruang templat. Variabel $ slot dalam templat komponen kami menerima konten apa pun yang ditransfer kekomponen.

Slot gabungan


Metode yang kami gunakan dalam Contoh 4.15 disebut slot "default"; semua yang Anda lewatikomponendan @endcomponent, diteruskan ke variabel $ slot. Tetapi Anda juga dapat memiliki lebih dari sekadar slot default. Bayangkan jendela modal dengan judul, seperti pada contoh 4.16.

Contoh 4.16. Komponen representasi modal dengan dua variabel

<!-- resources/views/partials/modal.blade.php -->
<div class="modal">
      <div class="modal-header">{{ $title }}</div>
      <div>{{ $slot }}</div>
      <div class="close button etc">...</div>
</div>

Anda bisa menggunakan arahan slot dalam tantangan mereka komponenuntuk mentransfer konten ke slot selain dari default, seperti yang ditunjukkan pada Contoh 4.17.

Contoh 4.17. Transfer lebih dari satu slot ke suatu komponen

@component('partials.modal')
        @slot('title')
               Password validation failure
        @endslot

        <p>The password you have provided is not valid.
        Here are the rules for valid passwords: [...]</p>

        <p><a href="#">...</a></p>
@endcomponent

Dan jika dalam tampilan Anda ada variabel lain yang tidak berarti sebagai slot, Anda masih bisa meneruskan array konten sebagai parameter kedua ke komponen sama dengan termasuk. Lihatlah Contoh 4.18.

Contoh 4.18. Melewati data ke komponen tanpa slot

@component('partials.modal', ['class' => 'danger'])
         ...
@endcomponent

Memberi nama komponen sebagai arahan


Ada trik untuk menyederhanakan komponen panggilan: alias. Panggil saja Blade :: component () pada fasad Blade - yang paling umum adalah metode boot AppServiceProvider () - dan berikan lokasi komponen dan kemudian nama arahan yang diinginkan, seperti ditunjukkan pada Contoh 4.19.

Contoh 4.19. Pseudonimisasi komponen sebagai arahan

// AppServiceProvider@boot
Blade::component('partials.modal', 'modal');

<!--   -->
@modal
         Modal content here
@endmodal


»Informasi lebih lanjut tentang buku itu dapat ditemukan di situs web penerbit
» Isi
» Kutipan

Untuk Khabrozhiteley Diskon 25% pada kupon - Laravel

Setelah pembayaran versi kertas buku tersebut, sebuah buku elektronik dikirim melalui email.

All Articles