web-dev-qa-db-fra.com

Symfony 3 - Vous avez demandé un service inexistant, ça me rend fou

D'accord, ce n'est donc pas la première fois que je crée le service, mais je ne peux pas résoudre l'erreur. 

Vous avez demandé un service non existant "global_settings".

Mesures que j'ai prises pour m'assurer que le service est correctement configuré

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

Mon 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>

Mon service 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));
        }


    }

Ensuite, à l'intérieur de mon contrôleur, je tente d'accéder au service à l'aide du code suivant

$data = $this->get('global_settings')->get('Paypal_email');

Qu'est-ce que je fais mal? Toute aide sera vraiment appréciée car je suis hors de toutes idées.

18
Baig

Tu as écrit:

Mesures que j'ai prises pour m'assurer que le service est correctement configuré

Mon AppBundleExtension.php

Et:

je sais que AppBundleExtension ne se charge pas, que dois-je faire pour le charger? Qu'est-ce que je rate?

Il était donc clair que la classe AppBundleExtension n'était pas chargée.

Selon la documentation officielle , vous devez supprimer Bundle dans le nom du fichier et le nom de la classe:

Le nom est égal au nom du paquet avec le suffixe Bundle remplacé par Extension (par exemple, la classe Extension de AppBundle serait appelée AppExtension et celle de AcmeHelloBundle serait appelée AcmeHelloExtension.

7
A.L

La cause de cette erreur est que mon paramètre par défaut pour les services était public: false

Donc, pour résoudre ce problème, je devais définir la propriété public sur true pour mon service.

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
19
totas

vous pouvez mettre à jour votre fichier config.yml:

importations: - {ressource: "@ AppBundle/Resources/config/services.yml"}

0
Jerome Diaz