2011-05-30 24 views
13

我與創建與Silex php micro framework進行用戶身份驗證的擴展試驗一個命名空間,但我似乎無法得到自動裝卸工作。任何人都可以擺脫光線嗎?你怎麼註冊的Silex自動加載

我有這樣(截斷)的目錄結構

usertest 
|_lib 
| |_silex.phar 
| |_MyNamespace 
| |_UserExtension.php 
| |_User.php 
|_www 
    |_index.php 

的index.php的相關位,其用作自舉和前端控制器是這樣的:

require '../lib/silex.phar'; 

use Silex\Application; 
use MyNamespace\UserExtension; 

$app = new Application(); 
$app['autoloader']->registerNamespace('MyNamespace', '../lib'); 
$app->register(new UserExtension()); 

的我正試圖加載類似這樣的:

namespace MyNamespace; 

use Silex\Application; 
use Silex\ExtensionInterface; 

class UserExtension implements ExtensionInterface { 
    public function register(Application $app) { 
     $app['user'] = $app->share(function() use($app) { 
      return new User(); 
     }); 
    } 
} 

所有非常直截了當的excep t將其拋出這個錯誤:

Fatal error: Class 'MyNamespace\UserExtension' not found in /home/meouw/Projects/php/usertest/www/index.php on line 8 

我已經涉足與Symfony2中,並已成功地跟着instructions for setting up the universal class loader,但在這種情況下我難倒。我錯過了什麼嗎?任何幫助,將不勝感激。

+0

無法重現。我試着用你提供的代碼,它成功了。你將不得不檢查你的名字或分享你的實際代碼。 – igorw 2011-05-31 19:48:13

回答

11

我會使用

$app['autoloader']->registerNamespace('MyNamespace', __DIR__.'/../lib'); 
+0

這就是我最終使用的,它工作正常。謝謝 – meouw 2011-09-29 14:59:17

+9

自動加載器在最新版本的Silex中已棄用,請參閱[我的答案](http://stackoverflow.com/a/11339189/187018)以獲取更新。 – ChrisR 2012-07-05 06:55:33

+0

@ChrisR你的答案也被棄用現在檢查我的答案爲最新的解決方案 – Robert 2015-06-25 18:56:40

3

要註冊的命名空間,只需撥打registerNamespaces()這樣的:

$app = new Silex\Application(); 

$app['autoloader']->registerNamespaces(array(
    'Symfony'   => __DIR__.'/../vendor/', 
    'Panda'   => __DIR__.'/../vendor/SilexDiscountServiceProvider/src', 
    'Knp'    => __DIR__.'/../vendor/KnpSilexExtensions/', 
    // ... 
)); 
59

在最近版本的Silex磁帶自動加載機已被廢棄,要註冊通過的所有命名空間composer.json這是一個更好的解決方案,因爲您正在集中自動加載定義。

例子:

{ 
    "require": { 
     "silex/silex": "1.0.*@dev" 
    }, 
    "autoload": { 
     "psr-0": { 
      "MyNameSpace": "src/" 
     } 
    } 
} 

事實上,當您嘗試訪問磁帶自動加載機中的任何最新版本的Silex以下的RuntimeException被拋出:

You tried to access the autoloader service. The autoloader has been removed from Silex. It is recommended that you use Composer to manage your dependencies and handle your autoloading. See http://getcomposer.org for more information.

+0

據我瞭解,它需要Composer將安裝在我的工作站? – Fractaliste 2014-09-19 09:20:36

+0

您可以在您的PHP項目中本地安裝composer,檢查https://getcomposer.org/doc/00-intro.md#locally – ChrisR 2014-09-19 09:21:41

+0

我無法安裝它,它需要管理員權限。 pdsr-4可以避免運行作曲家嗎? – Fractaliste 2014-09-19 09:26:06

3

兩個添加適當的語句的autoloadcomposer.json註冊命名空間直接調用registerNamespace不工作對我來說,直到我執行composer update在pr ojects文件夾。

+0

這是因爲作曲家安裝需要composer.lock文件 – Robert 2015-12-13 22:45:34

11
Deprecated - As of 2014-10-21 PSR-0 has been marked as deprecated. 
PSR-4 is now recommended as an alternative 

這就是爲什麼你應該使用PSR-4語法composer.json

{ 
    "require": { 
     "silex/silex": "1.0.*@dev", 
    }, 
    "autoload": { 
     "psr-4": { 
      "Vendor\\Namespace\\": "/path" 
     } 
    } 
} 
+0

不適合我=('Class「Controllers \ MyController」does not exist.' – holms 2015-01-23 15:03:16

+0

你需要有正確的目錄結構:)當然改變「\ Vendor \ \命名空間「:和」/路徑「 – Robert 2015-01-23 15:43:50

+0

工作就像一個魅力! PSR-4和PSR-0上的+1。 – 2015-05-04 22:09:39