2012-08-15 18 views
6

मैं अपने Codeigniter 2.1.0 आवेदन में इस त्रुटि नियंत्रक है से समान विधि से एक ही स्थिर विधि कॉल नहीं कर सकता:एक ही कक्षा

<?php 

class Error extends CI_Controller 
{ 
    public function __construct() 
    { 
     parent::__construct(); 
    } 

    public function index() 
    { 
     set_status_header(404); 
     $data->menuItems = Main::_menu(); 
     $data->title = "404 error !"; 
     $data->pageview = 'templates/404'; 
     $this->load->view('templates/main', $data); 
    } 

    public function facebook() 
    { 

     set_status_header(404);    
     $data->menuItems = Main::_menu(); 
     $data->title = "Facebook error !"; 
     $data->pageview = "templates/facebook_error"; 
     $this->load->view('templates/main', $data); 
    } 
} 
?> 

Maincontroller _menu:

<?php 
class Main extends CI_Controller 
{ 
    // ... a lot of methods here ... 
    public static function _menu() 
    { 
      static $menuItems = array(//just a simple array 
            ); 
    } 
} 
?> 

फेसबुक() विधि इंडेक्स() के रूप में पूरी तरह से काम करती है, हालांकि इंडेक्स ठीक काम करता है, फेसबुक() इस संदेश को फेंक देता है:

Fatal error: Class 'Main' not found in /var/www/MYApplicationName/application/controllers/error.php on line 22 

पृथ्वी कैसे संभव है? मैं फेसबुक() विधि से Main::_menu() तक कैसे पहुंच सकता हूं?

+1

क्या मेनकंट्रोलर फ़ाइल शामिल है? त्रुटि का अर्थ है कि यह वर्ग नहीं ढूंढ सकता है, अक्सर क्योंकि क्लास फ़ाइल स्क्रिप्ट के भीतर शामिल नहीं होती है। – DavidS

+0

यह पूरी त्रुटि वर्ग है। इंडेक्स() विधि में कोई अतिरिक्त कोड नहीं है। यह कैसे संभव है यदि ये दोनों एक जैसे हैं लेकिन कोई भी कॉल नहीं कर सकता है कि दूसरा क्या कर सकता है? या सूचकांक() विधि एक विशेष है? और हाँ, मुझे पता है कि कुछ कैसे शामिल किया जाए, लेकिन मेरा सवाल यह है कि यह कैसे संभव है कि अनुक्रमणिका() काम करता है ??? – kissgyorgy

+0

'मुख्य' कक्षा कहां है? – PeeHaa

उत्तर

1

@ TheShiftExchange के उत्तर के आधार पर, मैं ट्रैक करने में सक्षम था कि एक मार्ग सेटिंग ने इस व्यवहार को जन्म दिया। मेरे config/routes.php इस तरह दिखता है:,

$route['404_override'] = 'error/index'; 
$route['(:any)'] = "main/$1"; 

तो जब मैं इस main नियंत्रक द्वारा कार्य किया हो www.example.com/nonexistent-url के लिए एक अनुरोध है, तो सीआई देखा है कि वहाँ इस तरह की कोई विधि नहीं है, तो यह भी error/index भाग गया, लेकिन main नियंत्रक तब तक पहले ही लोड हो चुका था।

अन्य विधि facebookmain के एक मौजूदा विधि से पुनः निर्देशित किया गया था, उदाहरण के लिए gallery, इस तरह से यह क्योंकि केवल error/facebook अनुरोध किया जाता है कि अगर मैं यूआरएल www.example.com/error/facebook के पास गया, तो main नियंत्रक लोड नहीं है, की तरह है। अगर मैं www.example.com/error/index पर कॉल करता हूं तो यह वही काम करता है, क्योंकि इस मामले में main नियंत्रक लोड नहीं होता है, केवल error

(इनाम, @TheShiftExchange को जाता है क्योंकि उसके जवाब सबसे सटीक था और मुझे समस्या नीचे में सक्षम ट्रैक करने के लिए सबसे अच्छा जानकारी प्रदान की। धन्यवाद!
मेरी रीडायरेक्ट में से एक पर पहुंच गया कभी नहीं किया गया था, जो मैं tought बुला रहा था त्रुटि/अनुक्रमणिका पृष्ठ।)

1

किसी अन्य नियंत्रक से कॉलिंग फ़ंक्शंस एमवीसी तोड़ता है और आपको एचएमवीसी दायरे में डाल देता है।

यदि आपको वास्तव में ऐसा करने की ज़रूरत है तो कृपया this thread, और कोडइग्निटर के Modular Extensions (HMVC) Plugin पर भी नज़र डालें।

+0

अच्छा विषय, धन्यवाद। मुझे लगता है कि मुझे इस में अपने पुराने प्रश्न का उत्तर मिला: http://codereview.stackexchange.com/questions/11277/where-to-put-menu-items-in-mvc-with-php-model-or-controller – kissgyorgy

1

आप MY_Controller क्यों नहीं बनाते हैं जो CI_Controller को बढ़ाता है जहां आप अपना पुन: प्रयोज्य कोड डालते हैं?

1

असल में - आप गलत हैं। आपका "अनुक्रमणिका" कोड या तो काम नहीं करता है।

मैंने अभी आपके सभी कोड को सीआई 2.1.2 के एक साफ संस्करण में चिपकाया है और इंडेक्स फ़ंक्शन ALSO एक ही त्रुटि देता है।

तो शायद आपके कंप्यूटर में कुछ कैश किया गया है, या आपके पास कहीं और कोड है जो आपको लगता है कि यह काम कर रहा है। लेकिन यह काम नहीं करता है।

वैसे भी - असली प्रश्न यही कारण है कि आप किसी अन्य नियंत्रक से नियंत्रक को कॉल करने का प्रयास क्यों कर रहे हैं? यह एक अच्छा एमवीसी दृष्टिकोण नहीं है। आपका "_menu()" फ़ंक्शन library में स्थित होना चाहिए - जहां वह संबंधित है।

या _menu() कोड को "MY_Controller" में रखें और दोनों नियंत्रक MY_Controller का विस्तार करें।

या _menu() कोड को helper में डालें।

असल में आप तीन बेहतर तरीके हैं जिनसे आप इसका संपर्क कर सकते हैं।

+0

अब तक का सबसे अच्छा जवाब, मैं इसे जांचता हूं, शायद कैशिंग कारण था ... सुझावों के लिए भी धन्यवाद, मैंने पहले से ही मॉडल में मेनू डाला है। – kissgyorgy

संबंधित मुद्दे