Saya ingin membuat fungsi pembantu untuk menghindari kode berulang antara tampilan di Laravel 5:
view.blade.php
<p>Foo Formated text: {{ fooFormatText($text) }}</p>
Mereka pada dasarnya fungsi pemformatan teks. Di mana dan bagaimana saya bisa membuat file dengan fungsi-fungsi ini?
php
laravel
laravel-5
laravel-helper
Calebe Oliveira
sumber
sumber
Kelas Kustom di Laravel 5, Jalan Mudah
Jawaban ini berlaku untuk kelas khusus umum dalam Laravel. Untuk jawaban yang lebih spesifik untuk Blade, lihat Petunjuk Blade Kustom di Laravel 5 .
Langkah 1: Buat file Pembantu Anda (atau kelas khusus lainnya) dan berikan namespace yang cocok. Tulis kelas dan metode Anda:
Langkah 2: Buat alias:
Langkah 3: Jalankan
composer dump-autoload
di root proyekLangkah 4: Gunakan di templat Blade Anda:
Kredit Ekstra: Gunakan kelas ini di mana saja di aplikasi Laravel Anda:
Sumber: http://www.php-fig.org/psr/psr-4/
Mengapa ini bekerja: https://github.com/laravel/framework/blob/master/src/Illuminate/Support/ClassLoader.php
Di mana autoloading berasal dari: http://php.net/manual/en/language.oop5.autoload.php
sumber
aliases
array diapp/config.php
:'Helper' => App\Helpers\Helper::class,
Maka Anda akan bisa memanggilHelper::prettyJson();
blade dengan baik.Pikiran awal saya adalah komposer yang memuat secara otomatis juga, tetapi tidak terasa terlalu Laravel bagi saya. L5 banyak menggunakan Penyedia Layanan, mereka adalah bootstrap aplikasi Anda.
Untuk memulai saya membuat folder di
app
direktori saya bernamaHelpers
. Kemudian di dalamHelpers
folder saya menambahkan file untuk fungsi yang ingin saya tambahkan. Memiliki folder dengan banyak file memungkinkan kita menghindari satu file besar yang terlalu panjang dan tidak dapat dikelola.Selanjutnya saya membuat
HelperServiceProvider.php
dengan menjalankan perintah artisan:Di dalam
register
metode saya menambahkan potongan initerakhir daftarkan penyedia layanan di
config/app.php
dalam array penyedia Andasekarang semua file di
Helpers
direktori Anda dimuat, dan siap digunakan.UPDATE 2016-02-22
Ada banyak pilihan bagus di sini, tetapi jika jawaban saya cocok untuk Anda, saya melanjutkan dan membuat paket untuk menyertakan pembantu dengan cara ini. Anda dapat menggunakan paket untuk inspirasi atau merasa bebas untuk mengunduhnya dengan Komposer juga. Ini memiliki beberapa pembantu built-in yang sering saya gunakan (tetapi semuanya tidak aktif secara default) dan memungkinkan Anda membuat pembantu kustom sendiri dengan generator Artisan sederhana. Ini juga membahas saran yang dimiliki salah satu responden tentang menggunakan mapper dan memungkinkan Anda untuk secara eksplisit menentukan pembantu kustom untuk memuat, atau secara default, secara otomatis memuat semua file PHP di direktori helper Anda. Umpan balik dan PR sangat kami hargai!
Github: browner12 / helper
sumber
start.php
(yang tidak bagus, tetapi melayani tujuannya untuk saat itu). apakah Anda punya saran lain untuk memuat banyak file?Inilah yang disarankan
JeffreyWay
dalam Diskusi Laracasts ini .app/Http
direktori Anda , buathelpers.php
file dan tambahkan fungsi Anda.composer.json
, diautoload
blok, tambahkan"files": ["app/Http/helpers.php"]
.composer dump-autoload
.sumber
app/helpers.php
atauapp/Helpers/
tampaknya menjadi tempat yang lebih baik.composer dump-autoload
?composer dump-autoload
Anda dapat mengikuti ini: dikembangkan.be/2014/08/29/composer-dump-autoload-laravelSetelah menyaring berbagai jawaban di SO dan Google, saya masih belum menemukan pendekatan yang optimal. Sebagian besar jawaban menyarankan kita meninggalkan aplikasi dan mengandalkan komposer alat pihak ke-3 untuk melakukan pekerjaan itu, tapi saya tidak yakin menyambung ke alat hanya untuk memasukkan file adalah bijaksana.
Jawaban Andrew Brown datang paling dekat dengan bagaimana saya pikir itu harus didekati, tetapi (setidaknya dalam 5.1), langkah penyedia layanan tidak perlu. Jawaban Heisian menyoroti penggunaannya
PSR-4
yang membawa kita selangkah lebih dekat. Inilah implementasi terakhir saya untuk bantuan dalam tampilan:Pertama, buat file pembantu di mana saja di direktori aplikasi Anda, dengan namespace:
Selanjutnya, alias kelas Anda di
config\app.php
, dalamaliases
larik:Dan hanya itu yang harus Anda lakukan.
PSR-4
dan alias harus memaparkan helper ke view Anda, jadi dalam view Anda, jika Anda mengetik:Seharusnya output:
sumber
{!! bob() !!}
. akan melakukan pencarian lagi dan melihat apakah itu mungkinbob()
benar - benar mendunia tidak akan menjadi hal yang bijaksana untuk dilakukan. Namespaces ada karena suatu alasan dan kita tidak boleh memanggilbob()
bersama fungsi PHP dasar. Saya akan menambahkan bit aliasing Anda ke kode saya - terima kasih!extends Helper
? Sepertinya tidak perlu bagi saya.extends Helper
memang tidak diperlukan. Terimakasih atas peringatannya.Arahan Blade Kustom di Laravel 5
Ya, ada cara lain untuk melakukan ini!
Langkah 1: Daftarkan arahan Blade khusus:
Langkah 2: Gunakan arahan Blade khusus Anda:
Output:
INI DIRECTIVE BLADE MY CUSTOM !!
Tautan Khusus
Sumber: https://laravel.com/docs/5.1/blade#extending-blade
Bacaan Tambahan: https://mattstauffer.co/blog/custom-conditionals-with-laravels-blade-directives
Jika Anda ingin mempelajari cara terbaik membuat kelas khusus yang dapat Anda gunakan di mana saja , lihat Kelas Kustom di Laravel 5, the Easy Way
sumber
Ini adalah file HelpersProvider.php saya:
Anda harus membuat folder bernama di
Helpers
bawahapp
folder, lalu membuat file bernamawhatever.php
inside dan menambahkan stringwhatever
di dalam array $ helpers.Selesai!
Edit
Saya tidak lagi menggunakan opsi ini, saya saat ini menggunakan komposer untuk memuat file statis seperti pembantu.
Anda dapat menambahkan pembantu secara langsung di:
sumber
glob()
seperti yang ditulis Andrew Brown? Jika Anda ingin dapat menentukan file yang ingin Anda sertakan, mengapa tidak menentukan file dalamcomposer.json
untuk secara otomatis memuatnya seperti yang ditulis Joseph Silber? Mengapa Anda lebih suka solusi ini? Saya tidak mengatakan ini adalah solusi yang buruk, saya hanya ingin tahu.composer.json
kecuali untuk dua poin - pertama, itu membuat peta di dalam aplikasi itu sendiri, bukan file metadata; kedua, itu tidak mengharuskan Anda untuk menjalankan kembalicomposer dump-autoload
setiap kali Anda mengubah daftar file untuk memuat.include
ataurequire
, Laravel sudah memiliki autoloading PSR-4 bawaanUntuk Perpustakaan Pembantu Kustom dalam proyek Laravel saya, saya telah membuat folder dengan nama
Libraries
diLaravel/App
Direktori saya dan dalam direktori Perpustakaan, saya telah membuat berbagai file untuk perpustakaan pembantu yang berbeda.Setelah membuat file pembantu saya, saya cukup memasukkan semua file itu dalam file composer.json saya seperti ini
dan jalankan
sumber
composer dump-autoload
dancomposer dumpautoload
juga berfungsi sebenarnya jugacomposer du
akan bekerja ...Karena OP meminta praktik terbaik , saya pikir kami masih kehilangan beberapa saran bagus di sini.
File helpers.php tunggal jauh dari praktik yang baik. Pertama karena Anda mencampur banyak fungsi yang berbeda, jadi Anda menentang prinsip-prinsip pengkodean yang baik. Selain itu, ini bisa melukai tidak hanya dokumentasi kode tetapi juga metrik kode seperti Kompleksitas Siklomatik , Indeks Maintainability dan Halstead Volume . Semakin banyak fungsi yang Anda miliki semakin buruk.
Dokumentasi kode akan OK menggunakan alat seperti phpDocumentor , tetapi menggunakan Sami itu tidak akan membuat file prosedural . Dokumentasi Laravel API adalah kasus seperti itu - tidak ada dokumentasi fungsi pembantu: https://laravel.com/api/5.4
Metrik kode dapat dianalisis dengan alat seperti PhpMetrics . Menggunakan PhpMetrics versi 1.x untuk menganalisis kode kerangka Laravel 5.4 akan memberi Anda metrik CC / MI / HV yang sangat buruk untuk file src / Illuminate / Foundation / helpers.php dan src / Illuminate / Support / helpers.php .
Beberapa file penolong kontekstual (mis. String_helpers.php , array_helpers.php , dll.) Tentu saja akan meningkatkan metrik buruk itu sehingga menghasilkan kode yang lebih mudah dipelihara. Tergantung pada generator dokumentasi kode yang digunakan ini akan cukup baik.
Ini dapat lebih ditingkatkan dengan menggunakan kelas pembantu dengan metode statis sehingga mereka dapat dikontekstualisasikan menggunakan ruang nama. Sama seperti bagaimana Laravel sudah melakukannya dengan
Illuminate\Support\Str
danIlluminate\Support\Arr
kelas. Ini meningkatkan baik metrik kode / organisasi dan dokumentasi. Alias kelas dapat digunakan untuk membuatnya lebih mudah digunakan.Penyusunan dengan kelas membuat organisasi kode dan dokumentasi lebih baik tetapi di sisi lain kita akhirnya kehilangan fungsi global yang hebat dan mudah diingat. Kita dapat lebih meningkatkan pendekatan itu dengan membuat alias fungsi ke metode kelas statis itu. Ini dapat dilakukan secara manual atau dinamis.
Laravel secara internal menggunakan pendekatan pertama dengan mendeklarasikan fungsi dalam file pembantu prosedural yang memetakan ke metode kelas statis. Ini mungkin bukan hal yang ideal karena Anda perlu mendeklarasikan ulang semua hal (docblock / argumen).
Saya pribadi menggunakan pendekatan dinamis dengan
HelperServiceProvider
kelas yang membuat fungsi-fungsi itu dalam waktu eksekusi:Bisa dibilang ini over engineering, tapi saya rasa tidak. Ia bekerja dengan sangat baik dan bertentangan dengan apa yang mungkin diharapkan tidak memerlukan waktu pelaksanaan yang relevan setidaknya saat menggunakan PHP 7.x.
sumber
Berikut ini skrip bash shell yang saya buat untuk membuat fasad Laravel 5 dengan sangat cepat.
Jalankan ini di direktori instalasi Laravel 5 Anda.
Sebut saja seperti ini:
Contoh:
Jika Anda menjalankan contoh itu, itu akan membuat direktori
Facades
dan diProviders
bawah 'your_laravel_installation_dir / app / MyApp'.Ini akan membuat 3 file berikut dan juga akan menampilkannya ke layar:
Setelah selesai, itu akan menampilkan pesan yang mirip dengan yang berikut:
Jadi perbarui daftar Penyedia dan Alias di 'config / app.php'
Lari
composer -o dumpautoload
"./App/MyApp/Facades/Helper.php" pada awalnya akan terlihat seperti ini:
Sekarang cukup tambahkan metode Anda di "./app/MyApp/Facades/Helper.php".
Inilah tampilan "./app/MyApp/Facades/Helper.php" setelah saya menambahkan fungsi Helper.
Fungsi ini mengharapkan suatu pola dan dapat menerima argumen boolean kedua opsional.
Jika URL saat ini cocok dengan pola yang diteruskan ke sana, itu akan menampilkan 'aktif' (atau 'kelas = "aktif"' jika Anda menambahkan 'benar' sebagai argumen kedua ke panggilan fungsi).
Saya menggunakannya untuk menyorot menu yang aktif.
Di bawah ini adalah kode sumber untuk skrip saya. Saya harap Anda menemukan itu berguna dan beri tahu saya jika Anda memiliki masalah dengan itu.
sumber
alih-alih menyertakan kelas pembantu kustom Anda, Anda sebenarnya dapat menambahkan ke
config/app.php
file Anda di bawah alias.Seharusnya terlihat seperti ini.
dan kemudian ke Controller Anda, sertakan Helper menggunakan metode 'use Helper' sehingga Anda dapat memanggil beberapa metode di kelas Helper Anda.
atau dalam tampilan sumber daya Anda dapat langsung menghubungi kelas Helper.
Namun ini masih merupakan pendekatan gaya pengkodean pengembang yang harus diikuti. Kami mungkin memiliki cara berbeda dalam memecahkan masalah, dan saya hanya ingin membagikan apa yang saya miliki juga untuk pemula.
sumber
Buat direktori pembantu khusus: Pertama-tama buat direktori Pembantu di direktori aplikasi. Buat definisi kelas hlper: Sekarang mari kita membuat fungsi pembantu sederhana yang akan menggabungkan dua string. Buat file baru MyFuncs.php di /app/Helpers/MyFuncs.php Tambahkan kode berikut
namespace App \ Helpers; mendefinisikan ruang nama Pembantu di bawah Ruang aplikasi. class MyFuncs {...} mendefinisikan MyFuncs kelas helper. public_name fungsi statis publik ($ first_name, $ last_name) {...} mendefinisikan fungsi statis yang menerima dua parameter string dan mengembalikan string yang digabungkan
Layanan pembantu menyediakan kelas
Penyedia layanan digunakan untuk memuat kelas secara otomatis. Kita perlu mendefinisikan penyedia layanan yang akan memuat semua kelas pembantu kita di direktori / app / Helpers.
Jalankan perintah artisan berikut:
php artisan make: provider HelperServiceProvider
File akan dibuat di
/app/Providers/HelperServiceProvider.php
Tambahkan kode berikut:
SINI,
Kita sekarang perlu mendaftarkan HelperServiceProvider dan membuat alias untuk pembantu kami.
Buka
/config/app.php
fileTemukan variabel array penyedia
Tambahkan baris berikut
Temukan variabel array alias
Tambahkan baris berikut
Simpan perubahan Menggunakan bantuan khusus kami
Kami akan membuat rute yang akan memanggil fungsi pembantu kustom kami Buka /app/routes.php
Tambahkan definisi rute berikut
SINI,
sumber
Pertama-tama buat helpers.php di dalam direktori App \ Http. Kemudian tambahkan kode berikut di dalam composer.json
Selanjutnya jalankan perintah berikut
Sekarang Anda dapat mendefinisikan fungsi kustom Anda di dalam file helpers.php.
sumber
Cara lain yang saya gunakan adalah: 1) membuat file di app \ FolderName \ fileName.php dan memiliki kode ini di dalamnya yaitu
2) Setelah itu di bilah kami
itu dia. dan itu berhasil
sumber
Praktik terbaik untuk menulis pembantu kustom adalah
1) Di dalam
app
direktori root proyek, buat folder bernama Pembantu (Hanya untuk memisahkan dan menyusun kode).2) Di dalam folder tulis file psr-4 atau file php normal
Jika file PHP dalam format psr-4 maka akan dimuat secara otomatis, atau tambahkan baris berikut di composer.json yang ada di dalam direktori root proyek
Di dalam
autoload
kunci, buat kunci baru bernamafiles
untuk memuat file pada saat memuat otomatis, di dalamfiles
objek tambahkan path mulai dari direktori aplikasi., Di sini adalah contoh.PS: coba jalankan
composer dump-autoload
jika file tidak dimuat.sumber
Buat Helpers.php di app / Helper / Helpers.php
Tambahkan komposer dan pembaruan komposer
gunakan di Controller
gunakan dalam tampilan perubahan dalam file config-> app.php
lihat panggilan
sumber
composer.json
tidak berguna, karena psr-4 autoload akan melakukan pekerjaan.dalam dir bootstrap \ autoload.php
tambahkan file ini
sumber
**
** buat pembantu baru
Gunakan untuk pengontrol dan file tampilan apa pun
sumber
Di laravel 5.3 dan di atas, tim laravel memindahkan semua file prosedural (
routes.php
) keluar dariapp/
direktori, dan seluruhapp/
folderpsr-4
dimuat secara otomatis. Jawaban yang diterima akan bekerja dalam kasus ini tetapi rasanya tidak cocok untuk saya.Jadi yang saya lakukan adalah saya membuat
helpers/
direktori di root proyek saya dan meletakkan file pembantu di dalamnya, dan dalamcomposer.json
file saya, saya melakukan ini:Dengan cara ini
app/
direktori saya masih satu psr-4 autoloaded, dan pembantu sedikit lebih terorganisir.Semoga ini bisa membantu seseorang.
sumber
Ada beberapa jawaban yang bagus di sini tetapi saya pikir ini adalah yang paling sederhana. Di Laravel 5.4 (dan versi prob sebelumnya juga) Anda dapat membuat kelas di tempat yang nyaman bagi Anda, mis. App / Libraries / Helper.php
Maka Anda bisa menyebutnya di templat Blade Anda seperti ini:
Jika Anda tidak ingin menggunakan @inject maka buat saja fungsi 'uppercasePara' sebagai statis dan embed panggilan dalam templat Blade Anda seperti ini:
Tidak perlu alias. Laravel menyelesaikan kelas beton secara otomatis.
sumber