Ste*_*ams 2 php namespaces autoload silex
我一直在使用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
Run Code Online (Sandbox Code Playgroud)
所以,在app.php:
use SilexExtension\CompanyPostbackServiceProvider;
$app->register(new CompanyPostbackServiceProvider(), array(
'company.class_path' => __DIR__ . '/../vendor/Company/src'
));
Run Code Online (Sandbox Code Playgroud)
在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'
));
Run Code Online (Sandbox Code Playgroud)
在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']
);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了几种变体,但是从controller.php调用Postback导致没有找到类,并且声明CompanyPostbackServiceProvider的类方法只导致属于Silex\Application的寄存器函数.
有任何想法吗?我知道我做了一些愚蠢的事,但由于某种原因它只是没有点击.
谢谢!
首先,您双重注册公司名称空间,这可能会导致错误,可能不会 - 最好还是删除冗余.
其次,在供应商下编辑任何东西都不是一个好习惯,比如在Silex-Extensions下添加了一个新类.我通常将我的应用程序相关内容放在/ app(bootstrap.php,config.php,appname.php)和/ src中的类,提供程序中.在这种情况下,您提供者进入/src/Company/Provider/FooProvider.php.
第三,您的所有提供商都注册了自动加载 - 您可以在引导程序中完成,没有理由创建提供程序.如果你创建一个服务就需要它 - 这意味着你要经历一个实例化一个类并将它分配给一个索引的过程$app(参见几乎所有随silex提供的提供者).
最后,你提到你试图在controllers.php中使用Postback,但这还不够.你use为它添加了一个声明吗?
| 归档时间: |
|
| 查看次数: |
2870 次 |
| 最近记录: |