2012-11-20 9 views
13

लार्वा फ्रेमवर्क का उपयोग करने में, मैं बेस_कंट्रोलर में परिभाषित फ़ंक्शन को एक दृश्य में कैसे कॉल कर सकता हूं। Exacmple के लिए:लैरवेल: बेस_कंट्रोलर में परिभाषित कॉलिंग फ़ंक्शन

class Base_Controller extends Controller { 

    public static function format_something() 
    { 
     return something; 
    } 
} 

मैं दृश्य फ़ाइल में format_something() को कैसे कॉल कर सकता हूं?

आमतौर पर मुझे जो त्रुटि मिलती है वह इस तरह दिखती है: विधि [link_to_action] व्यू क्लास पर परिभाषित नहीं है।

शायद एक मूर्ख सवाल, लेकिन अग्रिम धन्यवाद!

संपादित

ठीक है! सबसे पहले ऐसा कुछ करने के लिए सही जगह पुस्तकालय फ़ोल्डर में है। दूसरा, समस्या यह है कि आपकी कक्षा में अंडरस्कोर नहीं हो सकता है।

तो आवेदन/पुस्तकालयों में मैं कक्षा

class AppHelper { 

    public static function format_something() 
    { 
     return something; 
    } 
} 

साथ फ़ाइल AppHelper.php बनाया और इसे पसंद कॉल कर सकते हैं:

$formated = AppHelper::format_something; 

मदद के लिए धन्यवाद और अच्छा मंच Boofus McGoofus पाते हैं।

उत्तर

10

यह उत्तर लैरवेल 3 के लिए लिखा गया था। लैरवेल 4 के लिए और बाद में, संगीतकार के ऑटोलोडर का उपयोग करके लाजदक मरेक का जवाब बेहतर है।

format_something() जैसे कार्य नियंत्रक में नहीं हैं। नियंत्रक सिर्फ विभिन्न स्रोतों से डेटा एकत्र करने और इसे देखने के लिए पास होना चाहिए। यह नौकरी ज्यादातर रूटिंग है।

मैंने अपने सभी छोटे सहायक कार्यों के लिए एप्लिकेशन फ़ोल्डर में "हेल्पर्स" नामक एक फ़ोल्डर बनाया है।

foreach(glob(path('app').'helpers/*.php') as $filename) { 
    include $filename; 
} 

मुझे लगता है कि ऐसा करने के लिए एक बेहतर तरीका है कि वहाँ है, लेकिन अब तक यह है: सुनिश्चित करें कि सभी मेरी नियंत्रकों, विचारों, और मॉडल उन तक पहुंच बनाने के लिए, मैं अपने start.php फ़ाइल में निम्न को शामिल किया है मेरे लिए काम किया जो कुछ भी और फ़ाइल

बनाएं निर्देशिका "सहायकों" या:

+0

तो मैं एक पुस्तकालय वर्ग App_Helpers साथ और मैं क्या start.php में मेरी autoloader डिफ़ॉल्ट रूप से पुस्तकालयों फ़ोल्डर लोड कर रहा है बता सकते हैं से App_Helpers.php बुलाया फ़ाइल बनाया है, हाँ मेरे एप्लिकेशन को अभी भी क्या App_Helpers पता करने के लिए प्रतीत नहीं होता :: format_something() है? – Jim

+1

@ जिम - मुझे लगता है कि उत्तर यहां है: http://forums.laravel.com/viewtopic.php?pid=18328#p18328 - लाइब्रेरी क्लास नामों में कोई अंडरस्कोर नहीं –

+0

आह हाँ! बहुत अच्छा धन्यवाद! – Jim

20

मेरे लिए काम कर रहा है

// app/helpers/AppHelper.php 

class AppHelper { 

    public static function format_something() 
    { 
     return something; 
    } 
} 

जोड़े पथ composer.json को

// composer.json 

    "autoload": { 
     "classmap": [ 
        "app/helpers" // <-------- add this line 
     ] 
    }, 

रन: (autoload पुनः लोड)

composer dump-autoload 

अब आप कॉल कर सकते हैं:

$formated = AppHelper::format_something(); 
+0

यह विधि भी बहुत उपयोगी है, खासकर यदि आप इसका उपयोग कर रहे हैं आपकी परियोजना में संगीतकार। (एफवाईआई यह धागा एल 3 के लिए था)। – Jim

+0

मुझे आपका विचार पसंद है और यह आकर्षण की तरह काम करता है। – gwinh

+4

इस तकनीक का उपयोग करके, मैं नियंत्रक में विधि को कॉल कर सकता हूं, लेकिन टेम्पलेट में नहीं। अंततः मैं चाहता हूं कि दृश्य टेम्पलेट में {{नोटिफायर :: अलर्ट ('जानकारी', 'मेरा सूचना संदेश')}} करने में सक्षम होना है। मैं इसे कैसे प्राप्त करूं? – jcorry

2

आप अपने आप को Laravel framework itself से प्रेरित करते हैं कर सकते हैं।

मैं एक फॉर्मेटर का अपना उदाहरण लेगा और लार्वेल फ्रेमवर्क में url सहायक का संदर्भ लेंगे।

<?php 

if (! function_exists('format_that')) { 
    /** 
    * Generate something 
    * 
    * @param string $text 
    * @return string 
    */ 
    function format_that($text) 
    { 
     return app('formatter')->format_that($text); 
    } 
} 

और add it अपने composer.json फाइल करने के लिए:

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

भागो autoload php फ़ाइल को पुन: करने के लिए इस आदेश:

$ composer dumpautoload 

अपनी खुद की helpers.php फ़ाइल बनाने के द्वारा प्रारंभ अपनाबनाएंapp/Providers/FormatterServiceProvider.php:

<?php 

namespace Illuminate\Routing; 

use Illuminate\Support\ServiceProvider; 
use App\Helpers\FormatGenerator; 

class FormatterServiceProvider extends ServiceProvider 
{ 
    /** 
    * Register the service provider. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app['formatter'] = $this->app->share(function ($app) { 
      return new FormatGenerator($app['request']); 
     }); 
    } 
} 

Register अपने सेवा प्रदाता। Laravel ढांचे register विधि invokes लेकिन आप अपने ऐप्लिकेशन कॉन्फ़िग फ़ाइल config/app.php में जोड़ने के लिए की जरूरत है:

'providers' => [ 


     /* 
     * Application Service Providers... 
     */ 
     App\Providers\AppServiceProvider::class, 
     // other providers... 
     App\Providers\FormatterServiceProvider::class, 

] 

अंत में, बनाने के अपने actual generator classapp/Helpers/FormatGenerator.php

<?php 

namespace App\Helpers; 

use Illuminate\Http\Request; 

class FormatGenerator 
{ 

    protected $request; 

    /** 
    * Create a new URL Generator instance. 
    * 
    * @param \Illuminate\Routing\RouteCollection $routes 
    * @param \Illuminate\Http\Request $request 
    * @return void 
    */ 
    public function __construct(Request $request) 
    { 
     $this->request = $request; 
    } 

    public function format_that($text){ 
     if ($request->path() == "home"){ 
      return mb_strtoupper($text); 
     } 
     else{ 
      return $text; 
     } 
    } 

} 

आप वैकल्पिक रूप से a Facadeapp/Facade/Formatter.php बना सकते हैं, करने में सक्षम हो Formatter::format_that($text):

<?php 

namespace App\Facades; 

use Illuminate\Support\Facades\Facade; 

/** 
* @see \App\Helpers\FormatGenerator 
*/ 

class Formatter extends Facade 
{ 
    protected static function getFacadeAccessor() { return 'formatter'; } 
} 

आप coul डी खुद से पूछें:

  • मुखौटा क्यों? आप app('formatter')->format_that($text) के बजाय Formatter::format_that($text) पर कॉल करके कहीं और घटक का पुन: उपयोग कर सकते हैं। वास्तव में चीनी वाक्यविन्यास।
  • सेवा प्रदाता क्यों? निर्भरता इंजेक्शन। यदि आपको Request का उपयोग करने की आवश्यकता है या एक जटिल वस्तु बनाना चाहते हैं, तो सेवा प्रदाता आपके लिए इसका ख्याल रखेगा और इसे आपके $app ऑब्जेक्ट में उपलब्ध कराएगा।
संबंधित मुद्दे