2015-08-08 82 views
1

我有問題讓類自動加載工作在我正在放在一起的Silex框架中。我在另一個項目中工作,但我無法弄清楚我在這裏做錯了什麼。 我的目錄看起來是這樣的:Silex和自動加載控制器類

root 
-src 
    -Controller 
     -HelloController.php 
    -app.php 
-vendor 
-web 
    -index.php 
-composer.json 

這裏是我的index.php

<?php 
$app = require __DIR__.'/../src/app.php'; 
$app->run(); 

app.php

<?php 
require_once __DIR__.'/../vendor/autoload.php'; 
$app = new Silex\Application(); 
$app['debug'] = true; 
$app->get("/hello/{name}", 'App\Controller\HelloController::hello'); 
return $app; 

HelloController.php

<?php 

namespace App\Controller; 

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

class HelloController 
{ 
    public function hello($name) 
    { 
     return new Response('<html><head></head><body><h1>Hello, '.$name.'</h1></body></html>'); 
    } 
} 

和作曲家。 json

{ 
    "require": { 
     "silex/silex": "^1.3" 
    }, 
    "autoload": { 
     "psr-4": { 
     "App\\": "/src" 
     } 
    } 
} 

每當我試着在瀏覽器中打開的index.php /你好/世界,我得到這個錯誤:

InvalidArgumentException in ControllerResolver.php line 153: 
Class "App\Controller\HelloController" does not exist 
+0

您需要註冊'服務eControllerServiceProvider',這個軟件包會自動擴展現有的'resolver'服務,你應該能夠加載你的控制器。 – Artamiel

+0

@Artamiel沒有必要。 'HelloController'不是一項服務。 http://silex.sensiolabs.org/doc/usage.html#controllers-as-classes –

+0

@ absalon.valdes - 絕對正確。這似乎不是那麼明顯的錯誤可能。我測試了提供的代碼,並且按預期工作。 – Artamiel

回答

4

psr-4不工作。前'/src'

"App\\": "./src" 

添加點或移動斜線結束

"App\\": "src/" 

或只是刪除斜槓。路徑必須是相對的。

+0

這並沒有改變任何東西。另外,我還爲另一個項目製作了具有非常類似目錄結構的工作,其中控制器位於與composer.json相同的目錄中的src文件夾內的控制器文件夾中,並且它的自動加載部分如下所示:' 「autoload」:{「{」NCBP \\「:」src /「} },'這似乎工作正常 –

+0

請運行'composer dumpautoload --optimize'並檢查'HelloController'正確地映射到'vendor/composer/autoload_classmap.php' –

+0

另外,''NCBP \\「:」src /「'與您的問題中的'composer.json'不同。 –