Praktik Terbaik untuk Pembantu Laravel 4 dan Fungsi Dasar?

152

Saya mencoba memahami tempat terbaik untuk meletakkan fungsi global di Laravel 4. Misalnya, format tanggal. Saya tidak berpikir membuat fasad tidak sia-sia karena fasad terlalu modular. Saya telah membaca artikel tentang membuat folder perpustakaan dan menyimpan kelas di sana tetapi itu juga sepertinya banyak untuk fungsi sederhana. Tidakkah 'alat' seperti ini tersedia di templat Blade?

Apa praktik terbaik untuk sesuatu seperti ini dan bagaimana cara membuatnya tersedia untuk templat Blade?

Jason Spick
sumber

Jawaban:

233

Cara jelek, malas, dan mengerikan: Di akhir bootstrap/start.php, tambahkan include('tools.php')dan letakkan fungsi Anda di file baru itu.

Cara bersih: Buat perpustakaan. Dengan begitu, itu akan dimuat secara otomatis SAJA saat Anda benar-benar menggunakannya.

  • Buat librariesfolder di dalam appfolder Anda
  • Buat file perpustakaan Anda, buat kelas di dalamnya, dan tambahkan fungsi statis ke dalamnya
  • Opsi 1 : Edit start/global.phpuntuk menambahkan app_path().'/libraries'ke ClassLoader::addDirectories( array.
  • Opsi 2 : Edit composer.jsonuntuk menambahkan "app/libraries"ke autoloadarray. Laricomposer dump-autoload
  • Panggil kelas Anda dan fungsi statis dari pandangan Anda.

Tentang opsi Anda, dikutip dari global.phpfile

Selain menggunakan Komposer, Anda dapat menggunakan pemuat kelas Laravel untuk memuat pengontrol dan model Anda. Ini berguna untuk menjaga semua kelas Anda di namespace "global" tanpa memperbarui Komposer.

Anda dapat menggabungkan kedua opsi, di mana loader kelas Laravel akan secara otomatis mencari kelas di direktori terdaftar ( Opsi 1 , lebih mudah) dan Komposer akan menyimpan catatan semua kelas tetapi hanya setelah Anda memperbaruinya ( Opsi 2 , dapat meningkatkan kinerja).

Alexandre Danault
sumber
3
Saya pikir Anda juga harus menempatkan app_path().'/library', di start / global.php.
Alexandre Butynski
2
@AlexandreButynski Poin bagus. Ini akan memungkinkan untuk menambah perpustakaan tanpa harus memperbarui komposer setiap kali. Saya mengedit posting saya untuk menambahkan ini.
Alexandre Danault
Jadi saya membuat kelas yang disebut IDK ... SiteHelpers dan kemudian mendefinisikan metode formatDate. dan kemudian di templat saya harus dapat melakukan SiteHelpers :: formatDate ($ date)?
Jason Spick
@JasonSpick Ya, dan pastikan Anda memberi nama file Andasitehelpers.php
Alexandre Danault
3
Mengapa Anda perlu menambahkannya ke autoload komposer serta file global.php?
CashIsClay
82

Cara saya melakukan ini adalah membuat folder baru di /appdirektori di root proyek Laravel 4 Anda. Kemudian tambahkan folder ini ke array /app/start/global.phpfile pertama seperti:

<?php

ClassLoader::addDirectories(array(

app_path().'/commands',
app_path().'/controllers',
app_path().'/models',
app_path().'/database/seeds',
app_path().'/classes', // This line is the one I've added.

));

Selama struktur folder dalam /app/classesfolder baru mengikuti konvensi penempatan nama Anda. Laravel 4 akan memuat secara otomatis semua kelas / file dalam folder ini. Dengan cara ini tidak perlu menggali file komposer atau menjalankan perintah komposer.

Tidak yakin apakah ini praktik terbaik tetapi tentu berhasil.

Jika Anda membuat file sederhana bernama /app/classes/Helpers/Helper.phpseperti ini:

<?php namespace Helpers;

class Helper {

    public static function helloWorld()
    {
        return 'Hello World';
    }
}

Yang perlu Anda lakukan hanyalah menelepon Helpers\Helper::helloWorld();

Anda juga bisa menambahkan kelas pembantu ini di /app/config/app.phpfile Anda . Cukup tambahkan sesuatu seperti ini di akhir aliasesarray:

'Helper'          => 'Helpers\Helper'
JasonMortonNZ
sumber
4
Saya suka cara ini karena Anda tidak perlu bergaul dengan komposer apa pun, solusi bersih dan berkelas. +1
Gadoma
3
Jika Anda ingin menambahkan kelas helper Anda ke file app.php Anda sekarang dapat mengakses kelas langsung seperti ini: Helper :: hellowWorld ();
Helmut Granda
haruskah penolong menjadi kelas? dapatkah saya mendefinisikan fungsi sederhana di sini?
Webinan
2
Ini tidak berfungsi jika Anda tidak mengedit composer.json dan tidak menjalankan dumpautoload composer
Rommy
1
Solusi bagus Seperti kata Rommy, jangan lupa lari composer dump-autoload- saya lakukan dan menghabiskan 20 menit menggaruk-garuk kepala.
al_manchester
25

Metode helpers.php Laravel adalah menambahkannya ke "file" Anda di composer.json ( https://github.com/laravel/framework/blob/master/composer.json ):

"autoload": {
    "classmap": [
        ...
    ],
    "files": [
        "app/libraries/helpers.php"
    ],
},

Apa yang saya lakukan adalah membuat kelas kecil (beberapa metode per kelas, satu baris per metode, semuanya diperluas dari sesuatu dan KERING, itulah tujuan saya),

class ExtendedCarbon extends Carbon\Carbon {

    public function formatDDMMAAAA($date)
    {
        /// format and return
    }

}

simpan di aplikasi / perpustakaan dan tambahkan ke composer.json:

"autoload": {
    "classmap": [
        ...
        "app/libraries",
        ...
    ],
},

Menjalankan

composer dump

Dan kemudian gunakan saja di mana pun Anda butuhkan

$formatted = (new ExtendedCarbon)->formatDDMMAAAA($date);

Tonton video ini tentang refactoring: http://www.youtube.com/watch?v=DC-pQPq0acs

Omong-omong, saya agak yakin itu hanya contoh, tetapi Anda mungkin tidak perlu penolong untuk memformat tanggal, karena semua tanggal di Laravel adalah contoh Karbon ( https://github.com/briannesbitt/Carbon ) dan ini memiliki banyak metode untuk memformat tanggal dan waktu.

Antonio Carlos Ribeiro
sumber
Saya sendiri bukan penggemar berat metode statis, dan mencoba menggunakan metode contoh bila perlu. Bug Aku cukup yakin bahwa dalam kasus penggunaan tersebut, Anda akan jauh lebih baik memiliki formatDDMMAAAA()sebagai static.
XedinTidak Diketahui
7

Anda juga dapat menggunakan View::share()bersama dengan penutupan untuk mencapai ini - Saya baru saja memposting tentang ini: http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/

Manfaat tambahan: Anda tidak perlu membuat kelas tambahan dan juga menjaga namespace global tetap bersih.

Franz
sumber
Saya suka pendekatan ini. Lebih banyak kereta api. Bisakah kita beberapa cara menambahkan semua metode view-helper di dalam suatu sifat dan memilikinya tersedia dalam tampilan blade?
bibstha
Saya pikir itu tidak mungkin dengan PHP, jujur ​​saja.
Franz