@ohshitherewegoagain
я очень хреновый программист

Подключение Twig через PHP-DI, выходит ошибка, как её исправить и что она значит?

Пытаюсь понять как работает PHP-DI и заодно пишу простой MVC-каркас, возникла одна проблема.
Я сделал Controller, все мои контроллеры (HomeController, IndexController там) extends от этого Controller, т.е это базовый контроллер в котором я хочу в конструкторе прописать добавление Twig как минимум (чтобы в HomeController например я мог писать что-то в духе $this->twig->render()), на данный момент в public/index.php у меня примерно такой код:
$containerBuilder->addDefinitions([
    \core\controller\Controller::class => create(\core\controller\Controller::class)
        ->constructor(get('TwigEnv')),
    'TwigEnv' => new \Twig\Environment(new \Twig\Loader\FilesystemLoader, [
        'cache' => dirname(__DIR__ . '/resources/cache')
    ]),
    HomeController::class => function(){
        return new HomeController(new \Twig\Environment(new \Twig\Loader\FilesystemLoader, [
            'cache' => dirname(__DIR__ . '/resources/cache')
        ]));
    },
    \Twig\Loader\FilesystemLoader::class => function(){
        return new \Twig\Loader\FilesystemLoader(dirname(__DIR__ . '/resources/views'));
    },
    \Twig\Environment::class => function(){
        return new \Twig\Environment( new \Twig\Loader\FilesystemLoader, [
           'cache' => dirname(__DIR__ . '/resources/cache')
        ]);
    }
]);

В чем тут суть: в самом начале я передаю в конструктор Controller'а сразу инстанс твига (как в доке твига в примере), потом в самом Controller в конструкторе у меня следующее:
public $twig;

    public function __construct(Environment $environment)
    {
        $this->twig = $environment;
    }


Окей, потом я обращаюсь к своему HomeController (который extends Controller):
public function index()
    {
        echo $this->twig->render('index.html');
    }


Выходит следующая ошибка:

Fatal error: Uncaught Twig\Error\LoaderError: There are no registered paths for namespace "__main__". in D:\Programs\OS\OSPanel\domains\localhost\MVC\vendor\twig\twig\src\Loader\FilesystemLoader.php:227 Stack trace: #0 D:\Programs\OS\OSPanel\domains\localhost\MVC\vendor\twig\twig\src\Loader\FilesystemLoader.php(150): Twig\Loader\FilesystemLoader->findTemplate('index.html') #1 D:\Programs\OS\OSPanel\domains\localhost\MVC\vendor\twig\twig\src\Environment.php(299): Twig\Loader\FilesystemLoader->getCacheKey('index.html') #2 D:\Programs\OS\OSPanel\domains\localhost\MVC\vendor\twig\twig\src\Environment.php(381): Twig\Environment->getTemplateClass('index.html') #3 D:\Programs\OS\OSPanel\domains\localhost\MVC\vendor\twig\twig\src\Environment.php(359): Twig\Environment->loadTemplate('index.html') #4 D:\Programs\OS\OSPanel\domains\localhost\MVC\vendor\twig\twig\src\Environment.php(318): Twig\Environment->load('index.html') #5 D:\Programs\OS\OSPanel\domains\localhost\MVC\app\Controllers\HomeController.php(17): Twig\Environment->rend in D:\Programs\OS\OSPanel\domains\localhost\MVC\vendor\twig\twig\src\Loader\FilesystemLoader.php on line 227


Также пробовал в HomeController сделать var_dump($this->twig), вышло следующее:


object(Twig\Environment)#78 (19) {
["charset":"Twig\Environment":private]=>
string(5) "UTF-8"
["loader":"Twig\Environment":private]=>
object(Twig\Loader\FilesystemLoader)#79 (4) {
["paths":protected]=>
array(0) {
}
["cache":protected]=>
array(0) {
}
["errorCache":protected]=>
array(0) {
}
["rootPath":"Twig\Loader\FilesystemLoader":private]=>
string(45) "D:\Programs\OS\OSPanel\domains\localhost\MVC\"
}
["debug":"Twig\Environment":private]=>
bool(false)
["autoReload":"Twig\Environment":private]=>
bool(false)
["cache":"Twig\Environment":private]=>
object(Twig\Cache\FilesystemCache)#80 (2) {
["directory":"Twig\Cache\FilesystemCache":private]=>
string(62) "D:\Programs\OS\OSPanel\domains\localhost\MVC\public/resources/"
["options":"Twig\Cache\FilesystemCache":private]=>
int(0)
}
["lexer":"Twig\Environment":private]=>
NULL
["parser":"Twig\Environment":private]=>
NULL
["compiler":"Twig\Environment":private]=>
NULL
["baseTemplateClass":"Twig\Environment":private]=>
string(14) "\Twig\Template"
["globals":"Twig\Environment":private]=>
array(0) {
}
["resolvedGlobals":"Twig\Environment":private]=>
NULL
["loadedTemplates":"Twig\Environment":private]=>
NULL
["strictVariables":"Twig\Environment":private]=>
bool(false)
["templateClassPrefix":"Twig\Environment":private]=>
string(15) "__TwigTemplate_"
["originalCache":"Twig\Environment":private]=>
string(61) "D:\Programs\OS\OSPanel\domains\localhost\MVC\public/resources"
["extensionSet":"Twig\Environment":private]=>
object(Twig\ExtensionSet)#81 (15) {
["extensions":"Twig\ExtensionSet":private]=>
array(3) {
["Twig\Extension\CoreExtension"]=>
object(Twig\Extension\CoreExtension)#83 (4) {
["dateFormats":"Twig\Extension\CoreExtension":private]=>
array(2) {
[0]=>
string(10) "F j, Y H:i"
[1]=>
string(7) "%d days"
}
["numberFormat":"Twig\Extension\CoreExtension":private]=>
array(3) {
[0]=>
int(0)
[1]=>
string(1) "."
[2]=>
string(1) ","
}
["timezone":"Twig\Extension\CoreExtension":private]=>
NULL
["escapers":"Twig\Extension\CoreExtension":private]=>
array(0) {
}
}
["Twig\Extension\EscaperExtension"]=>
object(Twig\Extension\EscaperExtension)#85 (4) {
["defaultStrategy":"Twig\Extension\EscaperExtension":private]=>
string(4) "html"
["escapers":"Twig\Extension\EscaperExtension":private]=>
array(0) {
}
["safeClasses"]=>
array(0) {
}
["safeLookup"]=>
array(0) {
}
}
["Twig\Extension\OptimizerExtension"]=>
object(Twig\Extension\OptimizerExtension)#87 (1) {
["optimizers":"Twig\Extension\OptimizerExtension":private]=>
int(-1)
}
}
["initialized":"Twig\ExtensionSet":private]=>
bool(false)
["runtimeInitialized":"Twig\ExtensionSet":private]=>
bool(false)
["staging":"Twig\ExtensionSet":private]=>
object(Twig\Extension\StagingExtension)#82 (5) {
["functions":"Twig\Extension\StagingExtension":private]=>
array(0) {
}
["filters":"Twig\Extension\StagingExtension":private]=>
array(0) {
}
["visitors":"Twig\Extension\StagingExtension":private]=>
array(0) {
}
["tokenParsers":"Twig\Extension\StagingExtension":private]=>
array(0) {
}
["tests":"Twig\Extension\StagingExtension":private]=>
array(0) {
}
}
["parsers":"Twig\ExtensionSet":private]=>
NULL
["visitors":"Twig\ExtensionSet":private]=>
NULL
["filters":"Twig\ExtensionSet":private]=>
NULL
["tests":"Twig\ExtensionSet":private]=>
NULL
["functions":"Twig\ExtensionSet":private]=>
NULL
["unaryOperators":"Twig\ExtensionSet":private]=>
NULL
["binaryOperators":"Twig\ExtensionSet":private]=>
NULL
["globals":"Twig\ExtensionSet":private]=>
NULL
["functionCallbacks":"Twig\ExtensionSet":private]=>
array(0) {
}
["filterCallbacks":"Twig\ExtensionSet":private]=>
array(0) {
}
["lastModified":"Twig\ExtensionSet":private]=>
int(0)
}
["runtimeLoaders":"Twig\Environment":private]=>
array(0) {
}
["runtimes":"Twig\Environment":private]=>
array(0) {
}
["optionsHash":"Twig\Environment":private]=>
string(138) "["Twig\\Extension\\CoreExtension","Twig\\Extension\\EscaperExtension","Twig\\Extension\\OptimizerExtension"]:7:2:2.11.3:0:\Twig\Template:0"
}


На эту тему я гуглил, в Stackoverflow следующее:
https://stackoverflow.com/questions/50328254/error...

Но я не понял куда именно добавить то что там предлагается в решении.

Вопрос:
1. Почему эта ошибка появляется? Вроде в psr-4 autoload который в composer.json я нужные пути прописал;
2. Правильно ли таким образом передавать инстансы? Интуитивно чувствую что пишу очень хреновый код;
3. Есть ли какой-нибудь максимально простой пример где твиг подключается через PHP-DI?
  • Вопрос задан
  • 57 просмотров
Решения вопроса 1
xEpozZ
@xEpozZ
Веб-разработчик
1. Потому что не правильно сконфигурировали контейнер, видимо.
2. Нет
3. Symfony

P.S. не нужно здесь делать new, иначе зачем нужны строчки ниже?
HomeController::class => function(){
    return new HomeController(new \Twig\Environment(new \Twig\Loader\FilesystemLoader, [
        'cache' => dirname(__DIR__ . '/resources/cache')
    ]));
},


Ловите из колбека $container и получайте инстансы, сконфигурированные ниже
HomeController::class => function(\Psr\Container\ContainerInterface $container){
    return new HomeController($container->get(\Twig\Environment::class));
},

и также в других методах
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы