लारवेल 4 हेल्पर्स और बेसिक फंक्शन्स के लिए बेस्ट प्रैक्टिस?


152

मैं लारवेल 4 में एक वैश्विक समारोह लगाने के लिए सबसे अच्छी जगह को समझने की कोशिश कर रहा हूं। उदाहरण के लिए, दिनांक स्वरूपण। मुझे नहीं लगता कि एक मुखौटा बनाना इसके लायक है क्योंकि facades बहुत मॉड्यूलर हैं। मैंने एक पुस्तकालय फ़ोल्डर बनाने और वहाँ कक्षाएं संग्रहीत करने के बारे में लेख पढ़ा है, लेकिन यह भी एक साधारण फ़ंक्शन के लिए बहुत कुछ लगता है। क्या ब्लेड टूल में 'टूल' उपलब्ध नहीं होना चाहिए?

इस तरह की चीज़ों के लिए सबसे अच्छे अभ्यास क्या हैं और मैं इसे ब्लेड टेम्प्लेट के लिए कैसे उपलब्ध करा सकता हूँ?

जवाबों:


233

बदसूरत, आलसी और भयानक तरीका: के अंत में bootstrap/start.php, एक जोड़ें include('tools.php')और उस नई फ़ाइल में अपने फ़ंक्शन को रखें।

साफ तरीका: एक पुस्तकालय बनाएं। जब आप वास्तव में इसका उपयोग करते हैं, तो यह केवल स्वतः पूर्ण हो जाएगा।

  • librariesअपने appफोल्डर के अंदर एक फोल्डर बनाएं
  • अपनी लाइब्रेरी फ़ाइल बनाएँ, उसमें एक क्लास बनाएँ, और उसमें स्टैटिक फ़ंक्शंस जोड़ें
  • विकल्प 1 : सरणी में start/global.phpजोड़ने के app_path().'/libraries'लिए संपादित करें ClassLoader::addDirectories(
  • विकल्प 2 : सरणी में composer.jsonजोड़ने के "app/libraries"लिए संपादित करें autoload। Daudcomposer dump-autoload
  • अपने विचारों से अपने वर्ग और स्थिर कार्यों को बुलाएं।

global.phpफ़ाइल से उद्धृत आपके विकल्पों के बारे में

संगीतकार का उपयोग करने के अलावा, आप अपने नियंत्रक और मॉडल को लोड करने के लिए लारवेल वर्ग लोडर का उपयोग कर सकते हैं। यह आपके सभी वर्गों को "वैश्विक" नामस्थान में बिना कंपोज़र अपडेट के रखने के लिए उपयोगी है।

आप दोनों विकल्पों को जोड़ सकते हैं, जहां लारवेल क्लास लोडर स्वचालित रूप से पंजीकृत निर्देशिकाओं ( विकल्प 1 , आसान) में कक्षाओं की खोज करेगा और संगीतकार सभी वर्गों का रिकॉर्ड रखेगा लेकिन आपके द्वारा इसे अपडेट करने के बाद ही ( विकल्प 2 , प्रदर्शन में सुधार हो सकता है)।


3
मुझे लगता है कि आपको app_path().'/library'शुरुआत / Global.php में भी जगह बनानी होगी।
एलेक्जेंडर ब्यूटिंस्की

2
@AlexandreButynski अच्छा बिंदु। यह हर समय संगीतकार को अपडेट किए बिना परिवादियों को जोड़ने की अनुमति देगा। मैंने इसे जोड़ने के लिए अपनी पोस्ट संपादित की।
अलेक्जेंड्रे डेनॉल्ट

इसलिए मैं IDK ... SiteHelpers नामक एक वर्ग बनाता हूं और फिर एक विधि प्रारूप परिभाषित करता हूं। और फिर टेम्पलेट में मुझे SiteHelpers :: formatDate ($ तारीख) करने में सक्षम होना चाहिए?
जेसन स्पिक

@JasonSpick हाँ, और सुनिश्चित करें कि आप अपनी फ़ाइल को नाम देंsitehelpers.php
अलेक्जेंड्रे डानॉल्ट

3
आपको इसे संगीतकार के ऑटोलॉड के साथ-साथ Global.php फ़ाइल में जोड़ने की आवश्यकता क्यों है?
CashIsClay

82

ऐसा करने का मेरा तरीका है /appकि आपके लारावेल 4 प्रोजेक्ट की जड़ में डायरेक्टरी में एक नया फ़ोल्डर बनाया जाए । फिर इस फ़ोल्डर को /app/start/global.phpफ़ाइल के पहले ऐरे में जोड़ें जैसे:

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

));

जब तक नए /app/classesफ़ोल्डर में फ़ोल्डर संरचना आपके नेमस्पेसिंग कन्वेंशन का अनुसरण नहीं करती है। लारावेल 4 इस फ़ोल्डर के भीतर सभी वर्गों / फाइलों को ऑटोलोड करेगा। इस तरह से किसी भी कंपोज़र फ़ाइलों को खोदने या कंपोज़र कमांड चलाने की कोई आवश्यकता नहीं है।

यकीन नहीं है कि यह सबसे अच्छा अभ्यास है, लेकिन यह निश्चित रूप से काम करता है।

यदि आपने एक साधारण फाइल बनाई है, जो /app/classes/Helpers/Helper.phpइस प्रकार है:

<?php namespace Helpers;

class Helper {

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

आपको बस कॉल करना होगा Helpers\Helper::helloWorld();

आप अपनी /app/config/app.phpफ़ाइल में इस सहायक वर्ग को भी उपनाम दे सकते हैं । aliasesसरणी के अंत में बस कुछ इस तरह जोड़ें :

'Helper'          => 'Helpers\Helper'

4
मुझे इस तरह से पसंद है क्योंकि आपको संगीतकार-ईश, एक साफ और उत्तम दर्जे के समाधान के साथ कुछ भी नहीं करना है। +1
गाडोमा

3
यदि आप अपने सहायक वर्ग को अपने app.php फ़ाइल में जोड़ना चाहते थे, तो अब आप सीधे इस तरह कक्षा का उपयोग कर सकते हैं: हेल्पर :: hellowWorld ();
हेलमुट ग्राण्ड

क्या सहायक को एक वर्ग होना चाहिए? क्या मैं यहां एक साधारण फ़ंक्शन को परिभाषित कर सकता हूं?
वेबिनान

2
यह काम अगर आप composer.json संपादित न करें और संगीतकार dumpautoload नहीं चला नहीं है
Rommy

1
महान समाधान। जैसा कि रम्मी कहती हैं, दौड़ना न भूलें composer dump-autoload- मैंने किया और मेरे सिर को खरोंचते हुए 20 मिनट बिताए।
al_manchester

25

Laravel की सहायकों.php विधि को कंपोज़र.जेसन ( https://github.com/laravel/framework/blob/master/composer.json ) में अपनी "फाइलों" में जोड़ना है :

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

मैं क्या करता हूँ छोटी कक्षाओं को बनाने के लिए (प्रति कक्षा कुछ विधियाँ, प्रति पंक्ति एक विधि, कुछ और डीआरवाई से विस्तारित सब कुछ, यही लक्ष्य है),

class ExtendedCarbon extends Carbon\Carbon {

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

}

ऐप / लाइब्रेरी में उन्हें सहेजें और कंपोज़र से जोड़ें। json:

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

निष्पादित

composer dump

और फिर जहां जरूरत हो बस उनका इस्तेमाल करें

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

इस वीडियो को देखने के बारे में देखें: http://www.youtube.com/watch?v=DC-pQPq0acs

वैसे, मुझे यकीन है कि यह सिर्फ एक उदाहरण था, लेकिन आपको तिथियों को प्रारूपित करने के लिए सहायक की आवश्यकता नहीं है, क्योंकि लारवेल में सभी तिथियां कार्बन के उदाहरण हैं ( https://github.com/briannesbitt/Carbon ) और इसमें दिनांक और समय को प्रारूपित करने की विधियों का भार है।


मैं खुद स्थैतिक तरीकों का इतना बड़ा प्रशंसक नहीं हूं, और जब आवश्यक हो तो उदाहरण के तरीकों का उपयोग करने की कोशिश करता हूं। बग मैं बहुत यकीन है कि इस तरह के उपयोग के मामले में, आप होने का ज्यादा बेहतर होगा हूँ formatDDMMAAAA()के रूप में static
XedinUnogn

7

View::share()इसे प्राप्त करने के लिए आप क्लोजर के साथ भी उपयोग कर सकते हैं - मैंने अभी इस बारे में पोस्ट किया है: http://www.develophp.org/2014/07/laravel-4-blade-helper-functions/

अतिरिक्त लाभ: आपको एक अतिरिक्त वर्ग बनाने की आवश्यकता नहीं है और वैश्विक नाम स्थान को भी साफ रखें।


मुझे यह तरीका पसंद है। अधिक रेल-ईश। क्या हम कुछ देख सकते हैं कि एक विशेषता के अंदर सभी दृश्य-सहायक विधियों को कैसे जोड़ा जाए और क्या वे ब्लेड दृश्य में उपलब्ध हैं?
bibstha

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