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

首先,您双重注册 Company 命名空间,这可能会导致错误,也可能不会 - 最好还是删除冗余。

其次,在供应商下编辑任何内容都不是一个好习惯,例如您在 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 回答