Что не так с этим использованием автозагрузчика Silex? - PullRequest
1 голос
/ 11 ноября 2011

Файл моего приложения:

<?php // /src/app.php

require_once __DIR__ . '/../lib/vendor/Sensio/silex.phar';

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Foo\Bar;

$app = new Silex\Application(); 
$app['autoloader']->registerNamespace('Foo', __DIR__);
$bar = new Bar();
(...)

Класс моего бара:

<?php /src/Bar.php

namespace Foo;

use Silex\Application;
use Silex\ControllerProviderInterface;
use Silex\ControllerCollection;
use Symfony\Component\HttpFoundation\Response;

class Bar implements ControllerProviderInterface { ... }

Когда я делаю $bar = new Bar() в моемapp.php, я получаю сообщение об ошибке: Fatal error: Class 'Moken\Classname' not found in (...)/src/app.php on line 11

Может кто-нибудь сказать мне, что я делаю неправильно?

Ответы [ 2 ]

3 голосов
/ 11 ноября 2011

Если вы используете namespace Foo;, вы должны найти этот класс в каталоге FooКаждая часть пространства имен является каталогом в symfony

Если не работает, вы должны показать загрузчику, где найти этот класс. В symfony2 я использую для этого:

use Symfony\Component\ClassLoader\UniversalClassLoader;

$loader = new UniversalClassLoader();
$loader->registerNamespaces(array(
    // HERE LOCATED FRAMEWORK SPECIFIED PATHS

    // app namespaces
    'Foo' => __DIR__ . '/../src',
));
0 голосов
/ 09 мая 2012

В вашем основном php-файле (index.php) вы должны:

  • объявляет об использовании вашего контроллера;
  • после создания объекта Application вы должны зарегистрировать свое пространство имен;
  • смонтируйте ваш контроллер.

Например (Example \ Controllers - это пространство имен, а XyzControllerProvider - поставщик контроллеров, URL-адрес / my / example):

[...]
// declare the use of your Controller Provider
use Example\Controllers\XyzControllerProvider;
[...]
//after creation of your Application object you must register your namespace;
$app = Application();
$app['autoloader']->registerNamespace('Example', __DIR__.'/src');
[...]
//mount your Controller Provider
$app->mount('/my/example', new Example\Controllers\XyzControllerProvider());

Поставщик контроллера (в разделе src / example / controllers) будет:

<?php
namespace Example\Controllers;
use Silex\Application;
use Silex\ControllerProviderInterface;
use Silex\ControllerCollection;
class XyzControllerProvider implements ControllerProviderInterface {
  public function connect(Application $app) {
    $controllers = new ControllerCollection();
    $controllers->get('/', function (Application $app) {
      return "DONE;"
    });
    return $controllers;
  }
}
...