[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Symfony конфигурация бандла через DI Service
jetistyum
Только начал разбираться с Symfony, до этого опыта не имел.
Пытаюсь передать в бандл - конфигурацию параметр из вызова метода сервиса, но получаю ошибку

Symfony Version: 2.8

ServiceNotFoundException in
CheckExceptionOnInvalidReferenceBehaviorPass.php line 58:
The service "twig" has a dependency on a non-existent service
"=service('app.service.myservice').gethellostring()".


Пример:

services.yml:

...
app.service.myService:
class: AppBundle\Service\MyService
...


config.yml:

...
twig:
globals:
helloString: "@=service('app.service.MyService').getHelloString()"
...


Если таким же образом пытаюсь передавать параметр в конфигурацию другого сервиса, все работает.
подскажите как решить данную проблему.
chee

...
twig:
globals:
helloString: "@=service('app.service.MyService').getHelloString()"
...

Такое считается нормально практикой для этого компонента или ты придумал сам такой подход?

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
jetistyum
Я пока понятия не имею как это "должно быть".
Гипотетически я нашел возможность конфигурации других сервисов таким образом, как я показал выше -там все работает. Но когда пытаюсь сделать так же для бандлов, вылетает ошибка. Предполагаю что бандлы оно конфигурирует прежде, чем сервисы. И на момент конфигурации бандла twig этого сервиса еще не существует.

Более конкретно что мне нужно: В конфиг нек-рых бандлов передать параметры которые я получу из API в рантайме.

С Symfony знаком "без году неделю", возможно пошел по неверному пути.

Invis1ble
Цитата (jetistyum @ 18.07.2017 - 17:33)
В конфиг нек-рых бандлов передать параметры которые я получу из API в рантайме.

По идее, это можно сделать в кастомном compiler pass'е (https://symfony.com/doc/current/service_container/compiler_passes.html):

namespace AppBundle;

use AppBundle\DependencyInjection\Compiler\MyCompilerPass;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Bundle\Bundle;

class AppBundle extends Bundle
{
public function build(ContainerBuilder $container)
{
parent::build($container);
$container->addCompilerPass(new MyCompilerPass());
}
}


namespace AppBundle\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;

class MyCompilerPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
$container->prependExtensionConfig('twig', [
'globals' => [
'bar' => $container->get('app.foo_service')->getBar(),
],
]);

}
}


Но в случае с конкретно твигом это не прокатывает, т.к. шаблоны, видимо, компилируются до компиляции контейнера:

Цитата
Variable "bar" does not exist.
...
<div>{{ dump(bar) }}</div>
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.