Symfony 3 - Вы запросили несуществующий сервис, который сводит меня с ума
Итак, это не первый раз, когда я создаю службу, но я просто не могу разрешить ошибку
Вы запросили несуществующий сервис "global_settings".
Шаги, которые я предпринял для обеспечения правильной настройки сервиса
Мой AppBundleExtension.php
namespace AppBundle\DependencyInjection;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\Loader;
class AppBundleExtension extends Extension
{
public function load(array $configs, ContainerBuilder $container)
{
$configuration = new Configuration();
$config = $this->processConfiguration($configuration, $configs);
$loader = new Loader\XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
$loader->load('settings.xml');
}
}
Мой settings.xml
<?xml version="1.0" encoding="UTF-8" ?>
<container
xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
<services>
<service id="global_settings" class="AppBundle\Services\GlobalSettings">
<call method="setEntityManager">
<argument type="service" id="doctrine.orm.default_entity_manager" />
</call>
</service>
</services>
</container>
Мой GlobalSettings
сервис
namespace AppBundle\Services;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityRepository;
class GlobalSettings
{
/**
* @var EntityManager
*/
protected $em;
/**
* @var EntityRepository
*/
protected $repo;
public function setEntityManager(EntityManager $em) {
$this->em = $em;
$this->repo = null;
}
/**
* @return array with name => value
*/
public function all() {
return $this->$this->getRepo()->findAll();
}
/**
* @param string $name Name of the setting.
* @return string|null Value of the setting.
* @throws \RuntimeException If the setting is not defined.
*/
public function get($name) {
$setting = $this->$this->getRepo()->findOneBy(array(
'name' => $name,
));
if ($setting === null) {
throw $this->createNotFoundException($name);
}
return $setting->getValue();
}
/**
* @param string $name Name of the setting to update.
* @param string|null $value New value for the setting.
* @throws \RuntimeException If the setting is not defined.
*/
public function set($name, $value) {
$setting = $this->$this->getRepo()->findOneBy(array(
'name' => $name,
));
if ($setting === null) {
throw $this->createNotFoundException($name);
}
$setting->setValue($value);
$this->em->flush($setting);
}
/**
* @return EntityRepository
*/
protected function getRepo() {
if ($this->repo === null) {
$this->repo = $this->em->getRepository('AppBundle:Settings');
}
return $this->repo;
}
/**
* @param string $name Name of the setting.
* @return \RuntimeException
*/
protected function createNotFoundException($name) {
return new \RuntimeException(sprintf('Setting "%s" couldn\'t be found.', $name));
}
}
Затем внутри моего контроллера я пытаюсь получить доступ к службе, используя следующий код
$data = $this->get('global_settings')->get('paypal_email');
Что я делаю неправильно? Любая помощь будет действительно оценена, поскольку я вне всех идей.
Ответы
Ответ 1
Вы писали:
Шаги, которые я предпринял для обеспечения правильной настройки сервиса
Мой AppBundleExtension.php
и
Я знаю, что AppBundleExtension не загружается, что мне нужно сделать, чтобы загрузить его? что мне не хватает?
Итак, было ясно, что класс AppBundleExtension
не был загружен.
В соответствии с официальной документацией вы должны удалить Bundle
в имени файла и имени класса:
Имя равно имени пакета с заменой суффикса Bundle
на Extension
(например, класс расширения AppBundle будет называться AppExtension
, а тот, который для AcmeHelloBundle будет называться AcmeHelloExtension
).
Ответ 2
Причина, по которой я продолжал получать эту ошибку, заключалась в том, что моя настройка по умолчанию для служб была public: false
Итак, чтобы исправить это, мне нужно было установить свойство public
в true
для моей службы
services:
# default configuration for services in *this* file
_defaults:
# automatically injects dependencies in your services
autowire: true
# automatically registers your services as commands, event subscribers, etc.
autoconfigure: true
# this means you cannot fetch services directly from the container via $container->get()
# if you need to do this, you can override this setting on individual services
public: false
my_service:
class: AppBundle\Service\MyService
public: true