2017-02-15 10 views
0

У меня есть следующее определение класса автозагрузки в [root]/composer.json файле:Класса не найдено, композитор и Zend Framework 1 автозагрузчик вопрос

{ 
    ... 
    "autoload": { 
    "psr-0": { 
     "": [ 
     "application/models", 
     "application/controllers", 
     "application/forms", 
     "library/" 
     ] 
    }, 
    "psr-4": { 
     "": ["src/"] 
    }, 
    "classmap": [ 
     "app/AppKernel.php", 
     "app/AppCache.php" 
    ] 
    }, 
    ... 
} 

Когда я называю страницу [root]/public_html/index.php я получил следующее сообщение об ошибке:

PHP Fatal error: Uncaught Error: Class 'classes\DependencyInjection' not found in /var/www/html/application/bootstrap.php:29

Что в [root]/public_html/index.php является следующий код:

$bootstrap = true; 
require_once '../application/bootstrap.php'; 

И что в [root]/application/bootstrap.php файле:

// turn on autoloading for classes 
// composer autoloader 
include(MMIPATH.'/vendor/autoload.php'); 

// zend autoload 
require_once 'Zend/Loader/Autoloader.php'; 
Zend_Loader_Autoloader::getInstance(); 

$diContainer = new classes\DependencyInjection(services.yaml'); 
$proxy  = $diContainer->get('containerProxy'); 

Это определение [root]/library/classes/DependencyInjection.php:

use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\Config\FileLocator; 
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; 
USE Symfony\Component\DependencyInjection\Container; 

class DependencyInjection extends ContainerBuilder 
{ 
    .... 
} 

Что здесь не так? Почему автозагрузчик не может найти этот класс?

ответ

0

Вы пытаетесь загрузить пространство имен классов, однако ваш класс не определен как находящийся в пространстве имен «классы».

new classes\DependencyInjection(...) в PSR-0 нагрузок {paths}\classes\DependencyInjection.php и попытки создать экземпляр класса DependencyInjection из пространства имен classes, но DependencyInjection не в classes пространстве имен. Файл будет загружен, но класс не существует.

Вы можете добавить namespace classes; к каждому из этих классов, но это не совсем то хорошее решение. Лучшее решение - использовать правильное размещение имен или изменить список PSR-0, чтобы включить библиотеку/классы, и использовать new DependencyInjection(...). (Мое голосование за первое - используйте правильные пространства имен.)

В соответствии с запросом. Пример:

Расположение файла
{app}\library\UsefullNamespace\DependencyInjection.php

Вызов его с помощью new UsefullNamespace\DependencyInjection.php

DependencyInjection.php:

namespace UsefullNamespace; 

use [...]; 

class DependencyInjection extends ContainerBuilder 
{ 
+1

Кроме того ... не использовать ZF1, если вы не абсолютно необходимо к. Это полностью устаревшее/окончание срока службы/больше не поддерживается. –

+0

можете ли вы добавить несколько примеров? обоих решений? – ReynierPM

+0

добавлено - альтернатива на самом деле не является решением, возможно, даже не работает с PSR-0 (не уверен). Полезное пространство имен - это то, что на самом деле имеет смысл использовать для вашего приложения. –