2014-08-28 6 views
1

Моя структура папок:Phalcon: пространство имен ошибка объявления класса

/app/config/loader.php 
/app/validation/Domain.php 

Domain.php

namespace Validation 
{ 
    use Phalcon\Validation\Validator as Validator; 

    class Email extends Validator 
    { 
     public function validate($validator, $attribute) 
     { 
      $result = parent::validate($validator,$attribute); 

      return $result; 
     } 
    } 
} 

Loader.php

$loader = new \Phalcon\Loader(); 

$loader->registerNamespaces(
    array(
     'Validation' => __DIR__ . '/../validation/' 
    ) 
); 

$loader->register(); 

echo '<pre><br/>'; 
var_dump(new Validation\Email()); 
die(); 

и он возвращает ошибку:

Fatal error: Class 'Validation\Domain\Email' not found

Что я делаю неправильно?

PS: Примером здесь http://docs.phalconphp.com/en/latest/reference/loader.html также does't работу.

// Creates the autoloader 
$loader = new \Phalcon\Loader(); 

//Register some namespaces 
$loader->registerNamespaces(
    array(
     "Example\Base" => "vendor/example/base/", 
     "Example\Adapter" => "vendor/example/adapter/", 
     "Example"   => "vendor/example/", 
    ) 
); 

// register autoloader 
$loader->register(); 

// The required class will automatically include the 
// file vendor/example/adapter/Some.php 
$some = new Example\Adapter\Some(); 

Я создал ту же структуру, и я получаю сообщение об ошибке:

Fatal error: Class 'Example\Adapter\Some' not found

+0

Кому-то, у кого такая же проблема - проверьте класс и имя файла (оно должно быть одинаковым) и проверить путь на существование. – Anthony

ответ

1

Phalcon погрузчик имеет некоторую сомнительную репутацию. Если вы используете композитор, часто будет иметь смысл использовать это для автоматической загрузки вашего собственного кода с помощью директивы autoload.

# composer.json 
{ 

    "require": { 
     "phpunit/dbunit": "*", 
     "phpunit/phpunit": "*", 
     "…": "…" 
    }, 
    "autoload": { 
     "psr-0": { 
      "": "../src" 
     } 
    } 
} 

В противном случае проблема будет с пути, убедитесь, что вы принять во внимание подпапок (где вы конфиг сидит, где загруженный код сидит, и т.д.). Кажется, вам нужно изменить 'app/validation/' на '../../app/validation/' - подумайте об этом сами. Также попробуйте установить абсолютный путь, если это не делает работу, используя __DIR__ . '../../app/validation/'.

Edit:

В вашей структуре вы говорите, у вас есть Domain.php но загрузка Domain\Email - безусловно, проблема здесь. Я также тестировал его локально, единственный экземпляр, когда работает загрузчик, - это когда предоставляется абсолютный путь (и если у вас есть файл app/validator/Domain/Email.php с классом).

$loader->registerNamespaces(
    array(
     'Validation' => __DIR__ . '/../../app/validation/' 
    ) 
); 

Совет по автозагрузчику композитора остается в силе. Обратите внимание, как вы не используете стандарт PSR-0 для своих пространств имен (validator начинается с нижней буквы, ваше пространство имен Validator начинается с капитала), что не круто ...

+0

спасибо за ваш комментарий. К сожалению, не работает - та же ошибка – Anthony

+0

Я просто попробовал ваш обновленный пример с '__DIR__. '/../../ app/validation /' 'работает как ожидалось и сбрасывает класс. Все остальные варианты приводят к тому, что 'Class 'Validation \ Domain \ Email' not found'. –

+0

И почему вы загружаете класс 'Email', если у вас есть'/app/validation/Domain.php' в вашем примере? –

Смежные вопросы