लारवेल: वैश्विक सरणियों डेटा और स्थिरांक कहाँ संग्रहीत करें?


82

मैंने अभी लारवेल के साथ काम करना शुरू किया। मुझे एक पूरी प्रणाली को फिर से लिखने की ज़रूरत है जो मैंने कुछ साल पहले बनाई थी, लारवेल 4 को बेस फ्रेमवर्क के रूप में इस्तेमाल किया। मेरी पुरानी प्रणाली में, मेरे पास constant.phpकुछ स्थिरांक के साथ एक फ़ाइल थी, और एक globals.phpफ़ाइल जिसमें बहुत सारे सरणी सेट होते थे (उदाहरण के लिए, श्रेणियों की स्थिति, घटनाओं के प्रकार, लंगड़े, आदि)। ऐसा करने से, मैं कुछ का उपयोग कर सकता था

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

मेरे app में कहीं भी

मेरा सवाल है, मैं उस जानकारी को तथाकथित "लार्वावेल" कैसे स्टोर कर सकता हूं। मैंने इस जानकारी को संग्रहीत करने के लिए किसी वस्तु का उपयोग करने की कोशिश की, इसे एक सेवा के रूप में स्थापित किया और इसे एक मुखौटा बनाया:

एप्लिकेशन / पुस्तकालयों / परियोजना / 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'
        ];
}

एप्लिकेशन / पुस्तकालयों / परियोजना / ConstantsServiceProvider.php

namespace PJ;

use Illuminate\Support\ServiceProvider;

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

एप्लिकेशन / पुस्तकालयों / परियोजना / ConstantsFacade.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"
},

और इसलिए मैं उस संपत्ति का उपयोग करता हूं PJ\Constants::$langs

यह काम करता है, लेकिन मुझे संदेह है कि यह करने का सबसे कुशल या सही तरीका है। मेरा मतलब है, यह एक संपूर्ण सेवा प्रदाता और facades और इस तरह के सभी सामान बनाकर एक चर को "प्रचारित" करने का सही तरीका है? या मुझे यह डेटा कहां रखना चाहिए?

किसी भी सलाह के लिए धन्यवाद।

EDIT # 01

डेटा जिसे मैं सभी नियंत्रकों को पास करना चाहता हूं और विचारों को स्क्रिप्ट में सीधे सेट किया जा सकता है, जैसे कि मेरी पोस्ट की शुरुआत में उदाहरण के लिए, लेकिन इसे डेटाबेस से गतिशील रूप से भी उत्पन्न किया जा सकता है, उदाहरण के लिए। यह डेटा श्रेणियों की एक सूची हो सकती है। मुझे एक नेविगेशन बार उत्पन्न करने के लिए सभी दृश्यों में उनकी आवश्यकता है, लेकिन मुझे कुछ रूटिंग पैटर्न (जैसे /category/subcategory/product) को परिभाषित करने के लिए भी उनकी आवश्यकता है , और कई नियंत्रकों में कुछ जानकारी को पार्स करने के लिए भी (जैसे कि एक्स उत्पाद रखने वाली श्रेणी से जानकारी प्राप्त करें)।

मेरी सरणी कुछ इस प्रकार है:

$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...']
]

उदाहरण के तौर पर। अनुक्रमणिका श्रेणी की आईडी है, और मान श्रेणी से जुड़ी जानकारी है।

मुझे इस सरणी की आवश्यकता है, सभी नियंत्रकों और दृश्यों में भी उपलब्ध है।

तो, क्या मुझे इसे कॉन्फ़िगर चर के रूप में सहेजना चाहिए? मैं इन आंकड़ों को कैसे संग्रहीत कर सकता हूं; सबसे अच्छा और शब्दार्थ तरीका क्या होगा?

जवाबों:


118

अनुप्रयोग में वैश्विक रूप से उपयोग किए जाने वाले अधिकांश स्थिरांक के लिए, उन्हें कॉन्फ़िगर फ़ाइलों में संग्रहीत करना पर्याप्त है। यह भी बहुत सरल है

app/configनिर्देशिका में एक नई फ़ाइल बनाएँ । चलो बुलावा आयाconstants.php

वहाँ आपको विन्यास मानों की एक सरणी लौटानी होगी।

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

और आप उन्हें निम्नानुसार एक्सेस कर सकते हैं

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

और आप उन्हें भी सेट कर सकते हैं

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

ध्यान दें कि आपके द्वारा निर्धारित मानों कायम नहीं रहेगा। वे केवल वर्तमान अनुरोध के लिए उपलब्ध हैं।

अपडेट करें

डेटाबेस से उत्पन्न जानकारी को संग्रहीत करने के लिए कॉन्फ़िगरेशन शायद सही जगह नहीं है। आप केवल एक आदर्श मॉडल का उपयोग कर सकते हैं जैसे:

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

और सभी श्रेणियों को क्वेरी करें

Category::all();

यदि किसी कारण से पूरी मॉडल बात काम नहीं कर रही है तो आप अपनी खुद की कक्षा और एक मुखौटा बनाने के बारे में सोचना शुरू कर सकते हैं। या आप केवल सभी स्थिर चर और विधियों के साथ एक वर्ग बना सकते हैं और फिर इसे मुखौटा सामान के बिना उपयोग कर सकते हैं।


आसान तरीका! प्रोजेक्ट कोड में पहले से सेट "निरंतर सरणियों" के लिए अच्छा है कि ऐसा करना। लेकिन रनवे पर उत्पन्न चर या सरणियों के बारे में क्या जो मैं हर जगह से वैश्विक स्तर पर पहुंच चाहता हूं। मेरे पास global.php पर कुछ मूल आरंभ कोड हैं, और कुछ चर वहां बनाए जाते हैं जिनकी मुझे कुछ नियंत्रकों या विचारों के बाद आवश्यकता होगी। क्या उस कॉन्फिग वेरिएबल्स की वैल्यू सेट करने का कोई तरीका है, या रनटाइम के दौरान नए भी बनाए जा सकते हैं?
मार्को मैड्यूनो मेजा

मुझे नहीं लगा कि यह इतना आसान हो सकता है। मैं इसे उत्तर के रूप में चिह्नित करूंगा, लेकिन मुझे इसके बारे में एक अंतिम संदेह है। उन चरों में से एक जिन्हें मुझे विश्व स्तर पर सुलभ बनाने की आवश्यकता है, वे डेटाबेस से ली गई श्रेणियों का एक समूह रखते हैं। यह सभी दृश्यों के लिए आवश्यक है क्योंकि इसका उपयोग नेविगेशन मेनू के लिए किया जाएगा, लेकिन यह कुछ नियंत्रकों और यहां तक ​​कि रूटिंग के लिए भी आवश्यक है। क्या इस प्रकार के डेटा को कॉन्फिगर चर के रूप में सहेजना सही (शब्दार्थिक रूप से बोलना) है? या मुझे इसे किसी और तरीके से स्टोर करना चाहिए?
मार्को मैड्यूनो मेजा

2
@Corner 5.0 से कॉन्फिग डायरेक्टरी सीधे आपके प्रोजेक्ट डायरेक्टरी के रूट में स्थित है।
लुकासगेटर

4
Laravel 5 या उच्चतर का उपयोग करने वाले लोगों के लिए आपको 'यूज़ कॉन्फिगरेशन;' जोड़ना होगा। अपने नियंत्रक में या कॉन्फ़िगरेशन के फ़ॉन्ट में एक स्लैश इस तरह डालें: \ config :: get ('constants.langs');
रोटेट्रिज

2
आप अब उपयोग करने के config()बजाय सहायक का उपयोग कर सकते Config::get()हैं।
लीथ

23

स्थिरांक के लिए

Config निर्देशिका में constants.php फ़ाइल बनाएँ: -

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

return [

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

];

आप उनका उपयोग कर सकते हैं जैसे: -

echo YOUR_DEFINED_CONST . '<br>';

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

स्टेटिक एरे के लिए

Config निर्देशिका में static_arrays.php फ़ाइल बनाएँ: -

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'
    ];

}

आप इसका उपयोग कर सकते हैं जैसे: -

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

नोट: लारवेल में सभी कॉन्फ़िग फाइल्स अपने आप शामिल हो जाती हैं, इसलिए मैनुअल की कोई आवश्यकता नहीं है :)


कुछ कंसोल कमांड में उपलब्ध नहीं है जैसे route:cache:Use of undefined constant ID - assumed 'ID'
AliN11

13

Laravel में सामान्य स्थिरांक फ़ाइल बनाएँ

एप्लिकेशन / constants.php

    define('YOUR_CONSTANT_VAR', 'VALUE');

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

composer.json composer.json में autoload पर फ़ाइल स्थान जोड़ने

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

इससे पहले कि यह परिवर्तन प्रभावी हो सके, आपको लारवेल की ऑटोलॉड फाइलों को फिर से बनाने के लिए टर्मिनल में निम्नलिखित कमांड को चलाना होगा:

composer dump-autoload

1
साझा करने के लिए धन्यवाद। मैं
ऑटोलैडिंग के

यह मेरी खुशी है @ChannaveerHakari
पार्थ खरेचा

8

Laravel 5 में वैश्विक स्थिरांक के लिए, मुझे उनके लिए कॉन्फ़िग को कॉल करना पसंद नहीं है। मैं उन्हें इस तरह से रूट समूह में परिभाषित करता हूं:

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

यदि मेरे पास बड़ी संख्या में स्थिरांक हैं, तो क्या उन्हें किसी अन्य फ़ाइल (ओं) में संग्रहीत करने का एक तरीका है और फिर उन्हें मार्ग के कार्य में शामिल करें? इसके अलावा, क्या रेखा ['उपसर्ग' => ''] कर रही है? मुझे पता है कि यह एक साहचर्य सरणी है, लेकिन क्या इससे स्थिरांक सभी मार्गों के लिए उपलब्ध हैं? धन्यवाद।
user3089840

1
अहा अच्छी तरह से मैंने उपसर्ग भाग का पता लगाया: laravel.com/docs/5.1/rout#route-group-prefixes
user3089840

एक और साइड नोट, कोई फर्क नहीं पड़ता कि मैं क्या करता हूं, ऐसा लगता है जैसे PHPUnit इसे पसंद नहीं करता है। जब मैं इसे आपके तरीके से आज़माता हूं, तो ब्राउज़र पर सब कुछ ठीक काम करता है, लेकिन PHPUnit बता रहा है कि मेरे कॉन्स्टेंट पहले से ही परिभाषित हैं, और यह केवल सच नहीं है।
5:30 बजे user3089840

यदि आप अपने कॉन्फिग को कैशिंग कर रहे हैं, तो उनमें स्थिरांक को परिभाषित करने से काम नहीं चलेगा।
शून्य-और-

उपसर्ग का उपयोग करने के लिए महान विचार
अरुण योकेश

4

मुझे लगता है कि सबसे अच्छा तरीका स्थानीयकरण का उपयोग करना है।

एक नई फ़ाइल बनाएं messages.phpमें resources/lang/en( enक्योंकि जो मेरे में सेट कर दिया जाता है कि config/app 'locale'=>'en') अपने सभी मूल्यों की एक सरणी वापसी

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

लार्वा 5.3 और नीचे के लिए पुनः प्राप्त करने के लिए

echo trans('messages.welcome');

या

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

5.4 उपयोग के लिए

echo __('messages.welcome') 

लार्वा 5.0 स्थानीयकरण

या

लारवेल 5.4 स्थानीयकरण


यह सही है। एक नौसिखिया से उप क्वेरी यह है कि उस मैसेज को कैसे पढ़ें। एफपी फाइल और सरणी के रूप में मुख्य मूल्य प्राप्त करें? मैं इसे ऐरे के रूप में पढ़ना चाहता हूं और अपने ग्राहक पक्ष के पुस्तकालय यानी एंगुलर जेएस के लिए निश्चित प्रतिक्रिया को संभालने के लिए json प्रतिक्रिया के रूप में भेजना चाहता हूं।
गोपीनाथ

2

बस उपरोक्त उत्तर को जोड़ने के लिए आपको विन्यास वर्ग को शामिल करना होगा, इससे पहले कि आप इसे लारवेल 5.3 में उपयोग करना शुरू कर सकें

use Illuminate\Support\Facades\Config;

या फ़ंक्शन कॉन्फ़िगरेशन का सरल उपयोग करें ()।
मानता है

2

एवरेस्ट में लारवेल 5.4, अपने निर्माता में आप उन्हें बना सकते हैं;

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

फिर आप उन्हें अपने तरीकों से इस तरह बुला सकते हैं;

\Config::get('privileged');

मॉडल में स्थिर तरीकों के लिए विशेष रूप से उपयोगी, आदि ...

लारैकॉट्स.कॉम पर संदर्भ। https://laracasts.com/discuss/channels/general-discussion/class-apphttpcontrollersconfig-not-found


0

बस एक फ़ाइल डाल constants.php में फ़ाइल config है कि फाइल में निर्देशिका और परिभाषित अपने स्थिरांक, उस फ़ाइल ऑटो लोड, Laravel में परीक्षण किया जाएगा 6 +

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.