Laravel 5'de Özel Yardımcılara Yönelik En İyi Uygulamalar [kapalı]


472

Laravel 5'te görünümler arasında kodun tekrarlanmasını önlemek için yardımcı fonksiyonlar oluşturmak istiyorum:

view.blade.php

<p>Foo Formated text: {{ fooFormatText($text) }}</p>

Temelde metin biçimlendirme işlevleridir. Bu işlevlerle nerede ve nasıl dosya oluşturabilirim?

Yanıtlar:


595

helpers.phpUygulama klasörünüzde bir dosya oluşturun ve besteciyle yükleyin:

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

Bunu composer.jsondosyanıza ekledikten sonra aşağıdaki komutu çalıştırın:

composer dump-autoload

helpers.phpDosyanızı appdizininizde tutmaktan hoşlanmıyorsanız (PSR-4 ad boşluklu bir sınıf dosyası olmadığından), laravel.comweb sitesinin yaptığı şeyi yapabilirsiniz : helpers.php bootstrap dizininde saklayın . composer.jsonDosyanızda ayarlamayı unutmayın :

"files": [
    "bootstrap/helpers.php"
]

85
Noobs için ipucu: composer.json dosyasını değiştirdikten sonra bu komutu kullanın. besteci çöplük-autoload
Allfarid Morales García

11
@ AllfaridMoralesGarcía Veya belki de sadece 'Yararlı bir ipucu, çünkü cevap daha sonra bunu yapmanız gerektiğini netleştirmez'.
Matt McDonald

8
Yazma görüntülemelerini kolaylaştırmak için yardımcı işlevlerin onaylanması, ancak diğer yanıtlarda bu cevaba ne kadar gönderme yapıldığından nefret ediyorum. Beni yanlış anlamayın, bu iyi bir cevap ve doğrudur, sadece insanların kötüye kullanacağından ve tonlarca kötü yazılmış, zayıf organize edilmiş fonksiyonel PHP yazmaya başlayacağından korkuyorum.
andrewtweber

39
Bu yaklaşımı anlamıyorum. Composer'ın kütüphaneleri içerecek bir araç olması gerekiyordu: Laravel onsuz mükemmel çalışır ve Laravel'siz Composer. Bu öneri bize uygulamamızda bir dosya oluşturmamızı, uygulamamızı terk etmemizi, Besteciye gitmemizi, bestecimize uygulamamıza geri dönmemizi ve bir dosya eklememizi söylüyor. Laravel, dosyaların dahil edilmesini açıkça ele alıyor, değil mi? Neden Laravel'in yerel uygulamasından vazgeçelim ve bizim için bir dosya eklemek için bu harici aracı kullanalım, böylece başvurumuzu Composer'a daha fazla bağlayalım? Tembellik mi yoksa bir şey mi kaçırıyorum?
dKen

6
Laravel, oluşturduğu tüm kitaplıkların ve dosyaların nereye dahil edileceğini bilmek için bestecinin otomatik yükleyicisini kullanır. Bu, bootstrap / autoload.php dosyasında belirtilmiştir. Bu dosyadaki yorumu okuyun. Yaklaşım, dosyaya yapılan başvuruyu composer.json dosyasına eklemek, ardından Laravel'in bulabilmesi için bestecinin otomatik yükleyicisini yeniden oluşturan "otomatik doldurma dökümü" nü yapmaktır. Composer'ın "files" koleksiyonunu kullanmak, besteci paketlerine düzgün bir şekilde sarılmamış kütüphaneler veya bir kerelik işlev dosyaları eklemenin iyi bir yoludur. Tüm "Bu arada bu garip bir dosyayı dahil etmek zorunda" durumlar için bir yer olması güzel.
Phillip Harrington

370

Laravel 5'teki Özel Sınıflar, Kolay Yol

Bu cevap Laravel içindeki genel özel sınıflar için geçerlidir. Blade'e özgü daha fazla yanıt için bkz . Laravel 5'te Özel Blade Yönergeleri .

Adım 1: Helpers (veya başka bir özel sınıf) dosyanızı oluşturun ve ona uygun bir ad alanı verin. Sınıfınızı ve yönteminizi yazın:

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

namespace App\Helpers;

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

2. Adım: Bir takma ad oluşturun:

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

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

Adım 3:composer dump-autoload Proje kök dizininde çalıştırın

4. Adım: Blade şablonunuzda kullanın:

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

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

Ekstra Kredi: Bu sınıfı Laravel uygulamanızın herhangi bir yerinde kullanın:

<?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!!');
    }
    ...

Kaynak: http://www.php-fig.org/psr/psr-4/

Neden çalışıyor: https://github.com/laravel/framework/blob/master/src/Illuminate/Support/ClassLoader.php

Otomatik yükleme nereden kaynaklanır: http://php.net/manual/en/language.oop5.autoload.php


35
Açıkçası, bu cevap aslında küresel isimlendirilmiş fonksiyonlar olan yardımcılarla ilgilenmez. Bunun yerine yardımcıları sınıf yöntemlerine dönüştürmeyi teşvik eder. Bu genellikle en iyi yaklaşımdır, ancak burada sorulan soruya aslında cevap vermez, bu yüzden diğer cevaplar karşılaştırma ile bu kadar karmaşıktır.
Dan Hunsaker

1
Fonksiyon yardımcısı Blade'de de mevcut olduğu anlamına gelir.Bu blade'de nasıl kullanılabilir hale getirirsiniz? Blade'de Helper :: prettyJason (parametreler) öğesini çağıramazsınız.
MaXi32

@ MaXi32 aliasesiçinde dizinin altına sınıfı ekleyebilirsiniz app/config.php: 'Helper' => App\Helpers\Helper::class, O zaman Helper::prettyJson();blade iyi aramak mümkün olacaktır .
heisian

@ DanHunsaker doğrudan soruyu cevaplamak için düzenledi ve hala aynı basit yaklaşım. Ayrıca kendi özel blade yönergelerinizi de yazabilirsiniz: stackoverflow.com/questions/28290332/…
heisian

1
Evet, çerçeveyi bir kez kazdım ve yardımcıları nereye çektiklerini buldum. Ve yine, tamamen adlandırılmış statik sınıfların yöntemlerinin çoğu zaman talep edilenden veya önerilmekten çok daha temiz olduğunu kabul ediyorum. Gerçek şu ki, yardımcılar ilk etapta gerçekten Laravel Yolu değil, daha çok aşamalı olarak kaldırılmamış olan CodeIgniter 2.x'ten bir engel. Bu yüzden OP'ye tam olarak sorulduğu gibi cevap vermeme konusundaki bilgeliğim, daha fazla yardımcı almamanızı değil, daha iyi bir şey olduğunu vurgulama girişimidir.
Dan Hunsaker

315

ilk düşüncem besteci autoload da oldu, ama bana Laravel 5ish hissetmedim. L5, Servis Sağlayıcıları yoğun şekilde kullanır, bunlar uygulamanızın önyüklemelerini yapar.

Başlamak için benim bir klasör oluşturdu appdenilen dizine Helpers. Sonra Helpersklasör içine eklemek istediğim işlevler için dosyalar ekledim. Birden fazla dosya içeren bir klasöre sahip olmak, çok uzun ve yönetilemeyen büyük bir dosyadan kaçınmamızı sağlar.

Sonra HelperServiceProvider.phpartisan komutunu çalıştırarak bir oluşturdum :

artisan make:provider HelperServiceProvider

registerYöntem dahilinde bu pasajı ekledim

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

son olarak servis sağlayıcıyı config/app.phpsağlayıcılar dizisine kaydedin

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

Helpersdizininizdeki herhangi bir dosya yüklenir ve kullanıma hazırdır.

GÜNCELLEME 2016-02-22

Burada birçok iyi seçenek var, ancak cevabım sizin için işe yararsa, devam ettim ve yardımcıları bu şekilde dahil etmek için bir paket hazırladım. Paketi ilham almak için kullanabilir veya Composer ile de indirebilirsiniz. Sık kullandığım bazı yerleşik yardımcıları var (ancak hepsi varsayılan olarak etkin değil) ve basit bir Artisan jeneratörü ile kendi özel yardımcılarınızı yapmanıza izin veriyor. Ayrıca, bir yanıtlayıcının bir eşleyici kullanma konusundaki önerisini de ele alır ve tüm PHP dosyalarını otomatik olarak yardımcı dizininize yüklemek için özel yardımcıları tanımlamanızı sağlar. Geri bildirim ve Halkla İlişkiler çok takdir edilmektedir!

composer require browner12/helpers

Github: browner12 / yardımcıları


29
eklemeleri gereken birkaç işlevi olan kişiler için, besteci otomatik yüklemesi gayet iyi, ancak çok fazla yardımcı işlevi olanlarımız için birden fazla dosya organizasyonu şart. Bu çözüm esas olarak L4'te yaptığım şeydir start.php, ancak dosyalarımdaki dosyaları kaydettirdim (ki bu harika değildi, ancak zaman için amacına hizmet etti). birden fazla dosya yüklemek için başka bir öneriniz var mı?
Andrew Brown

7
Birden fazla dosyanız varsa, hepsini composer.json dosyanıza ekleyin. Hatta 5-10 satırları ekleme orada yapar yolu burada sahip olandan daha mantıklı.
Joseph Silber

22
Bence bu tekniğin bir çok değeri var. Zarif ve etkilidir çünkü bir yardımcı dosya oluşturduğunuzda composer.json dosyasıyla uğraşmayı hatırlamanız gerekmez.
impeto

8
Gerçekten iyi bir çözüm. Kabul etmediğim tek şey dosyaları ekleme şeklidir, bence bir haritacı olmalı, yüklemek istediğimiz dosyanın adını ekliyoruz. Hataları düşünün! başarısız olan dosyalardan birinde sadece bir yardımcı varsa, hepsini kaldırmanız veya çözene kadar sitenin bozulmasını sağlamalısınız.
Pablo Ezequiel Leone

3
App \ Providers ad alanını kullanıyor musunuz? O yardımcıyı kontrolör ve görünümden nasıl çağırırım. Üzgünüm, çaylak soru.
Cengkaruk

79

Bu önerdiği budur JeffreyWaybunda Laracasts Tartışma .

  1. Dizininizde app/Httpbir helpers.phpdosya oluşturun ve işlevlerinizi ekleyin.
  2. İçine composer.json, autoloadblokta ekleyin "files": ["app/Http/helpers.php"].
  3. Koş composer dump-autoload.

15
Yardımcılar yalnızca HTTP olmayabilir. app/helpers.phpya da app/Helpers/daha iyi bir yer gibi görünüyor.
Sepehr

1
Paylaşılan bir sunucudaysak ve kullanma seçeneğimiz yoksa ne olur composer dump-autoload ?
user3201500

@ user3201500 başka bir soru ve yukarıdaki cevabı takip etmek istiyorsanız manuel olarak yapmanız gerekebilir. Veya diğer cevaplar arasından seçim yapabilirsiniz. Ve elle yansıtmak için composer dump-autoloadbu takip edebilir: developed.be/2014/08/29/composer-dump-autoload-laravel
itsazzad

55

SO ve Google ile ilgili çeşitli cevapları gözden geçirdikten sonra, hala en uygun yaklaşımı bulamadım. Çoğu cevap biz uygulama bırakın ve iş yapmak için 3. taraf aracı Composer güveniyor, ama ben sadece bir dosya akıllıca dahil etmek için bir araç kaplin ikna değilim öneririz.

Andrew Brown'ın cevabı , yaklaşılması gerektiğini düşündüğüm en yakın noktaya geldi, ancak (en azından 5.1'de), servis sağlayıcı adımı gerekli değil. Heisian'ın cevabı , kullanımını PSR-4bize bir adım daha yaklaştırıyor. İşte yardımcılar için son uygulamam:

İlk olarak, uygulamalar dizininizde herhangi bir ad alanına sahip bir yardımcı dosya oluşturun:

namespace App\Helpers;

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

Ardından, sınıftaki diğer adı içinde config\app.php, içinde aliasesdiziden:

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

Ve tüm yapmanız gereken bu olmalı. PSR-4ve takma ad, yardımcıyı görünümlerinize göstermelidir; bu nedenle, şunu yazarsanız:

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

Çıktı vermelidir:

<strong>Bob?! Is that you?!</strong>

bunu gönderdiğiniz için teşekkürler. @ Dan-Hunsaker'in çözümümde belirttiği gibi, hala küresel olarak adlandırılmış bir işlevle sonuçlanmadık, yani basitçe yazabiliyoruz {!! bob() !!}. biraz daha arama yapacak ve bunun mümkün olup olmadığını göreceğiz
heisian

1
Ben daha çok düşündüm ve bob()gerçekten küresel yapmaya çalışmak akıllıca bir şey olmaz. Ad alanları bir nedenden dolayı var ve bob()temel PHP işlevlerinin yanında çağırmamalıyız . Takma adınızı koduma ekleyeceğim - teşekkürler!
heisian

1
Bunu en iyisi olarak buluyorum
Jimmy Obonyo Abor

Neden var extends Helper? Benim için gerekli görünmüyor.
bernie

@bernie @ user3201500 Üzgünüm takım, tüm yardımcılarımın miras aldığı kendi temel yardımcı sınıfım vardı; extends HelperGerçekten de gerekli değildir. Söylediğin için teşekkürler.
dKen

31

Özel Blade Yönergeleri in Laravel 5

Evet, bunu yapmanın başka bir yolu var !

1. Adım: Özel bir Blade yönergesi kaydedin:

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

2. Adım: Özel Blade direktifinizi kullanın:

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

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

Çıktılar:

Bu benim özel bıçak yönlendirici !!
Özel Bağlantı


Kaynak: https://laravel.com/docs/5.1/blade#extending-blade

İlave Okumalar: https://mattstauffer.co/blog/custom-conditionals-with-laravels-blade-directives


Her yerde kullanabileceğiniz özel sınıfları en iyi şekilde nasıl yapacağınızı öğrenmek istiyorsanız , Kolay Yol olan Laravel 5'teki Özel Sınıflar'a bakın.


Bu soru en iyi yanıt olarak işaretlenmelidir, çünkü soru "bazı görünümler arasında kodun tekrarlanmasını önlemek için" idi. Anahtar kelime VIEWS. :)
Aleksandrs

23

Bu benim HelpersProvider.php dosyam:

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

Klasörün Helpersaltında adlandırılan bir klasör oluşturmalı app, sonra whatever.phpiç adında bir dosya oluşturmalı ve dizeyi whatever$ helpers dizisinin içine eklemelisiniz .

Bitti!

Düzenle

Artık bu seçeneği kullanmıyorum, şu anda yardımcılar gibi statik dosyaları yüklemek için besteci kullanıyorum.

Yardımcıları doğrudan şu adresten ekleyebilirsiniz:

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

glob()Andrew Brown'un yazdığı gibi dizindeki tüm dosyaları yüklemek yerine bir eşleyici oluşturmak için performanstan başka nedenler var mı? Eklemek istediğiniz dosyaları belirleyebilmek istiyorsanız, neden composer.jsonJoseph Silber'in yazdığı gibi otomatik olarak yüklenecek dosyaları belirtmeyesiniz ? Neden bu çözümü tercih ediyorsunuz? Bunun kötü bir çözüm olduğunu söylemiyorum, sadece merak ediyorum.
Pelmered

3
Eşleştirilmiş bir yaklaşımla, örneğin yardımcı dosyalardan birinde bir kesme hatası varsa yardımcıları seçerek etkinleştirmek / devre dışı bırakmak daha kolaydır. Bununla birlikte, bir servis sağlayıcıdaki dosyaları eşlemek composer.jsoniki nokta dışında bunu yapmaktan çok farklı değildir - birincisi, haritayı bir meta veri dosyası yerine uygulamanın kendi içinde tutar; ikinci olarak, composer dump-autoloadyüklenecek dosya listesini her değiştirdiğinizde yeniden çalıştırmanızı gerektirmez .
Dan Hunsaker

Gerek yok includeya require, laravel zaten yerleşik PSR-4 autoloading: php-fig.org/psr/psr-4
heisian

1
PSR-4 ve besteci kullanmak yardımcıları açmanıza / kapatmanıza izin vermez.
Pablo Ezequiel Leone

@PabloEzequielLeone ve bir denetleyicinin veya blade dosyasının içinde nasıl kullanabilirim? Her zaman tüm kontrolörler için tüm yardımcıları yüklememekle ilgileniyorsanız, ancak Laravel'deki (kendim gibi) yeni başlayanlar için iyi değilse, bu en iyi seçenek olarak görünüyor.
VinGarcia

12

Benim laravel projesinde Custom Yardımcısı Kütüphaneleri için, ben isimde bir klasör oluşturduk Librariesbenim de Laravel/AppDirectory ve Kütüphaneler dizin içinde, farklı yardımcı kütüphaneler için çeşitli dosyaları oluşturduk.

Benim yardımcı dosyalarını oluşturduktan sonra ben sadece benim tüm bu dosyaları dahil composer.json böyle dosyası

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

ve yürüt

composer dump-autoload

composer dump-autoloadve composer dumpautoloadaynı zamanda infact composer dude işe yarayacak ...
Akshay Khale

10

OP en iyi uygulamaları istediğinden , burada hala bazı iyi tavsiyeleri kaçırdığımızı düşünüyorum.

Tek bir helpers.php dosyası iyi bir uygulama olmaktan çok uzaktır. Birincisi, birçok farklı fonksiyonu karıştırdığınız için iyi kodlama ilkelerine karşısınız. Üstelik bu olabilir kod belgelerine değil, aynı zamanda gibi kod ölçümleri sadece zarar Cyclomatic Karmaşıklık , İdame Index ve Halstead Cilt . Ne kadar çok fonksiyona sahip olursanız o kadar kötüleşir.

Kod belgelerine Ok gibi araçlar kullanılarak olurdu phpDocumentor fakat kullanarak Sami o usul dosyaları işlemek olmaz . Laravel API dokümantasyonu böyle bir durumdur - yardımcı fonksiyon dokümantasyonu yoktur: https://laravel.com/api/5.4

Kod metrikleri PhpMetrics gibi araçlarla analiz edilebilir . Laravel 5.4 çerçeve kodunu analiz etmek için PhpMetrics sürüm 1.x kullanıldığında, src / Illuminate / Foundation / helpers.php ve src / Illuminate / Support / helpers.php dosyaları için size çok kötü CC / MI / HV metrikleri verilir .

Birden fazla bağlamsal yardımcı dosya (ör. String_helpers.php , array_helpers.php , vb.) Bu kötü metrikleri kesinlikle iyileştirerek daha kolay bir kod elde edilmesini sağlar. Kullanılan kod dokümantasyon üreticisine bağlı olarak bu yeterli olacaktır.

Statik yöntemlerle yardımcı sınıflar kullanılarak daha da geliştirilebilir, böylece ad alanları kullanılarak bağlamsallaştırılabilirler. Tıpkı Laravel'in zaten nasıl Illuminate\Support\Strve Illuminate\Support\Arrsınıflarla yaptığı gibi . Bu, hem kod metriklerini / organizasyonunu hem de dokümantasyonunu geliştirir. Sınıf takma adları, kullanımlarını kolaylaştırmak için kullanılabilir.

Sınıflarla yapılandırma, kod organizasyonunu ve dokümantasyonu daha iyi hale getirir, ancak diğer yandan, bu kısa ve hatırlanması kolay küresel fonksiyonları kaybettik. Bu statik sınıf yöntemlerine işlev takma adları oluşturarak bu yaklaşımı daha da geliştirebiliriz. Bu manuel veya dinamik olarak yapılabilir.

Laravel, ilk yaklaşımı, statik sınıf yöntemleriyle eşleşen yordam yardımcı dosyalarındaki işlevleri bildirerek dahili olarak kullanır. Bu, tüm şeyleri (docblocks / arguments) yeniden bildirmeniz gerektiği için ideal bir şey olmayabilir.
Ben şahsen HelperServiceProviderbu işlevleri yürütme zamanında oluşturan bir sınıfla dinamik bir yaklaşım kullanıyorum :

<?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()
    {
        //
    }
}

Bunun mühendislik üzerinde olduğunu söyleyebilirim ama sanmıyorum. Oldukça iyi çalışır ve beklenenden farklı olarak en azından PHP 7.x kullanırken ilgili yürütme süresine mal olmaz.


8

Laravel 5 cephelerini çok hızlı yapmak için oluşturduğum bir bash kabuk betiği.

Bunu Laravel 5 kurulum dizininizde çalıştırın.

Buna şöyle deyin:

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

Misal:

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

Bu örneği çalıştırırsanız, dizinler oluşturulur Facadesve Providers'your_laravel_installation_dir / app / MyApp' altında oluşturulur .

Aşağıdaki 3 dosyayı oluşturur ve bunları ekrana çıkarır:

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

Tamamlandıktan sonra, aşağıdakine benzer bir mesaj görüntüler:

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

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

Bu yüzden 'config / app.php' içindeki Sağlayıcılar ve Takma Ad listesini güncelleyin

Çalıştırmak composer -o dumpautoload

"./App/MyApp/Facades/Helper.php" başlangıçta şöyle görünecektir:

<?php

namespace App\MyApp\Facades;


class Helper
{
    //
}

Şimdi yöntemlerinizi "./app/MyApp/Facades/Helper.php" içine ekleyin.

Bir Yardımcı işlev ekledikten sonra "./app/MyApp/Facades/Helper.php" ifadesinin görüntüsü.

<?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) !!}

Bu işlev bir desen bekler ve isteğe bağlı ikinci bir boole argümanını kabul edebilir.

Geçerli URL, kendisine iletilen kalıpla eşleşirse, 'etkin' (veya işlev çağrısına ikinci bir bağımsız değişken olarak 'true' eklerseniz 'class = "active"' değerini verir.

Etkin menüyü vurgulamak için kullanıyorum.

Betiğimin kaynak kodu aşağıdadır. Umarım faydalı bulursunuz ve herhangi bir sorun yaşarsanız lütfen bize bildirin.

#!/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 ""

8

özel yardımcı sınıfınızı eklemek yerine, aslında config/app.phptakma adlar altında dosyanıza ekleyebilirsiniz .

böyle görünmeli.

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

ve daha sonra Denetleyicinize, Helper sınıfınızdaki yöntemlerden bazılarını çağırabilmeniz için 'Helper'ı kullan' yöntemini kullanarak Yardımcısı ekleyin.

eg. Helper::some_function();

veya kaynaklar görünümünde doğrudan Helper sınıfını doğrudan arayabilirsiniz.

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

Ancak bu hala izlenecek geliştirici kodlama stili yaklaşımıdır. Sorunları çözmenin farklı bir yolu olabilir ve yeni başlayanlar için de sahip olduğum şeyleri paylaşmak istiyorum.


4

Özel yardımcılar dizini oluştur: İlk olarak uygulama dizininde Helpers dizini oluşturun. Hlper sınıf tanımı oluşturun: Şimdi iki dizeyi birleştirecek basit bir yardımcı fonksiyon oluşturalım. /App/Helpers/MyFuncs.php içinde yeni bir dosya oluşturun MyFuncs.php Aşağıdaki kodu ekleyin

<?php

namespace App\Helpers;

class MyFuncs {

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

ad alanı Uygulaması \ Helpers; Uygulama ad alanı altındaki Helpers ad alanını tanımlar. sınıf MyFuncs {…} yardımcı sınıf MyFuncs'u tanımlar. public static function full_name ($ first_name, $ last_name) {…} iki dize parametresini kabul eden ve birleştirilmiş dize döndüren statik bir işlevi tanımlar

Yardım servisi sınıf sağlar

Servis sağlayıcılar sınıfları otomatik yüklemek için kullanılır. Tüm yardımcı sınıflarımızı / app / Helpers dizinine yükleyecek bir hizmet sağlayıcı tanımlamamız gerekecek.

Aşağıdaki esnaf komutunu çalıştırın:

php artisan yapmak: sağlayıcı HelperServiceProvider

Dosya oluşturulacak /app/Providers/HelperServiceProvider.php

Open /app/Providers/HelperServiceProvider.php

Aşağıdaki kodu ekleyin:

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

BURAYA,

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.

Şimdi HelperServiceProvider'ı kaydetmemiz ve yardımcılarımız için bir takma ad oluşturmamız gerekiyor.

/config/app.phpDosya aç

Sağlayıcılar dizisi değişkenini bulma

Aşağıdaki satırı ekleyin

App\Providers\HelperServiceProvider::class,

Diğer ad dizisi değişkenini bulun

Aşağıdaki satırı ekleyin

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

Özel yardımcımızı kullanarak değişiklikleri kaydedin

Özel yardımcı fonksiyonumuzu Open /app/routes.php olarak adlandıracak bir rota oluşturacağız

Aşağıdaki rota tanımını ekleyin

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

BURAYA,

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

4

Önce App \ Http dizininin içinde helpers.php dosyasını oluşturun. Sonra composer.json içine aşağıdaki kodu ekleyin

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

Sonra aşağıdaki komutu çalıştırın

composer dump-autoload

Artık özel işlevinizi helpers.php dosyasında tanımlayabilirsiniz.


3

Kullandığım başka bir yol şuydu: 1) app \ FolderName \ fileName.php'de bir dosya oluşturdu ve içinde bu kodu vardı yani

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

2) bundan sonra bizim bıçak

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

bu kadar. ve çalışıyor


3

Özel yardımcılar yazmanın en iyi yolu

1) appProje kök dizininde, Helpers adlı bir klasör oluşturun (Sadece kodu ayırmak ve yapılandırmak için).

2) Klasörün içinde psr-4 dosyaları veya normal php dosyaları yazın

PHP dosyaları psr-4 biçimindeyse, otomatik olarak yüklenir, aksi takdirde proje kök dizininin içindeki composer.json dosyasına aşağıdaki satırı ekleyin

İçinde autoloadanahtarı adında yeni bir anahtar oluşturmak filesoto yükün anda dosyaları yüklemek için, içeride filesnesne uygulaması dizinden başlayarak yolunu ekleyin. Burada bir örnektir.

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

Not: composer dump-autoloaddosya yüklenmezse çalıştırmayı deneyin .


3

App / Helper / Helpers.php uygulamasında Helpers.php oluşturma

namespace App\Helper
class Helpers
{


}

Besteci ve besteci güncellemesi ekle

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

Denetleyicide kullanım

App \ Helper \ Helpers uygulamasını kullanın

config-> app.php dosyasındaki görünüm değişikliğinde kullan

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

görüşte ara

<?php echo Helpers::function_name();  ?>

Teşekkürler, açıklamanızı biraz genişletmek ister misiniz?
Felipe Valdes

2
Sınıf ad composer.jsonboşlukluysa, psr-4 otomatik yükleme işi yapacağından dosyayı eklemek işe yaramaz.
Arcesilas

2

dir bootstrap \ autoload.php içinde

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

bu dosyayı ekle

app\Helpers\function.php

2

**

  • Durum Yardımcısı

** yeni bir yardımcı oluştur

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

Denetleyici ve herhangi bir görünüm dosyası için kullanın

use App\Helpers\StatusHelper;

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

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

0

Laravel 5.3 ve üzeri sürümlerde laravel ekibi tüm yordamsal dosyaları ( routes.php) app/dizinin dışına taşıdı ve tüm app/klasörpsr-4 otomatik yüklenir. Kabul edilen cevap bu durumda işe yarayacaktır, ancak bana doğru gelmiyor.

Yaptığım şey, helpers/projemin kök dizininde bir dizin oluşturmak ve yardımcı dosyaları bunun içine koymak ve dosyamda composer.jsonbunu yaptım:

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

Bu şekilde benim app/ dizinim hala bir psr-4 otomatik yüklü bir dizin ve yardımcılar biraz daha iyi organize edilmiş.

Umarım bu birine yardımcı olur.


0

Burada bazı harika cevaplar var ama bence bu en basit olanı. Laravel 5.4'te (ve daha önceki sürümlerde de) sizin için uygun bir yer oluşturabilirsiniz, örneğin App / Libraries / Helper.php

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

Sonra bunu Blade şablonunuzda şöyle çağırabilirsiniz:

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

@İnject kullanmak istemiyorsanız, 'uppercasePara' işlevini statik olarak yapın ve çağrıyı Blade şablonunuza şu şekilde gömün:

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

Takma adlara gerek yok. Laravel beton sınıfını otomatik olarak çözer.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.