2012-01-24 9 views
2

私はしばらくの間Silexを今まで問題なく使用してきました。私は新しいサービスを追加したり、基本的なサイトを作成したりすることができました。残念ながら、私は新しいサービスを一から作成することに固執しています...私は何が間違っているのか分からず、正しい方向性は今のところうまくいくでしょう。Silexでの新しいサービスプロバイダの作成

私はこのような基本構造を有する:app.phpで、だから、

cache 
resources 
src 
    -app.php 
    -autoload.php 
    -config.php 
    -controllers.php 
    -etc 
vendor 
    -assetic 
    -Company 
    -src 
     -Postback.php <-- The classes I need to load 
    -silex 
    -etc 
views 
web 

を:

src/autoload.php
use SilexExtension\CompanyPostbackServiceProvider; 

$app->register(new CompanyPostbackServiceProvider(), array(
    'company.class_path' => __DIR__ . '/../vendor/Company/src' 
)); 

silex/vendor/Silex-extensions/src/SilexExtension/CompanyPostbackServiceProvider.php
$loader->registerNamespaces(array(
    'Symfony'   => array(__DIR__.'/../vendor/silex/vendor', __DIR__.'/../vendor'), 
    'Silex'    => __DIR__.'/../vendor/silex/src', 
    'SilexExtension' => __DIR__.'/../vendor/Silex-extentions/src', 
    'Assetic'   => __DIR__.'/../vendor/assetic/src', 
    'Company'   => __DIR__.'/../vendor/Company/src' 
)); 

namespace SilexExtension; 

use Silex\Application; 
use Silex\ServiceProviderInterface; 

class CompanyPostbackServiceProvider implements ServiceProviderInterface 
{ 
    public function register(Application $app) 
    { 
     if (isset($app['company.class_path'])) 
     { 
      $app['autoloader']->registerNamespace(
       'Company', $app['company.class_path'] 
      ); 
     } 
    } 
} 

これはいくつかのバリエーションを試しましたが、controller.phpのPostbackを呼び出すとクラスが見つからず、CompanyPostbackServiceProviderのクラスメソッドを宣言するとSilex \ Applicationに属するレジスタ関数になります。

アイデア?私は何か愚かなことをしていることを知っているが、何らかの理由でそれは単にクリックしていない。

ありがとうございます!

答えて

5

まず、エラーを引き起こす可能性があるCompanyネームスペースを二重登録してください。とにかく、冗長性を削除する方がよいでしょう。

第2に、Silex-Extensionsの下に新しいクラスを追加したように、ベンダーの下で何かを編集することはお勧めできません。私は通常、/ app(bootstrap.php、config.php、appname.php)とクラスのプロバイダ、/ srcに自分のアプリケーション関連のものを入れます。この場合プロバイダは/src/Company/Provider/FooProvider.phpになります。

第3に、あなたのプロバイダはすべてオートロードを登録しています。あなたはブートストラップでそれを行うことはできますが、プロバイダを作成する理由はありません。サービスを作成する場合に必要です。つまり、クラスをインスタンス化して$appのインデックスに割り当てることです(ほとんどの場合、silexに付属のプロバイダを参照してください)。

最後に、あなたはcontrollers.phpでポストバックを使用しようとしていると言いますが、それは十分な情報ではありません。あなたはそれのためにuseステートメントを追加しましたか?

関連する問題