Подтвердить что ты не робот

Как зарегистрировать пространство имен с автозагрузчиком Silex

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

4b9b3361

Ответ 1

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

$app['autoloader']->registerNamespace('MyNamespace', __DIR__.'/../lib');

Ответ 2

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

Пример:

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

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

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

Ответ 3

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"
      }
  }
}

Ответ 4

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

$app = new Silex\Application();

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

Ответ 5

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