如何使用Silex自动加载器注册命名空间

meo*_*ouw 13 php symfony silex

我正在尝试使用Silex php微框架创建扩展以进行用户身份验证,但我似乎无法使自动加载器工作.谁能摆脱任何光明?

我有这样的目录结构(截断)

usertest
|_lib
| |_silex.phar
| |_MyNamespace
|   |_UserExtension.php
|   |_User.php
|_www
  |_index.php
Run Code Online (Sandbox Code Playgroud)

index.php的相关位,用作引导程序和前端控制器,如下所示:

require '../lib/silex.phar';

use Silex\Application;
use MyNamespace\UserExtension;

$app = new Application();
$app['autoloader']->registerNamespace( 'MyNamespace', '../lib' );
$app->register( new UserExtension() );
Run Code Online (Sandbox Code Playgroud)

我正在尝试加载的类看起来类似于:

namespace MyNamespace;

use Silex\Application;
use Silex\ExtensionInterface;

class UserExtension implements ExtensionInterface {
    public function register( Application $app ) {
        $app['user'] = $app->share( function() use( $app ) {
            return new User();
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

一切都很直接,除了它抛出这个错误:

Fatal error: Class 'MyNamespace\UserExtension' not found in /home/meouw/Projects/php/usertest/www/index.php on line 8
Run Code Online (Sandbox Code Playgroud)

我已经涉足了symfony2,并成功地遵循了设置通用类加载器的说明,但在这种情况下,我很难过.我错过了什么吗?任何帮助,将不胜感激.

Chr*_*isR 60

在Silex的最新版本中,自动加载器已弃用,您应该通过composer.jsonimo是一个更好的解决方案的文件注册所有命名空间,因为您正在集中自动加载定义.

例:

{
    "require": {
        "silex/silex": "1.0.*@dev"
    },
    "autoload": {
        "psr-0": {
            "MyNameSpace": "src/"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

实际上,当您尝试在任何最新版本的Silex中访问自动加载器时,会抛出以下RuntimeException:

您试图访问自动加载器服务.自动加载器已从Silex中删除.建议您使用Composer来管理依赖项并处理自动加载.有关更多信息,请访问http://getcomposer.org.


mal*_*teo 11

我用了

$app['autoloader']->registerNamespace('MyNamespace', __DIR__.'/../lib');
Run Code Online (Sandbox Code Playgroud)

  • 在最新版本的Silex中不推荐使用自动加载器,请参阅[我的回答](http://stackoverflow.com/a/11339189/187018)进行更新. (9认同)

Rob*_*ert 11

Deprecated - As of 2014-10-21 PSR-0 has been marked as deprecated.
PSR-4 is now recommended as an alternative
Run Code Online (Sandbox Code Playgroud)

这就是你应该在composer.json中使用PSR-4语法的原因

{
  "require": {
      "silex/silex": "1.0.*@dev",
  },
  "autoload": {
      "psr-4": {
          "Vendor\\Namespace\\": "/path"
      }
  }
}
Run Code Online (Sandbox Code Playgroud)