13

我正在尝试使用Silex php 微框架创建扩展以进行用户身份验证,但我似乎无法让自动加载器工作。任何人都可以解释一下吗?

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

usertest
|_lib
| |_silex.phar
| |_MyNamespace
|   |_UserExtension.php
|   |_User.php
|_www
  |_index.php

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

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

use Silex\Application;
use MyNamespace\UserExtension;

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

我要加载的类看起来类似于:

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();
        });
    }
}

除了抛出这个错误之外,一切都非常简单:

Fatal error: Class 'MyNamespace\UserExtension' not found in /home/meouw/Projects/php/usertest/www/index.php on line 8

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

4

5 回答 5

60

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

例子:

{
    "require": {
        "silex/silex": "1.0.*@dev"
    },
    "autoload": {
        "psr-0": {
            "MyNameSpace": "src/"
        }
    }
}

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

您试图访问自动装载机服务。自动装载机已从 Silex 中移除。建议您使用 Composer 来管理您的依赖项并处理您的自动加载。有关详细信息,请参阅http://getcomposer.org

于 2012-07-05T06:54:23.940 回答
11
Deprecated - As of 2014-10-21 PSR-0 has been marked as deprecated.
PSR-4 is now recommended as an alternative

这就是为什么你应该在 composer.json 中使用 PSR-4 语法

{
  "require": {
      "silex/silex": "1.0.*@dev",
  },
  "autoload": {
      "psr-4": {
          "Vendor\\Namespace\\": "/path"
      }
  }
}
于 2014-11-06T11:01:02.757 回答
11

我会用

$app['autoloader']->registerNamespace('MyNamespace', __DIR__.'/../lib');
于 2011-09-29T14:20:26.433 回答
3

要注册命名空间,只需registerNamespaces()像这样调用:

$app = new Silex\Application();

$app['autoloader']->registerNamespaces(array(
    'Symfony'          => __DIR__.'/../vendor/',
    'Panda'            => __DIR__.'/../vendor/SilexDiscountServiceProvider/src',
    'Knp'              => __DIR__.'/../vendor/KnpSilexExtensions/',
    // ...
));
于 2012-04-06T04:31:42.157 回答
3

将适当的语句添加到直接调用的autoload部分和注册命名空间对我来说都不起作用,直到我在项目文件夹中执行。composer.jsonregisterNamespacecomposer update

于 2013-12-14T10:50:32.073 回答