Laravel 4 Yardımcıları ve Temel İşlevler için En İyi Uygulamalar?


152

Laravel 4'te küresel bir işlev koymak için en iyi yeri anlamaya çalışıyorum. Örneğin, tarih biçimlendirmesi. Cepheler çok modüler olduğu için bir cephe yapmanın buna değer olduğunu düşünmüyorum. Bir kütüphane klasörü oluşturma ve orada sınıfları saklama hakkında makaleler okudum ama aynı zamanda basit bir işlev için çok gibi görünüyor. Blade şablonlarında böyle bir 'araç' bulunmamalı mı?

Böyle bir şey için en iyi uygulamalar nelerdir ve bunu Blade şablonlar için nasıl kullanılabilir hale getiririm?

Yanıtlar:


233

Çirkin, tembel ve korkunç bir yol: Sonunda bootstrap/start.phpbir include('tools.php')yeni ekleyin ve işlevinizi bu yeni dosyaya yerleştirin.

Temiz yol: Bir kütüphane oluşturun. Bu şekilde SADECE gerçekten kullandığınızda otomatik olarak yüklenecektir.

  • Bir oluşturun librariesİçerideki klasörü appklasörüne
  • Kütüphane dosyanızı oluşturun, içinde bir sınıf oluşturun ve buna statik işlevler ekleyin
  • Seçenek 1 : Diziye start/global.phpeklemek app_path().'/libraries'için düzenleyin ClassLoader::addDirectories(.
  • Seçenek 2 : Diziye composer.jsoneklemek "app/libraries"için düzenleyin autoload. Çalıştırmakcomposer dump-autoload
  • Görüşlerinizden sınıfınızı ve statik işlevleri çağırın.

global.phpDosyadan alıntılanan seçenekleriniz hakkında

Composer'ı kullanmaya ek olarak, denetleyicilerinizi ve modellerinizi yüklemek için Laravel sınıfı yükleyiciyi kullanabilirsiniz. Bu, tüm sınıflarınızı Composer güncellemesi yapmadan "global" ad alanında tutmak için kullanışlıdır.

Laravel sınıf yükleyicisinin kayıtlı dizinlerdeki sınıfları otomatik olarak arayacağı her iki seçeneği de birleştirebilirsiniz ( Seçenek 1 , daha kolay) ve Composer tüm sınıfları ancak güncelledikten sonra kaydeder ( Seçenek 2 , performansı artırabilir).


3
Bence app_path().'/library'başlangıç ​​/ global.php içine de koymalısınız.
Alexandre Butynski

2
@AlexandreButynski İyi bir nokta. Bu, besteciyi her zaman güncellemek zorunda kalmadan liberies eklemenize izin verecektir. Bunu eklemek için yayınımı düzenledim.
Alexandre Danault

Bu yüzden IDK ... SiteHelpers adlı bir sınıf oluşturun ve sonra bir formatDate yöntemi tanımlayın. ve sonra şablonda SiteHelpers :: formatDate ($ date)?
Jason Spick

@JasonSpick Evet ve dosyanıza bir ad verdiğinizden emin olunsitehelpers.php
Alexandre Danault

3
Neden bestecinin autoload'a ve global.php dosyasına eklemeniz gerekiyor?
CashIsClay

82

Bunu yapmanın yolu /appLaravel 4 projenizin kök dizininde yeni bir klasör oluşturmak . Sonra bu klasörü /app/start/global.phpdosyanın ilk dizisine şu şekilde ekleyin :

<?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.

));

Yeni /app/classesklasör içindeki klasör yapısı ad alanı kuralınızı izlediği sürece . Laravel 4 bu klasördeki tüm sınıfları / dosyaları otomatik olarak yükleyecektir. Bu şekilde herhangi bir besteci dosyasına girmeye veya composer komutunu çalıştırmaya gerek yoktur.

Bunun en iyi uygulama olup olmadığından emin değilim ama kesinlikle işe yarıyor.

Bunun /app/classes/Helpers/Helper.phpgibi basit bir dosya oluşturduysanız :

<?php namespace Helpers;

class Helper {

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

Tek yapmanız gereken aramak Helpers\Helper::helloWorld();

/app/config/app.phpDosyanızdaki bu yardımcı sınıfı da takma adla ekleyebilirsiniz . aliasesDizinin sonuna böyle bir şey eklemeniz yeterlidir:

'Helper'          => 'Helpers\Helper'

4
Bu şekilde hoşuma gidiyor çünkü besteci-ish ile temiz ve şık bir çözüm bulmak zorunda değilsiniz. +1
Gadoma

3
Eğer yardımcı sınıfınızı app.php dosyanıza ekleyecekseniz, sınıfa şu şekilde doğrudan erişebilirsiniz: Helper :: hellowWorld ();
Helmut Granda

yardımcı bir sınıf olmalı mı? burada basit bir işlev tanımlayabilir miyim?
Webinan

2
Eğer composer.json düzenlemezseniz ve besteci dumpautoload çalıştırmak yoksa bu işi yapmaz
Rommy

1
Harika bir çözüm. Rommy'nin dediği gibi koşmayı unutma composer dump-autoload- başımı tırmalamak için 20 dakika harcadım.
al_manchester

25

Laravel'in helpers.php yöntemi composer.json'daki ( https://github.com/laravel/framework/blob/master/composer.json ) "dosyalarınıza" eklemektir :

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

Yaptığım küçük sınıflar oluşturmak (sınıf başına birkaç yöntem, yöntem başına bir satır, bir şeyden genişletilmiş her şey ve DRY, bu benim amacım),

class ExtendedCarbon extends Carbon\Carbon {

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

}

bunları uygulama / kütüphanelere kaydedin ve composer.json'a ekleyin:

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

gerçekleştirmek

composer dump

Ve sonra onları ihtiyacınız olan her yerde kullanın

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

Yeniden düzenleme hakkında bu videoyu izleyin: http://www.youtube.com/watch?v=DC-pQPq0acs

Bu arada, bunun sadece bir örnek olduğundan eminim, ancak Laravel'deki tüm tarihler Karbon örnekleri olduğundan ( https://github.com/briannesbitt/Carbon ) ve tarih ve saati biçimlendirmek için birçok yöntem içerir.


Ben statik yöntemlerin büyük bir hayranı değilim ve gerektiğinde örnek yöntemleri kullanmaya çalışın. Ben çok emin bu tür bir kullanım söz konusu olduğunda, çok daha iyi sahip olacağını olduğum Bug formatDDMMAAAA()olarak static.
XedinUnknown

7

Bunu View::share()başarmak için kapaklarla birlikte de kullanabilirsiniz - Ben sadece bu konuda yayınladım: http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/

Ek avantaj: Fazladan bir sınıf oluşturmanıza ve global ad alanını temiz tutmanıza gerek yoktur.


Bu yaklaşımı seviyorum. Daha fazla ray-ish. Tüm görünüm yardımcı yöntemlerini bir özelliğe nasıl ekleyebilir ve bunları bıçak görünümünde kullanılabilir hale getirebilir miyiz?
bibstha

Dürüst olmak gerekirse PHP ile bunun mümkün olduğunu düşünmüyorum.
Franz
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.