Php 在Silex中创建新的服务提供商

Php 在Silex中创建新的服务提供商,php,namespaces,autoload,silex,Php,Namespaces,Autoload,Silex,我已经使用Silex一段时间了,没有任何问题。我已经能够添加新的服务,创建基本的网站,等等。不幸的是,我现在只能从头开始创建新的服务。。。我不太确定我做错了什么,我认为现在朝着正确的方向轻推是有用的 我有这样一个基本结构: cache resources src -app.php -autoload.php -config.php -controllers.php -etc vendor -assetic -Company -src -Postba

我已经使用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
在src/autoload.php中:

在silex/vendor/silex extensions/src/silextension/CompanyPostbackServiceProvider.php中:

我尝试了几种不同的方法,但是从controller.php调用Postback会导致找不到任何类,并且声明CompanyPostbackServiceProvider的类方法只会导致属于Silex\Application的register函数

有什么想法吗?我知道我在做一些愚蠢的事情,但出于某种原因,它就是不点击


谢谢

首先,您需要双重注册公司名称空间,这可能会导致错误,也可能不会-最好还是删除冗余

其次,在供应商下编辑任何内容都不是一个好做法,比如在Silex扩展下添加了一个新类。我通常将与应用程序相关的内容放在/app bootstrap.php、config.php、appname.php中,并将类、提供者放在/src中。在本例中,提供者进入/src/Company/provider/FooProvider.php

第三,你的提供者所做的就是注册一个自动加载-你可以在你的引导中很好地完成它,没有理由创建一个提供者。如果您创建了一个服务,就需要使用它——这意味着您要经历实例化一个类并将其分配给$app中的索引的过程,请参阅几乎所有随silex提供的提供程序

最后,您提到您试图在controllers.php中使用Postback,但这还不够。您是否为其添加了使用声明

use SilexExtension\CompanyPostbackServiceProvider;

$app->register(new CompanyPostbackServiceProvider(), array(
    'company.class_path' => __DIR__ . '/../vendor/Company/src'
));
$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']
            );
        }
    }
}