2

私はしばらくの間Silexを問題なく使用しています。新しいサービスを追加したり、基本的なサイトを作成したりすることができました。残念ながら、新しいサービスを最初から作成することに固執しています...何が間違っているのかよくわからないので、少しずつ考えました。正しい方向は今のところ役に立ちます。

私はこのような基本的な構造を持っています:

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

だから、でapp.php

use SilexExtension\CompanyPostbackServiceProvider;

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

src/autoload.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'
));

silex/vendor/Silex-extensions/src/SilexExtension/CompanyPostbackServiceProvider.php

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に属するregister関数だけになります。

何か案は?私は愚かなことをしていることを知っていますが、何らかの理由でそれはクリックされていません。

ありがとう!

4

1 に答える 1

5

まず、会社の名前空間を二重登録すると、エラーが発生する可能性がありますが、エラーが発生しない可能性があります。とにかく冗長性を削除することをお勧めします。

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

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

最後に、controllers.php で Postback を使用しようとしているとのことですが、それだけでは十分な情報ではありません。useそれに対する声明を追加しましたか?

于 2012-01-26T10:09:02.760 に答える