Подтвердить что ты не робот

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');

Что я делаю неправильно? Любая помощь будет действительно оценена, поскольку я вне всех идей.

4b9b3361

Ответ 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