Laravel: Global dizi verileri ve sabitleri nerede saklanır?


82

Laravel ile çalışmaya yeni başladım. Laravel 4'ü temel çerçeve olarak kullanarak birkaç yıl önce yaptığım tüm sistemi yeniden yazmam gerekiyor. Eski sistemimde, constant.phpbazı sabitlerin beyan edildiği bir dosyam ve globals.phpçok sayıda dizi kümesi içeren bir dosyam vardı (örneğin, kategori durumları, olay türleri, diller vb.). Bunu yaparak şöyle bir şey kullanabilirim:

foreach ( $langs as $code => $domain ) {
    // Some stuff
}

uygulamamın herhangi bir yerinde.

Sorum şu, bu bilgiyi sözde "laravel yolu" ile nasıl saklayabilirim. Bu bilgiyi saklamak için bir tür nesne kullanmayı denedim, bunu bir hizmet olarak ayarladım ve onun için bir cephe oluşturdum:

app / libraries / Project / Constants.php

namespace PJ;

class Constants {

    public static $langs = [
            'es' => 'www.domain.es',
            'en' => 'www.domain.us',
            'uk' => 'www.domain.uk',
            'br' => 'www.domain.br',
            'it' => 'www.domain.it',
            'de' => 'www.domain.de',
            'fr' => 'www.domain.fr'
        ];
}

app / libraries / Project / ConstantsServiceProvider.php

namespace PJ;

use Illuminate\Support\ServiceProvider;

class ConstantsServiceProvider extends ServiceProvider {
    public function register() {
        $this->app->singleton('PJConstants', function() {
            return new Constants;
        });
    }
}

app / libraries / Proje / SabitlerFacade.php

namespace PJ;

use Illuminate\Support\Facades\Facade;

class ConstantsFacade extends Facade {
    protected static function getFacadeAccessor() { 
        return 'PJConstants';
    }
}

composer.json

"psr-4": {
     "PJ\\": "app/libraries/Project"
},

ve bu mülke olarak erişiyorum PJ\Constants::$langs.

Bu işe yarıyor, ancak bunu yapmanın en verimli veya doğru yolu olduğundan şüpheliyim. Demek istediğim, bütün bir Servis Sağlayıcı, cepheler ve benzeri şeyler oluşturarak bir değişkeni "yaymanın" doğru yolu bu mu? Veya bu verileri nereye koymalıyım?

Herhangi bir tavsiye için teşekkürler.

DÜZENLE # 01

Tüm denetleyicilere ve görünümlere iletmek istediğim veriler, yazımın başındaki örnekte olduğu gibi doğrudan kodda ayarlanabilir, ancak aynı zamanda bir veritabanından dinamik olarak da oluşturulabilir. Bu veriler bir kategori listesi olabilir. Bir gezinme çubuğu oluşturmak için tüm görünümlerde onlara ihtiyacım var, ancak aynı zamanda bazı yönlendirme kalıplarını (gibi /category/subcategory/product) tanımlamam ve ayrıca birkaç denetleyicide bazı bilgileri ayrıştırmam için (X ürününü içeren kategoriden bilgi alma gibi ) onlara ihtiyacım var .

Dizim şöyle bir şey:

$categories = [
    1 => ['name' => 'General', 'parent' => 0, 'description' => 'Lorem ipsum...'],
    2 => ['name' => 'Nature', 'parent' => 0, 'description' => 'Lorem ipsum...'],
    3 => ['name' => 'World', 'parent' => 0, 'description' => 'Lorem ipsum...'],
    4 => ['name' => 'Animals', 'parent' => 2, 'description' => 'Lorem ipsum...']
]

Örnek olarak. Dizin, kategorinin kimliğidir ve Değer, kategoriyle ilişkili bilgidir.

Tüm Denetleyiciler ve Görünümlerde de mevcut olan bu diziye ihtiyacım var.

Öyleyse, bunu bir Yapılandırma değişkeni olarak kaydetmeli miyim? Bu verileri başka nasıl saklayabilirim; en iyi ve anlamsal olarak doğru yol ne olurdu?

Yanıtlar:


118

Uygulamada genel olarak kullanılan sabitlerin çoğu için, bunları yapılandırma dosyalarında saklamak yeterlidir. Aynı zamanda oldukça basit

Dizinde yeni bir dosya oluşturun app/config. Hadi diyelimconstants.php

Orada bir dizi yapılandırma değeri döndürmeniz gerekir.

return [
    'langs' => [
        'es' => 'www.domain.es',
        'en' => 'www.domain.us'
        // etc
    ]
];

Ve bunlara aşağıdaki şekilde erişebilirsiniz

Config::get('constants.langs');
// or if you want a specific one
Config::get('constants.langs.en');

Ve onları da ayarlayabilirsiniz

Config::set('foo.bar', 'test');

Ayarladığınız değerlerin kalıcı olmayacağını unutmayın. Sadece mevcut istek için kullanılabilirler.

Güncelleme

Yapılandırma, muhtemelen veritabanından oluşturulan bilgileri depolamak için doğru yer değildir. Şunun gibi bir Eloquent Modeli kullanabilirsiniz :

class Category extends Eloquent {
    // db table 'categories' will be assumed
}

Ve tüm kategorileri sorgulayın

Category::all();

Tüm Model olayı herhangi bir nedenle işe yaramıyorsa, kendi sınıfınızı ve bir cepheyi yaratmayı düşünmeye başlayabilirsiniz. Ya da tüm statik değişkenler ve yöntemlerle bir sınıf oluşturabilir ve sonra onu dış cephe malzemeleri olmadan kullanabilirsiniz.


Kolay yol! Bunu yapmak, proje kodunda zaten ayarlanmış "sabit diziler" için güzeldir. Peki ya çalışma zamanında oluşturulan ve diğer her yerden global olarak erişmek istediğim değişkenler veya diziler? Global.php'de bazı temel başlangıç ​​kodum var ve orada bazı denetleyicilerde veya görünümlerde ihtiyaç duyacağım bazı değişkenler oluşturuldu. Bu Config değişkenlerinin değerini ayarlamanın veya çalışma zamanında yenilerini oluşturmanın bir yolu var mı?
Marco Madueño Mejía

Bu kadar kolay olabileceğini düşünmemiştim. Cevap olarak işaretleyeceğim ama bu konuda son bir şüphem var. Küresel olarak erişilebilir hale getirmem gereken bu değişkenlerden biri, veritabanından alınan bir dizi kategori içeriyor. Gezinme menüsünde kullanılacağı için tüm görünümler için gereklidir, ancak bazı kontrolörlerde ve hatta yönlendirme için de gereklidir. Bu tür verileri bir Yapılandırma değişkeni olarak kaydetmek (anlamsal olarak) doğru mu? Yoksa başka bir şekilde mi saklamalıyım?
Marco Madueño Mejía

2
@Corner 5.0'dan beri config dizini doğrudan proje dizininizin kök dizininde bulunmaktadır.
lukasgeiter

4
Laravel 5 veya üstünü kullanan kişiler için 'Config kullan' eklemeniz gerekir; Denetleyicinize veya Config'in yazı tipine şöyle bir eğik çizgi koyun: \ Config :: get ('sabitler.langs');
rotaercz

2
Şimdi kullanmak config()yerine yardımcıyı kullanabilirsiniz Config::get().
Leith

23

Sabitler için

Config dizininde constants.php dosyası oluşturun: -

define('YOUR_DEFINED_CONST', 'Your defined constant value!');

return [

'your-returned-const' => 'Your returned constant value!'

];

Bunları şu şekilde kullanabilirsiniz: -

echo YOUR_DEFINED_CONST . '<br>';

echo config('constants.your-returned-const');

Statik Diziler için

Config dizininde static_arrays.php dosyası oluşturun: -

class StaticArray
{

    public static $langs = [
        'es' => 'www.domain.es',
        'en' => 'www.domain.us',
        'uk' => 'www.domain.uk',
        'br' => 'www.domain.br',
        'it' => 'www.domain.it',
        'de' => 'www.domain.de',
        'fr' => 'www.domain.fr'
    ];

}

Bunu şu şekilde kullanabilirsiniz: -

echo StaticArray::$langs['en'];

Not: Laravel tüm yapılandırma dosyalarını otomatik olarak içerir, bu nedenle manuel eklemeye gerek yoktur :)


route:cacheUse of undefined constant ID - assumed 'ID'
Aşağıdakiler

13

Laravel'de ortak sabitler dosyası oluşturun

app / sabitler.php

    define('YOUR_CONSTANT_VAR', 'VALUE');

    //EX
    define('COLOR_TWO', 'red');

composer.json , composer.json içindeki otomatik yüklemede dosya konumu ekler

"autoload": {
    "files": [
        "app/constants.php"
    ]
}

Bu değişikliğin etkili olabilmesi için, Laravel'in otomatik yükleme dosyalarını yeniden oluşturmak için Terminal'de aşağıdaki komutu çalıştırmanız gerekir:

composer dump-autoload

1
Paylaşım için teşekkürler.
Otomatik yüklemeyi

benim için zevktir @ChannaveerHakari
Parth kharecha

8

Laravel 5'teki global sabitler için, onlar için Config'i çağırmayı sevmiyorum. Bunları Rota grubunda şu şekilde tanımlıyorum:

// global contants for all requests
Route::group(['prefix' => ''], function() {
    define('USER_ROLE_ADMIN','1');
    define('USER_ROLE_ACCOUNT','2');
});

Çok sayıda sabitim varsa, onları başka bir dosyada saklamanın ve sonra onları rotanın işlevine dahil etmenin bir yolu var mı? Ayrıca, ['prefix' => ''] satırı ne yapıyor? İlişkilendirilebilir bir dizi olduğunu biliyorum, ancak bu sabitleri tüm yollar için kullanılabilir hale getiriyor mu? Teşekkürler.
user3089840

1
Aha iyi önek kısmını buldum
user3089840

Başka bir not, ne yaparsam yapayım, PHPUnit bundan hoşlanmıyor gibi görünüyor. Sizin yönteminizle denediğimde, tarayıcıda her şey yolunda gidiyor, ancak PHPUnit bana sabitlerimin zaten tanımlandığını söylüyor ve bu doğru değil.
user3089840

Yapılandırmalarınızı önbelleğe alıyorsanız, sabitleri bunlarda tanımlamak işe yaramayacaktır.
sıfırlar ve birler

Ön eki kullanmak harika bir fikir
Arun Yokesh

4

Bence en iyi yol yerelleştirmeyi kullanmak.

Yeni dosya oluşturma messages.phpiçinde resources/lang/en( enyani benim, set budur çünkü config/app 'locale'=>'en') tüm değer dizisi döndürür

return [
    'welcome' => 'Welcome to our application'
];

laravel 5.3 ve altı için almak için

echo trans('messages.welcome');

veya

echo Lang::get('messages.welcome');

5.4 kullanım için

echo __('messages.welcome') 

laravel 5.0 yerelleştirmesi

veya

laravel 5.4 yerelleştirme


Bu doğru. Bir acemiden alt sorgu, bu message.php dosyasının nasıl okunacağı ve anahtar değerinin dizi olarak nasıl alınacağıdır? Bunu dizi olarak okumak ve istemci tarafı kitaplığım için json yanıtı olarak göndermek istiyorum, örneğin belirli dizeleri işlemek için Angular JS.
Gopinath

2

Sadece yukarıdaki cevaba eklemek için, Laravel 5.3'te kullanmaya başlamadan önce yapılandırma sınıfını dahil etmeniz gerekecektir.

use Illuminate\Support\Facades\Config;

Veya basitçe config () işlevini kullanın.
ademers

2

En azından Laravel 5.4'te, kurucunuzda bunları oluşturabilirsiniz;

public function __construct()
{
  \Config::set('privileged', array('user1','user2');
  \Config::set('SomeOtherConstant', 'my constant');     
}     

Daha sonra yöntemlerinizde bu şekilde adlandırabilirsiniz;

\Config::get('privileged');

Özellikle Modeldeki vb. Statik yöntemler için kullanışlıdır.

Laracasts.com adresinden referans https://laracasts.com/discuss/channels/general-discussion/class-apphttpcontrollersconfig-not-found


0

Sadece bir dosya constants.php dosyasını config dizinine koyun ve sabitlerinizi bu dosyada tanımlayın, bu dosya otomatik olarak yüklenecektir, Laravel 6+ 'de test edilmiştir.

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.