класс не найден: рекурсивное отражение для внедрения зависимости

Я пытаюсь понять некоторую продвинутую концепцию архитектуры mvc в php, такую ​​как автозагрузка с psr-4 и контейнер внедрения зависимостей. Я создал контейнер внедрения зависимостей и загрузил классы, используя автозагрузку composer.
Всякий раз, когда я запускаю этот код, я получаю следующую ошибку:

Неустранимая ошибка: необработанное исключение «ReflectionException» с сообщением
«Классовый тест не существует» в
C: \ xampp \ htdocs \ practice \ reflections \ Container \ Container.php: 15 стеков
трассировка: # 0
C: \ XAMPP \ HTDOCS \ практика \ отражение \ Container \ Container.php (15):
ReflectionClass -> __ construct (‘Test’) # 1
C: \ XAMPP \ HTDOCS \ практика \ отражение \ index.php (9):
Контейнер \ Container :: newInstanceOf (‘Test’) # 2 {main} добавлен
C: \ XAMPP \ HTDOCS \ практика \ отражение \ Container \ Container.php

Похоже, что Container.php не получает классов из каталога контроллера. Я не смог выяснить причину этой проблемы.

Моя структура каталогов выглядит следующим образом:

-reflection Directory
-Controller folder
-Test.php
-Test2.php
-Container Directory
-Container.php
-vendor Directory
-index.php

index.php:

require 'vendor/autoload.php';

use Container\Container;
use Controller\Test;
use Controller\Test2;

$test = Container::newInstanceOf('Test');

$test->testHi();

Container.php:

namespace Container;

class Container
{

public static function newInstanceOf($class)
{

$reflection = new \ReflectionClass($class);

$constructor = $reflection->getConstructor();

if ( ! $constructor)
{

return new $class;

}
$params = $constructor->getParameters();

if (count($params) === 0)
{

return new $class;

}

$newInstanceParams = [];

foreach($params as $param)
{
if(is_null($param->getClass()))
{
$newInstanceParam[] = null;

continue;
}

$newInstanceParams[] = self::newInstanceOf($param->getClass()->getName());

}

return $reflection->newInstanceArgs($newInstanceParams);

}

}

Test.php:

namespace Controller;

class Test
{

private $test2;

public function __construct(Test2 $test2)
{

$this->test2 = $test2;

}
public function testHi()
{
$this->test2->test2Hi();

}}

Test2.php:

namespace Controller;

class Test2
{

public function __construct()
{

}

public function test2Hi()
{
echo 'hi from test 2 !';
}
}

Composer.json:

{
"autoload":{

"psr-4":{
"Controller\\" : "Controller",
"Container\\"  : "Container"
}

}

}

1

Решение

Измените строку:

$test = Container::newInstanceOf('Test');

чтобы:

$test = Container::newInstanceOf('Controller\Test');
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector