2013-07-11 4 views
12

मैंने अपने ऐप पुस्तकालयों को जोड़ने के लिए ऐप फ़ोल्डर में एक लाइब्रेरी फ़ोल्डर बनाया है। मैं एप्लिकेशन कॉन्फ़िग फ़ाइल और autoload को composer.json कि फ़ोल्डर को नवीनीकृत किया है, लेकिन जब मैं आदेश composer dump-autoload चलाने मैं अगले त्रुटि मिलती है:लार्वेल 4 में 'लाइब्रेरीज़' को ऑटोलोड कैसे करें?

{"error":{"type":"Symfony\\Component\\Debug\\Exception\\FatalErrorException","message":"Class 'App\\Libraries\\Search\\SearchServiceProvider' not found","file":"D:\\Users\\Miguel Borges\\Documents\\Trabalhos\\Tese\\portal\\bootstrap\\compiled.php","line":4130}}PHP Fatal error: Class 'App\Libraries\Search\SearchServiceProvider' not found in D:\Users\Miguel Borges\Documents\Trabalhos\Tese\portal\bootstrap\compiled.php on line 4130 [Finished in 1.1s with exit code 255]

मेरा ऐप फ़ोल्डर ट्री:

app 
| ... 
+ libraries 
| + search 
| | - Search.php 
| | - SearchFacade.php 
| | - SearchServiceProvider.php 
| + lib2 
| | - ... 
| + lib3 
| | - ... 
| | - Theme.php 
| - ... 
- filters.php 
- routes.php 

SearchServiceProvider.php

namespace App\Libraries\Search; 

use Illuminate\Support\ServiceProvider; 

class SearchServiceProvider extends ServiceProvider { 

    /** 
    * Register the service provider. 
    * 
    * @return void 
    */ 
    public function register() 
    { 
     $this->app['search'] = $this->app->share(function($app) 
     { 
      return new Search; 
     }); 
    } 

} 

composer.js

"autoload": { 
     "classmap": [ 
      "app/commands", 
      "app/controllers", 
      "app/models", 
      "app/libraries", 
      "app/database/migrations", 
      "app/database/seeds", 
      "app/tests/TestCase.php" 
     ] 
     // , 
    //  "psr-0": { 
    //   "app": "app/libraries" 
    //  } 
    }, 

असल में, मैं 'पुस्तकालयों' फ़ोल्डर के भीतर सभी पुस्तकालयों autoload की जरूरत है।

+0

आप क्लासमैप सेक्शन में केवल एक पंक्ति: '" ऐप/लाइब्रेरीज़ "जोड़ सकते हैं? –

+0

नहीं, क्लासमैप में फ़ोल्डर्स, केवल रूट में फ़ाइलों को लोड करते हैं, सबफ़ोल्डर में नहीं। आपके उत्तर के लिए –

उत्तर

23

आपको अपने आवेदन के लिए शीर्ष-स्तरीय नामस्थान बनाना चाहिए।

फिर सभी पुस्तकालयों को उस नामस्थान के नीचे कोड डालें। नोट: किसी तीसरे पक्ष के पुस्तकालयों को संगीतकार के माध्यम से (उम्मीद है) स्थापित किया जाना चाहिए और इसलिए इसका अपना नामस्थान/ऑटोलोडिंग सेटअप होना चाहिए।

आपका निर्देशिका संरचना तो होगा:

libraries 
    Myapp 
     Search (note directory is capitalized) 
      Search.php 
      SearchFacade.php 
      SearchServiceProvider.php 
     AnotherLib 

फिर अपनी कक्षाओं कि नाम स्थान का पालन करेंगे:

फ़ाइल: Myapp/Search/Search.php:

<?php namespace Myapp\Search; 

class Search { ... } 

और अंत में, अपने autoloading स्थापना:

"autoload": { 
    "classmap": [ 
     "app/commands", 
     "app/controllers", 
     "app/models", 
     "app/libraries", 
     "app/database/migrations", 
     "app/database/seeds", 
     "app/tests/TestCase.php" 
    ] 
    , 
    "psr-0": { 
     "Myapp": "app/libraries" 
    } 
}, 
+0

thx। इस तरह काम करता है, लेकिन मुझे लगता है कि फ़ाइल संरचना थोड़ा अनावश्यक है। ऑटोलोडिंग करने का कोई और तरीका नहीं है? –

+0

हालांकि यह पहली बार अनावश्यक लगता है, क्योंकि आप अधिक कार्यक्षमता बनाते हैं, यह वास्तव में मेरे अनुभव में चीजों को साफ और व्यवस्थित रखने में मदद करता है। –

+0

यह नियंत्रकों के साथ कैसे काम करता है? उदाहरण के लिए, मेरे पास नामस्थान Kitties/Api10 के साथ एक एपीआई है; मेरे नियंत्रकों में। क्या मैं पुस्तकालय/Kitties/Api10/PoniesLibrary.php और PoniesLibrary में नामस्थान Kitties/Api10 का उपयोग करेंगे? – Lotus

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