Хорошо, так что это не первый раз, когда я создаю службу, но я просто не могу разрешить ошибку
Вы запросили несуществующий сервис «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');
Что я делаю не так? Любая помощь будет действительно оценена, поскольку я вне всех идей.
Вы написали:
Шаги, которые я предпринял для обеспечения правильной настройки сервиса
Мой
AppBundleExtension.php
А также:
Я знаю, что AppBundleExtension не загружается, что мне нужно сделать, чтобы загрузить его? что мне не хватает?
Поэтому было ясно, что класс AppBundleExtension
не был загружен.
Согласно официальной документации, вы должны удалить Bundle
в имени файла и имени класса:
Имя равно имени пакета с суффиксом
Bundle
замененнымExtension
(например, класс расширения AppBundle будет называтьсяAppExtension
а тот, который для AcmeHelloBundle будет называтьсяAcmeHelloExtension
).
Причина, по которой я продолжал получать эту ошибку, состоял в том, что моя настройка по умолчанию для служб была 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