2013-07-11 20 views
12

Tôi đã tạo thư mục thư viện trong thư mục ứng dụng để thêm thư viện ứng dụng của mình. Tôi đã cập nhật tập tin cấu hình ứng dụng và composer.json để autoload rằng thư mục, nhưng khi tôi chạy lệnh composer dump-autoload tôi nhận được lỗi sau:Làm thế nào để tự động tải 'thư viện' trong laravel 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]

My thư mục ứng dụng cây:

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 trên

"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" 
    //  } 
    }, 

Về cơ bản, tôi cần phải tự động tải tất cả thư viện trong thư mục 'thư viện'.

+0

Bạn chỉ có thể thêm một dòng: '" app/libraries "' vào phần classmap? –

+0

không, các thư mục trong sơ đồ lớp, chỉ tải các tệp trong thư mục gốc, không phải trong các thư mục con. –

Trả lời

23

Bạn nên tạo một không gian tên cấp cao nhất cho ứng dụng của mình.

Sau đó, đặt tất cả thư viện bạn mã trong không gian tên đó. Lưu ý: Bất kỳ thư viện của bên thứ ba nào (hy vọng) sẽ được cài đặt thông qua Composer và do đó có thiết lập tự động nạp tên/tự động nạp tên riêng.

cấu trúc thư mục của bạn sau đó sẽ là:

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

Sau đó, lớp học của bạn sẽ làm theo mà không gian tên:

File: Myapp/Search/Search.php:

<?php namespace Myapp\Search; 

class Search { ... } 

Và cuối cùng, thiết lập tự động load:

"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 để trả lời của bạn. cách này hoạt động, nhưng tôi nghĩ rằng cấu trúc tập tin là một chút dư thừa. không có cách nào khác để tự động tải? –

+0

Mặc dù ban đầu nó cảm thấy dư thừa, vì bạn xây dựng nhiều chức năng hơn, nó thực sự giúp giữ cho mọi thứ sạch sẽ và được tổ chức theo kinh nghiệm của tôi. –

+0

Cách này hoạt động với bộ điều khiển? Ví dụ, tôi có một API với không gian tên Kitties/Api10; trong bộ điều khiển của tôi. Tôi sẽ làm thư viện/Kitties/Api10/PoniesLibrary.php và trong PoniesLibrary sử dụng không gian tên Kitties/Api10? – Lotus

Các vấn đề liên quan