2011-11-11 22 views
1

我的應用程序文件:Silex自動裝載機的使用有什麼問題?

<?php // /src/app.php 

require_once __DIR__ . '/../lib/vendor/Sensio/silex.phar'; 

use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 
use Foo\Bar; 

$app = new Silex\Application(); 
$app['autoloader']->registerNamespace('Foo', __DIR__); 
$bar = new Bar(); 
(...) 

我的酒吧類:

<?php /src/Bar.php 

namespace Foo; 

use Silex\Application; 
use Silex\ControllerProviderInterface; 
use Silex\ControllerCollection; 
use Symfony\Component\HttpFoundation\Response; 

class Bar implements ControllerProviderInterface { ... } 

當我在app.php做一個$bar = new Bar(),我得到一個錯誤:Fatal error: Class 'Moken\Classname' not found in (...)/src/app.php on line 11

誰能告訴我做錯了什麼?

回答

3

如果使用namespace Foo;必須在Foo目錄
每個命名空間部分找到這個類是在symfony的目錄

如果沒有作品,您必須證明裝載機在哪裏可以找到這個類 在Symfony2中我使用這樣的:

use Symfony\Component\ClassLoader\UniversalClassLoader; 

$loader = new UniversalClassLoader(); 
$loader->registerNamespaces(array(
    // HERE LOCATED FRAMEWORK SPECIFIED PATHS 

    // app namespaces 
    'Foo' => __DIR__ . '/../src', 
)); 
+0

甜,謝謝。我不知道我的頭在哪裏?也許咖啡太多了? –

+0

請注意,Silex仍處於開發階段,並沒有任何穩定版本。因此,最近Silex的變化(現在大量使用Composer)這個問題可能會發生, – ocornu

0

在你的主PHP文件(的index.php),你必須:

  • 聲明使用您的Controller Provider;
  • 創建應用程序對象後,您必須註冊您的名稱空間;
  • 安裝您的控制器提供程序。

例如(實施例\控制器是命名空間和XyzControllerProvider是控制器提供,該URL是/我的/示例):

[...] 
// declare the use of your Controller Provider 
use Example\Controllers\XyzControllerProvider; 
[...] 
//after creation of your Application object you must register your namespace; 
$app = Application(); 
$app['autoloader']->registerNamespace('Example', __DIR__.'/src'); 
[...] 
//mount your Controller Provider 
$app->mount('/my/example', new Example\Controllers\XyzControllerProvider()); 

控制器提供商(在src /示例/控制器)將是:

<?php 
namespace Example\Controllers; 
use Silex\Application; 
use Silex\ControllerProviderInterface; 
use Silex\ControllerCollection; 
class XyzControllerProvider implements ControllerProviderInterface { 
    public function connect(Application $app) { 
    $controllers = new ControllerCollection(); 
    $controllers->get('/', function (Application $app) { 
     return "DONE;" 
    }); 
    return $controllers; 
    } 
} 
+1

Silex自此更新以來已更新,現在聲明:「您嘗試訪問自動加載器服務。自動加載器已從Silex中刪除,建議您使用Composer來管理您的依賴關係並處理自動加載。有關更多信息,請參閱http://getcomposer.org。 要解決這個問題,請在composer.json中添加以下內容:'「autoload」:{「psr-0」:{「Example」:「src」}}' –

+0

就我自動加載器而言,我同意。我的帖子和'$ app ['autoloader'] - > registerNamespace'在幾個月前有效。 –