Praktik Terbaik untuk Pembantu Kustom di Laravel 5 [ditutup]

472

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?

Calebe Oliveira
sumber

Jawaban:

595

Buat helpers.phpfile di folder aplikasi Anda dan muat dengan komposer:

"autoload": {
    "classmap": [
        ...
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": [
        "app/helpers.php" // <---- ADD THIS
    ]
},

Setelah menambahkan itu ke composer.jsonfile Anda , jalankan perintah berikut:

composer dump-autoload

Jika Anda tidak suka menyimpan helpers.phpfile Anda di appdirektori Anda (karena itu bukan file kelas namespace PSR-4), Anda dapat melakukan apa yang dilakukan laravel.comsitus web: menyimpannya helpers.php di direktori bootstrap . Ingatlah untuk mengaturnya di composer.jsonfile Anda :

"files": [
    "bootstrap/helpers.php"
]
Joseph Silber
sumber
86
Kiat untuk noobs: gunakan perintah ini setelah mengubah composer.json. composer dump-autoload
Allfarid Morales García
11
@ AllfaridMoralesGarcía Atau mungkin hanya 'Tip yang berguna, karena jawabannya tidak menjelaskan Anda perlu melakukan ini sesudahnya'.
Matt McDonald
8
Saya menyetujui fungsi pembantu untuk membuat tampilan tulisan lebih mudah tetapi saya benci seberapa banyak jawaban ini dirujuk dalam jawaban lain. Jangan salah paham, ini jawaban yang bagus dan benar, saya hanya khawatir orang akan menyalahgunakannya dan mulai menulis berton-ton PHP fungsional yang buruk, tidak terorganisir dengan baik.
andrewtweber
40
Saya tidak mengerti pendekatan ini. Komposer seharusnya menjadi alat untuk memasukkan perpustakaan: Laravel akan bekerja dengan baik tanpa itu, dan Komposer tanpa Laravel. Saran ini memberitahu kita untuk membuat file di dalam aplikasi kita, meninggalkan aplikasi kita, pergi ke Komposer, beri tahu komposer untuk kembali ke aplikasi kita dan memasukkan file. Laravel jelas menangani penyertaan file, kan? Mengapa kita melupakan implementasi asli Laravel dan menggunakan alat eksternal ini untuk memasukkan file untuk kita, sehingga lebih banyak menyambungkan aplikasi kita ke Composer? Apakah itu kemalasan, atau aku melewatkan sesuatu?
dKen
6
Laravel menggunakan autoloader komposer untuk mengetahui di mana memasukkan semua pustaka dan file yang diandalkannya. Ini dirujuk dalam bootstrap / autoload.php. Baca komentar di file itu. Pendekatannya adalah menambahkan referensi ke file ke dalam composer.json, lalu "dump autoload," yang meregenerasi autoloader komposer sehingga Laravel dapat menemukannya. Menggunakan koleksi "file" Komposer adalah cara yang baik untuk menambahkan perpustakaan atau file fungsi satu kali yang tidak terbungkus rapi dalam paket komposer. Sangat menyenangkan memiliki tempat untuk semua situasi "omong-omong saya harus memasukkan file yang satu ini".
Phillip Harrington
370

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:

<?php // Code within app\Helpers\Helper.php

namespace App\Helpers;

class Helper
{
    public static function shout(string $string)
    {
        return strtoupper($string);
    }
}

Langkah 2: Buat alias:

<?php // Code within config/app.php

    'aliases' => [
     ...
        'Helper' => App\Helpers\Helper::class,
     ...

Langkah 3: Jalankan composer dump-autoloaddi root proyek

Langkah 4: Gunakan di templat Blade Anda:

<!-- Code within resources/views/template.blade.php -->

{!! Helper::shout('this is how to use autoloading correctly!!') !!}

Kredit Ekstra: Gunakan kelas ini di mana saja di aplikasi Laravel Anda:

<?php // Code within app/Http/Controllers/SomeController.php

namespace App\Http\Controllers;

use Helper;

class SomeController extends Controller
{

    public function __construct()
    {
        Helper::shout('now i\'m using my helper class in a controller!!');
    }
    ...

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

heisian
sumber
35
Untuk lebih jelasnya, jawaban ini tidak benar-benar berurusan dengan helper, yang merupakan fungsi global-namespace. Alih-alih, ini mendorong mengkonversi pembantu ke metode kelas. Ini umumnya merupakan pendekatan terbaik, tetapi tidak benar-benar menjawab pertanyaan yang diajukan di sini, itulah sebabnya jawaban lain sangat rumit jika dibandingkan.
Dan Hunsaker
1
Function helper berarti tersedia di Blade juga. Bagaimana Anda membuat fungsi ini tersedia di blade? Anda tidak dapat memanggil Helper :: prettyJason (parameter) di blade.
MaXi32
@ MaXi32 Anda bisa menambahkan kelas di bawah aliasesarray di app/config.php: 'Helper' => App\Helpers\Helper::class, Maka Anda akan bisa memanggil Helper::prettyJson();blade dengan baik.
heisian
@DanHunsaker diedit untuk langsung menjawab pertanyaan, dan itu masih pendekatan sederhana yang sama. Anda juga dapat menulis arahan blade khusus sendiri: stackoverflow.com/questions/28290332/…
heisian
1
Ya, saya menggali kerangka sekali dan menemukan di mana mereka menarik pembantu. Dan lagi, saya sepenuhnya setuju bahwa metode kelas statis namespaced lebih cocok daripada apa yang diminta - atau direkomendasikan - sebagian besar waktu. Faktanya adalah, para pembantu sebenarnya bukanlah The Laravel Way, tetapi peninggalan dari CodeIgniter 2.x yang masih belum dihapus. Jadi keangkuhan saya tentang pendekatan ini tidak menjawab OP persis seperti yang diminta lebih merupakan upaya untuk menyoroti fakta bahwa Anda tidak mendapatkan pembantu, tetapi sesuatu yang lebih baik.
Dan Hunsaker
315

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 appdirektori saya bernama Helpers. Kemudian di dalam Helpersfolder 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.phpdengan menjalankan perintah artisan:

artisan make:provider HelperServiceProvider

Di dalam registermetode saya menambahkan potongan ini

public function register()
{
    foreach (glob(app_path().'/Helpers/*.php') as $filename){
        require_once($filename);
    }
}

terakhir daftarkan penyedia layanan di config/app.phpdalam array penyedia Anda

'providers' => [
    'App\Providers\HelperServiceProvider',
]

sekarang semua file di Helpersdirektori 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!

composer require browner12/helpers

Github: browner12 / helper

Andrew Brown
sumber
29
untuk orang-orang yang hanya memiliki beberapa fungsi yang perlu mereka tambahkan, autoload komposer baik-baik saja, tetapi bagi kita yang mungkin memiliki banyak fungsi pembantu, banyak organisasi file adalah suatu keharusan. solusi ini pada dasarnya adalah apa yang saya lakukan di L4 kecuali saya mendaftarkan file dalam file saya start.php(yang tidak bagus, tetapi melayani tujuannya untuk saat itu). apakah Anda punya saran lain untuk memuat banyak file?
Andrew Brown
7
Jika Anda memiliki banyak file, tambahkan semuanya ke file composer.json Anda. Menambahkan bahkan 5-10 baris di sana membuat cara lebih masuk akal daripada apa yang Anda miliki di sini.
Joseph Silber
22
Saya pikir teknik ini memiliki banyak kelebihan. Ini elegan dan efisien karena Anda tidak harus ingat untuk mengacaukan file composer.json setiap kali Anda membuat file pembantu.
Berlaku
8
Solusi yang sangat bagus. Satu-satunya hal yang saya tidak setuju adalah cara Anda menambahkan file, saya pikir seharusnya menjadi mapper, di mana kita menambahkan nama file yang ingin kita muat. Pikirkan kesalahan! jika hanya ada satu pembantu di salah satu file yang gagal, maka Anda harus menghapus semuanya, atau minta situsnya rusak sampai Anda menyelesaikannya.
Pablo Ezequiel Leone
3
Apakah Anda menggunakan namespace App \ Providers? Bagaimana saya memanggil pembantu itu dari controller dan view. Maaf, pertanyaan noob.
Cengkaruk
79

Inilah yang disarankan JeffreyWaydalam Diskusi Laracasts ini .

  1. Dalam app/Httpdirektori Anda , buat helpers.phpfile dan tambahkan fungsi Anda.
  2. Di dalam composer.json, di autoloadblok, tambahkan "files": ["app/Http/helpers.php"].
  3. Lari composer dump-autoload.
itsazzad
sumber
15
Pembantu mungkin tidak hanya HTTP. app/helpers.phpatau app/Helpers/tampaknya menjadi tempat yang lebih baik.
sepehr
1
Bagaimana jika kita berada di server bersama dan tidak memiliki opsi untuk digunakan composer dump-autoload ?
user3201500
@ user3201500 itu adalah pertanyaan lain dan Anda mungkin perlu melakukannya secara manual jika Anda ingin mengikuti jawaban di atas. Atau Anda dapat memilih dari jawaban lain. Dan untuk mencerminkan secara manual, composer dump-autoloadAnda dapat mengikuti ini: dikembangkan.be/2014/08/29/composer-dump-autoload-laravel
itsazzad
55

Setelah 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-4yang 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:

namespace App\Helpers;

class BobFinder
{
    static function bob()
    {
        return '<strong>Bob?! Is that you?!</strong>';
    }
}

Selanjutnya, alias kelas Anda di config\app.php, dalam aliaseslarik:

'aliases' => [
    // Other aliases
    'BobFinder' => App\Helpers\BobFinder::class
]

Dan hanya itu yang harus Anda lakukan. PSR-4dan alias harus memaparkan helper ke view Anda, jadi dalam view Anda, jika Anda mengetik:

{!! BobFinder::bob() !!}

Seharusnya output:

<strong>Bob?! Is that you?!</strong>
dken
sumber
terima kasih sudah memposting ini. seperti yang ditunjukkan oleh Dan Dan Hunsaker dalam solusi saya, kami masih belum berakhir dengan fungsi global-namespace, yaitu dapat menulis secara sederhana {!! bob() !!}. akan melakukan pencarian lagi dan melihat apakah itu mungkin
heisian
1
Saya telah memikirkannya lebih lanjut dan berusaha untuk bob()benar - benar mendunia tidak akan menjadi hal yang bijaksana untuk dilakukan. Namespaces ada karena suatu alasan dan kita tidak boleh memanggil bob()bersama fungsi PHP dasar. Saya akan menambahkan bit aliasing Anda ke kode saya - terima kasih!
heisian
1
Saya menemukan ini sebagai yang terbaik dari semuanya
Jimmy Obonyo Abor
Kenapa disana extends Helper? Sepertinya tidak perlu bagi saya.
bernie
@bernie @ user3201500 Maaf tim, saya memiliki kelas pembantu dasar sendiri yang mewarisi semua pembantu saya; yang extends Helpermemang tidak diperlukan. Terimakasih atas peringatannya.
dKen
32

Arahan Blade Kustom di Laravel 5

Ya, ada cara lain untuk melakukan ini!

Langkah 1: Daftarkan arahan Blade khusus:

<?php // code in app/Providers/AppServiceProvider.php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

use Blade; // <-- This is important! Without it you'll get an exception.

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
     public function boot()
     {
         // Make a custom blade directive:
         Blade::directive('shout', function ($string) {
             return trim(strtoupper($string), '(\'\')');
         });

         // And another one for good measure:
         Blade::directive('customLink', function () {
             return '<a href="#">Custom Link</a>';
         });
     }
    ...

Langkah 2: Gunakan arahan Blade khusus Anda:

<!-- // code in resources/views/view.blade.php -->

@shout('this is my custom blade directive!!')
<br />
@customLink

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

heisian
sumber
Ini harus ditandai sebagai jawaban terbaik, karena pertanyaannya adalah "untuk menghindari kode berulang antara beberapa tampilan". Kata kunci adalah VIEWS. :)
Aleksandrs
23

Ini adalah file HelpersProvider.php saya:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class HelperServiceProvider extends ServiceProvider
{
    protected $helpers = [
        // Add your helpers in here
    ];

    /**
     * Bootstrap the application services.
     */
    public function boot()
    {
        //
    }

    /**
     * Register the application services.
     */
    public function register()
    {
        foreach ($this->helpers as $helper) {
            $helper_path = app_path().'/Helpers/'.$helper.'.php';

            if (\File::isFile($helper_path)) {
                require_once $helper_path;
            }
        }
    }
}

Anda harus membuat folder bernama di Helpersbawah appfolder, lalu membuat file bernama whatever.phpinside dan menambahkan string whateverdi 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:

...
"autoload": {
    "files": [
        "app/helpers/my_helper.php",
        ...
    ]
},
...
Pablo Ezequiel Leone
sumber
Apakah ada alasan lain selain kinerja untuk membuat mapper alih-alih memuat semua file dalam direktori dengan glob()seperti yang ditulis Andrew Brown? Jika Anda ingin dapat menentukan file yang ingin Anda sertakan, mengapa tidak menentukan file dalam composer.jsonuntuk 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.
Berlmer
3
Lebih mudah, dengan pendekatan yang dipetakan, untuk mengaktifkan / menonaktifkan bantuan secara selektif jika, misalnya, salah satu file pembantu berisi kesalahan pemecahan. Yang mengatakan, memetakan file dalam penyedia layanan tidak jauh berbeda dengan melakukannya composer.jsonkecuali untuk dua poin - pertama, itu membuat peta di dalam aplikasi itu sendiri, bukan file metadata; kedua, itu tidak mengharuskan Anda untuk menjalankan kembali composer dump-autoloadsetiap kali Anda mengubah daftar file untuk memuat.
Dan Hunsaker
Tidak perlu includeatau require, Laravel sudah memiliki autoloading PSR-4 bawaan
heisian
1
menggunakan PSR-4 dan komposer tidak akan memungkinkan Anda untuk mengaktifkan / menonaktifkan pembantu.
Pablo Ezequiel Leone
@PabloEzequielLeone dan bagaimana saya menggunakannya di dalam pengontrol atau file blade? Ini terlihat sebagai pilihan terbaik jika Anda khawatir tidak memuat semua pembantu untuk semua pengendali setiap saat, tetapi tidak baik untuk pemula di Laravel (seperti saya).
VinGarcia
12

Untuk Perpustakaan Pembantu Kustom dalam proyek Laravel saya, saya telah membuat folder dengan nama Librariesdi Laravel/AppDirektori 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

...
"autoload": {
        "classmap": [
            "database"
        ],
        "files": [
            "app/Libraries/commonFunctions.php"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },
...

dan jalankan

composer dump-autoload
Akshay Khale
sumber
composer dump-autoloaddan composer dumpautoloadjuga berfungsi sebenarnya juga composer duakan bekerja ...
Akshay Khale
10

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\Strdan Illuminate\Support\Arrkelas. 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 HelperServiceProviderkelas yang membuat fungsi-fungsi itu dalam waktu eksekusi:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class HelperServiceProvider extends ServiceProvider
{
    /**
     * The helper mappings for the application.
     *
     * @var array
     */
    protected $helpers = [
        'uppercase' => 'App\Support\Helpers\StringHelper::uppercase',
        'lowercase' => 'App\Support\Helpers\StringHelper::lowercase',
    ];

    /**
     * Bootstrap the application helpers.
     *
     * @return void
     */
    public function boot()
    {
        foreach ($this->helpers as $alias => $method) {
            if (!function_exists($alias)) {
                eval("function {$alias}(...\$args) { return {$method}(...\$args); }");
            }
        }
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

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.

Paulo Freitas
sumber
8

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:

make_facade.sh -f <facade_name> -n '<namespace_prefix>'

Contoh:

make_facade.sh -f helper -n 'App\MyApp'

Jika Anda menjalankan contoh itu, itu akan membuat direktori Facadesdan di Providersbawah 'your_laravel_installation_dir / app / MyApp'.

Ini akan membuat 3 file berikut dan juga akan menampilkannya ke layar:

./app/MyApp/Facades/Helper.php
./app/MyApp/Facades/HelperFacade.php
./app/MyApp/Providers/HelperServiceProvider.php

Setelah selesai, itu akan menampilkan pesan yang mirip dengan yang berikut:

===========================
    Finished
===========================

Add these lines to config/app.php:
----------------------------------
Providers: App\MyApp\Providers\HelperServiceProvider,
Alias: 'Helper' => 'App\MyApp\Facades\HelperFacade',

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:

<?php

namespace App\MyApp\Facades;


class Helper
{
    //
}

Sekarang cukup tambahkan metode Anda di "./app/MyApp/Facades/Helper.php".

Inilah tampilan "./app/MyApp/Facades/Helper.php" setelah saya menambahkan fungsi Helper.

<?php

namespace App\MyApp\Facades;

use Request;

class Helper
{
    public function isActive($pattern = null, $include_class = false)
    {
        return ((Request::is($pattern)) ? (($include_class) ? 'class="active"' : 'active' ) : '');
    }
}

This is how it would be called:
===============================

{!!  Helper::isActive('help', true) !!}

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.

#!/bin/bash

display_syntax(){
    echo ""
    echo "  The Syntax is like this:"
    echo "  ========================"
    echo "      "$(basename $0)" -f <facade_name> -n '<namespace_prefix>'"
    echo ""
    echo "  Example:"
    echo "  ========"
    echo "      "$(basename $0) -f test -n "'App\MyAppDirectory'"
    echo ""
}


if [ $# -ne 4 ]
then
    echo ""
    display_syntax
    exit
else
# Use > 0 to consume one or more arguments per pass in the loop (e.g.
# some arguments don't have a corresponding value to go with it such
# as in the --default example).
    while [[ $# > 0 ]]
    do
        key="$1"
            case $key in
            -n|--namespace_prefix)
            namespace_prefix_in="$2"
            echo ""
            shift # past argument
            ;;
            -f|--facade)
            facade_name_in="$2"
            shift # past argument
            ;;
            *)
                    # unknown option
            ;;
        esac
        shift # past argument or value
    done
fi
echo Facade Name = ${facade_name_in}
echo Namespace Prefix = $(echo ${namespace_prefix_in} | sed -e 's#\\#\\\\#')
echo ""
}


function display_start_banner(){

    echo '**********************************************************'
    echo '*          STARTING LARAVEL MAKE FACADE SCRIPT'
    echo '**********************************************************'
}

#  Init the Vars that I can in the beginning
function init_and_export_vars(){
    echo
    echo "INIT and EXPORT VARS"
    echo "===================="
    #   Substitution Tokens:
    #
    #   Tokens:
    #   {namespace_prefix}
    #   {namespace_prefix_lowerfirstchar}
    #   {facade_name_upcase}
    #   {facade_name_lowercase}
    #


    namespace_prefix=$(echo ${namespace_prefix_in} | sed -e 's#\\#\\\\#')
    namespace_prefix_lowerfirstchar=$(echo ${namespace_prefix_in} | sed -e 's#\\#/#g' -e 's/^\(.\)/\l\1/g')
    facade_name_upcase=$(echo ${facade_name_in} | sed -e 's/\b\(.\)/\u\1/')
    facade_name_lowercase=$(echo ${facade_name_in} | awk '{print tolower($0)}')


#   Filename: {facade_name_upcase}.php  -  SOURCE TEMPLATE
source_template='<?php

namespace {namespace_prefix}\Facades;

class {facade_name_upcase}
{
    //
}
'


#  Filename: {facade_name_upcase}ServiceProvider.php    -   SERVICE PROVIDER TEMPLATE
serviceProvider_template='<?php

namespace {namespace_prefix}\Providers;

use Illuminate\Support\ServiceProvider;
use App;


class {facade_name_upcase}ServiceProvider extends ServiceProvider {

    public function boot()
    {
        //
    }

    public function register()
    {
        App::bind("{facade_name_lowercase}", function()
        {
            return new \{namespace_prefix}\Facades\{facade_name_upcase};
        });
    }

}
'

#  {facade_name_upcase}Facade.php   -   FACADE TEMPLATE
facade_template='<?php

namespace {namespace_prefix}\Facades;

use Illuminate\Support\Facades\Facade;

class {facade_name_upcase}Facade extends Facade {

    protected static function getFacadeAccessor() { return "{facade_name_lowercase}"; }
}
'
}


function checkDirectoryExists(){
    if [ ! -d ${namespace_prefix_lowerfirstchar} ]
    then
        echo ""
        echo "Can't find the namespace: "${namespace_prefix_in}
        echo ""
        echo "*** NOTE:"
        echo "           Make sure the namspace directory exists and"
        echo "           you use quotes around the namespace_prefix."
        echo ""
        display_syntax
        exit
    fi
}

function makeDirectories(){
    echo "Make Directories"
    echo "================"
    mkdir -p ${namespace_prefix_lowerfirstchar}/Facades
    mkdir -p ${namespace_prefix_lowerfirstchar}/Providers
    mkdir -p ${namespace_prefix_lowerfirstchar}/Facades
}

function createSourceTemplate(){
    source_template=$(echo "${source_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
    echo "Create Source Template:"
    echo "======================="
    echo "${source_template}"
    echo ""
    echo "${source_template}" > ./${namespace_prefix_lowerfirstchar}/Facades/${facade_name_upcase}.php
}

function createServiceProviderTemplate(){
    serviceProvider_template=$(echo "${serviceProvider_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
    echo "Create ServiceProvider Template:"
    echo "================================"
    echo "${serviceProvider_template}"
    echo ""
    echo "${serviceProvider_template}" > ./${namespace_prefix_lowerfirstchar}/Providers/${facade_name_upcase}ServiceProvider.php
}

function createFacadeTemplate(){
    facade_template=$(echo "${facade_template}" | sed -e 's/{namespace_prefix}/'${namespace_prefix}'/g' -e 's/{facade_name_upcase}/'${facade_name_upcase}'/g' -e 's/{facade_name_lowercase}/'${facade_name_lowercase}'/g')
    echo "Create Facade Template:"
    echo "======================="
    echo "${facade_template}"
    echo ""
    echo "${facade_template}" > ./${namespace_prefix_lowerfirstchar}/Facades/${facade_name_upcase}Facade.php
}


function serviceProviderPrompt(){
    echo "Providers: ${namespace_prefix_in}\Providers\\${facade_name_upcase}ServiceProvider,"
}

function aliasPrompt(){
    echo "Alias: '"${facade_name_upcase}"' => '"${namespace_prefix_in}"\Facades\\${facade_name_upcase}Facade'," 
}

#
#   END FUNCTION DECLARATIONS
#


###########################
## START RUNNING SCRIPT  ##
###########################

display_start_banner

init_and_export_vars
makeDirectories 
checkDirectoryExists
echo ""

createSourceTemplate
createServiceProviderTemplate
createFacadeTemplate
echo ""
echo "==========================="
echo "  Finished TEST"
echo "==========================="
echo ""
echo "Add these lines to config/app.php:"
echo "----------------------------------"
serviceProviderPrompt
aliasPrompt
echo ""
Berlari
sumber
8

alih-alih menyertakan kelas pembantu kustom Anda, Anda sebenarnya dapat menambahkan ke config/app.phpfile Anda di bawah alias.

Seharusnya terlihat seperti ini.

 'aliases' => [ 
    ...
    ...
    'Helper' => App\Http\Services\Helper::class,
 ]

dan kemudian ke Controller Anda, sertakan Helper menggunakan metode 'use Helper' sehingga Anda dapat memanggil beberapa metode di kelas Helper Anda.

eg. Helper::some_function();

atau dalam tampilan sumber daya Anda dapat langsung menghubungi kelas Helper.

eg. {{Helper::foo()}}

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.

Kenneth Sunday
sumber
4

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

<?php

namespace App\Helpers;

class MyFuncs {

    public static function full_name($first_name,$last_name) {
        return $first_name . ', '. $last_name;   
    }
}

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

Open /app/Providers/HelperServiceProvider.php

Tambahkan kode berikut:

<?php 

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class HelperServiceProvider extends ServiceProvider {

   /**
    * Bootstrap the application services.
    *
    * @return void
    */
   public function boot()
   {
      //
   }

   /**
    * Register the application services.
    *
    * @return void
    */
   public function register()
   {
        foreach (glob(app_path().'/Helpers/*.php') as $filename){
            require_once($filename);
        }
   }
}

SINI,

namespace App\Providers; defines the namespace provider
use Illuminate\Support\ServiceProvider; imports the ServiceProvider class namespace
class HelperServiceProvider extends ServiceProvider {…} defines a class HelperServiceProvider that extends the ServiceProvider class
public function boot(){…} bootstraps the application service
public function register(){…} is the function that loads the helpers
foreach (glob(app_path().'/Helpers/*.php') as $filename){…} loops through all the files in /app/Helpers directory and loads them.

Kita sekarang perlu mendaftarkan HelperServiceProvider dan membuat alias untuk pembantu kami.

Buka /config/app.phpfile

Temukan variabel array penyedia

Tambahkan baris berikut

App\Providers\HelperServiceProvider::class,

Temukan variabel array alias

Tambahkan baris berikut

'MyFuncs' => App\Helpers\MyFuncs::class,

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

Route::get('/func', function () {
    return MyFuncs::full_name("John","Doe");
});

SINI,

return MyFuncs::full_name("John","Doe"); calls the static function full_name in MyFuncs class
Mizanur Rahman
sumber
4

Pertama-tama buat helpers.php di dalam direktori App \ Http. Kemudian tambahkan kode berikut di dalam composer.json

"autoload": {
        "classmap": [
            "database"
        ],
        "files": [
            "app/Http/helpers.php"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },

Selanjutnya jalankan perintah berikut

composer dump-autoload

Sekarang Anda dapat mendefinisikan fungsi kustom Anda di dalam file helpers.php.

ujjal
sumber
3

Cara lain yang saya gunakan adalah: 1) membuat file di app \ FolderName \ fileName.php dan memiliki kode ini di dalamnya yaitu

<?php
namespace App\library
{
 class hrapplication{
  public static function libData(){
   return "Data";
  }
 }
}
?>

2) Setelah itu di bilah kami

 $FmyFunctions = new \App\FolderName\classsName;
  echo $is_ok = ($FmyFunctions->libData());

itu dia. dan itu berhasil

Dee
sumber
3

Praktik terbaik untuk menulis pembantu kustom adalah

1) Di dalam appdirektori 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 autoloadkunci, buat kunci baru bernama filesuntuk memuat file pada saat memuat otomatis, di dalam filesobjek tambahkan path mulai dari direktori aplikasi., Di sini adalah contoh.

"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": [
        "app/Helpers/customHelpers.php"
    ]
},
"autoload-dev": {
    "classmap": [
        "tests/TestCase.php"
    ]
},

PS: coba jalankan composer dump-autoloadjika file tidak dimuat.

Reiah Paul Sam
sumber
3

Buat Helpers.php di app / Helper / Helpers.php

namespace App\Helper
class Helpers
{


}

Tambahkan komposer dan pembaruan komposer

 "autoload": {
        "classmap": [
            "database/seeds",
            "database/factories",
            "database","app/Helper/Helpers.php"
        ],
        "psr-4": {
            "App\\": "app/"
        },
         "files": ["app/Helper/Helpers.php"]
    },

gunakan di Controller

gunakan App \ Helper \ Helpers

gunakan dalam tampilan perubahan dalam file config-> app.php

   'aliases' => [
    ...
    'Helpers'   => 'App\Helper\Helpers'
    ],

lihat panggilan

<?php echo Helpers::function_name();  ?>
abhishek kumar
sumber
Terima kasih, maukah Anda sedikit memperluas penjelasan Anda?
Felipe Valdes
2
Jika kelas namespace, menambahkan file composer.jsontidak berguna, karena psr-4 autoload akan melakukan pekerjaan.
Arcesilas
2

dalam dir bootstrap \ autoload.php

require __DIR__.'/../vendor/autoload.php';
require __DIR__.'/../app/Helpers/function.php'; //add

tambahkan file ini

app\Helpers\function.php
panqingqiang
sumber
2

**

  • Pembantu Status

** buat pembantu baru

<?php

namespace App\Helpers;

use Illuminate\Database\Eloquent\Collection;

class StatusHelper
{
 protected static $_status = [
        1=> [
            'value' => 1,
            'displayName' => 'Active',
        ],
        2 => [
            'value' => 2,
            'displayName' => 'Inactive',
        ],
        3 => [
            'value' => 3,
            'displayName' => 'Delete',
        ],

    ];

     public static function getStatusesList()
    {
        $status = (new Collection(self::$_status))->pluck('displayName', 'value')->toArray();


        return $status;
    }
}

Gunakan untuk pengontrol dan file tampilan apa pun

use App\Helpers\StatusHelper;

class ExampleController extends Controller
{
        public function index()
        {
            $statusList = StatusHelper::getStatusesList();

            return view('example.index', compact('statusList'));
        }
}
Sunil
sumber
0

Di laravel 5.3 dan di atas, tim laravel memindahkan semua file prosedural ( routes.php) keluar dari app/direktori, dan seluruh app/folder psr-4dimuat 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 dalam composer.jsonfile saya, saya melakukan ini:

...
"autoload": {
    "classmap": [
        "database"
    ],
    "psr-4": {
        "App\\": "app/"
    },
    "files": [
        "helpers/ui_helpers.php"
    ]
},
...

Dengan cara ini app/direktori saya masih satu psr-4 autoloaded, dan pembantu sedikit lebih terorganisir.

Semoga ini bisa membantu seseorang.

Mubashar Abbas
sumber
0

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

class Helper() {
    public function uppercasePara($str) {
        return '<p>' .strtoupper($str). '<p>;
    }
}

Maka Anda bisa menyebutnya di templat Blade Anda seperti ini:

@inject('helper', \App\Libraries\Helper)
{{ $helper->drawTimeSelector() }}

Jika Anda tidak ingin menggunakan @inject maka buat saja fungsi 'uppercasePara' sebagai statis dan embed panggilan dalam templat Blade Anda seperti ini:

{{ \App\Libraries\Helper::drawTimeSelector() }}

Tidak perlu alias. Laravel menyelesaikan kelas beton secara otomatis.

omarjebari
sumber