Как зарегистрировать пространство имен в автозагрузчике Silex? - PullRequest
13 голосов
/ 31 мая 2011

Я экспериментирую с созданием расширения с помощью Silex php micro framework для аутентификации пользователей, но не могу заставить работать автозагрузчик.Кто-нибудь может пролить свет?

У меня есть структура каталогов, подобная этой (усеченная)

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

Соответствующие биты index.php, который служит в качестве начальной загрузки и фронт-контроллера выглядят какthis:

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 и успешно следовал инструкциям по настройке универсального загрузчика классов , но в этом случае я в тупике.Я что-то пропустил?Любая помощь будет оценена.

Ответы [ 5 ]

60 голосов
/ 05 июля 2012

В последних версиях Silex автозагрузчик устарел, и вы должны зарегистрировать все свои пространства имен через файл composer.json, который, imo, является более удачным решением, поскольку вы централизуете свои определения автозагрузки.

Пример:

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

Фактически, когда вы пытаетесь получить доступ к автозагрузчику в любой недавней версии Silex, выдается следующее исключение RuntimeException:

Вы пытались получить доступ к службе автозагрузчика.Автозагрузчик удален из Silex.Рекомендуется использовать Composer для управления зависимостями и обработки автозагрузки.См. http://getcomposer.org для получения дополнительной информации.

11 голосов
/ 06 ноября 2014
Deprecated - As of 2014-10-21 PSR-0 has been marked as deprecated.
PSR-4 is now recommended as an alternative

Вот почему вы должны использовать синтаксис PSR-4 в composer.json

{
  "require": {
      "silex/silex": "1.0.*@dev",
  },
  "autoload": {
      "psr-4": {
          "Vendor\\Namespace\\": "/path"
      }
  }
}
11 голосов
/ 29 сентября 2011

Я бы использовал

$app['autoloader']->registerNamespace('MyNamespace', __DIR__.'/../lib');
3 голосов
/ 14 декабря 2013

И добавление соответствующего оператора в раздел autoload в composer.json, и регистрация пространств имен, напрямую вызывающих registerNamespace, не работали для меня, пока я не выполнил composer update в папке проектов.

3 голосов
/ 06 апреля 2012

Чтобы зарегистрировать пространства имен, просто позвоните registerNamespaces() следующим образом:

$app = new Silex\Application();

$app['autoloader']->registerNamespaces(array(
    'Symfony'          => __DIR__.'/../vendor/',
    'Panda'            => __DIR__.'/../vendor/SilexDiscountServiceProvider/src',
    'Knp'              => __DIR__.'/../vendor/KnpSilexExtensions/',
    // ...
));
...