服务不存在? Symfony 2

时间:2013-12-02 16:51:03

标签: symfony service

我正在努力让这个简单的通知服务工作,我根本没有快乐。我以前从未在symfony中使用过服务,所以我可以忽略一些非常基本的东西,但这对我来说似乎都是正确的所以我有点在这里撞墙。

我已经包含了与服务有关的一切,非常感谢帮助!

堆栈追踪:

[1] Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException: You have requested a non-existent service "game.notify".
    at n/a
        in D:\web\www\mygame\app\bootstrap.php.cache line 1968

    at Symfony\Component\DependencyInjection\Container->get('game.notify')
        in D:\web\www\mygame\vendor\symfony\symfony\src\Symfony\Bundle\FrameworkBundle\Controller\Controller.php line 252

    at Symfony\Bundle\FrameworkBundle\Controller\Controller->get('game.notify')
        in D:\web\www\mygame\src\Game\MainBundle\Controller\PageController.php line 10

    at Game\MainBundle\Controller\PageController->indexAction()
        in  line 

    at call_user_func_array(array(object(PageController), 'indexAction'), array())
        in D:\web\www\mygame\app\bootstrap.php.cache line 2843

    at Symfony\Component\HttpKernel\HttpKernel->handleRaw(object(Request), '1')
        in D:\web\www\mygame\app\bootstrap.php.cache line 2817

    at Symfony\Component\HttpKernel\HttpKernel->handle(object(Request), '1', true)
        in D:\web\www\mygame\app\bootstrap.php.cache line 2946

    at Symfony\Component\HttpKernel\DependencyInjection\ContainerAwareHttpKernel->handle(object(Request), '1', true)
        in D:\web\www\mygame\app\bootstrap.php.cache line 2248

    at Symfony\Component\HttpKernel\Kernel->handle(object(Request))
        in D:\web\www\mygame\web\app_dev.php line 28

通知控制人:

位于:Game / MainBundle / Controller / NotifyController.php

<?php
namespace Game\MainBundle\Controller;

class NotifyController
{
    private $defaults
        = array(
            "type" => "flash",
        ),
        $flashes = array();
    /**
    * @param \Symfony\Component\HttpFoundation\Session\Session $session
    */
    public function __construct(\Symfony\Component\HttpFoundation\Session\Session $session)
    {
        $this->session = $session;
    }
    /**
    * Depending on the supplied type argument, add the values
    * to the session flashBag or $this->flashes
    *
    * @param string $name
    * @param array $arguments
    */
    public function add($name, array $arguments = array())
    {
        $arguments += $this->defaults;
        // If the type is flash then add the values to the session flashBag
        if ($arguments["type"] === "flash") {
            $this->session->getFlashBag()->add($name, $arguments);
        }
        // Otherwise if its instant then add them to the class variable $flashes
        elseif ($arguments["type"] === "instant") {
            // We want to be able to have multiple notifications of the same name i.e "success"
            // so we need to add each new set of arguments into an array not overwrite the last
            // "success" value set
            if (!isset($this->flashes[$name])) {
                $this->flashes[$name] = array();
            }
            $this->flashes[$name][] = $arguments;
        }
    }

    /**
    * Check the flashBag and $this->flashes for existence of $name
    *
    * @param $name
    *
    * @return bool
    */
    public function has($name)
    {
        if($this->session->getFlashBag()->has($name)){
            return true;
        } else {
            return isset($this->flashes[$name]);
        }
    }
    /**
    * Search for a specific notification and return matches from flashBag and $this->flashes
    *
    * @param $name
    *
    * @return array
    */
    public function get($name)
    {
        if($this->session->getFlashBag()->has($name) && isset($this->flashes[$name])){
            return array_merge_recursive($this->session->getFlashBag()->get($name), $this->flashes[$name]);
        } elseif($this->session->getFlashBag()->has($name)) {
            return $this->session->getFlashBag()->get($name);
        } else {
            return $this->flashes[$name];
        }
    }
    /**
    * Merge all flashBag and $this->flashes values and return the array
    *
    * @return array
    */
    public function all()
    {
        return array_merge_recursive($this->session->getFlashBag()->all(), $this->flashes);
    }

}

NotifyExtension.php

位于:Game / MainBundle / DependencyInjection / NotifyExtension.php

<?php

namespace Game\MainBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader;

/**
 * This is the class that loads and manages your bundle configuration
 *
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
 */
class NotifyExtension extends Extension
{
    /**
     * {@inheritDoc}
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');
    }
}

的configuration.php

位于:Game / MainBundle / DependencyInjection / Configuration.php

<?php

namespace Game\MainBundle\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

/**
 * This is the class that validates and merges configuration from your app/config files
 *
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html#cookbook-bundles-extension-config-class}
 */
class Configuration implements ConfigurationInterface
{
    /**
     * {@inheritDoc}
     */
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('game_main');

        // Here you should define the parameters that are allowed to
        // configure your bundle. See the documentation linked above for
        // more information on that topic.

        return $treeBuilder;
    }
}

Services.yml 位于:Game / MainBundle / Resources / Config / services.yml

parameters:
    game.notify.class:  Game\MainBundle\Controller\NotifyController

services:
    game.notify:
        class: "%game.notify.class%"
        arguments:
            session: @session

PageController.php

位于:Game / MainBundle / Controller / PageController.php

<?php
namespace Game\MainBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class PageController extends Controller
{
    public function indexAction()
    {
        $notify = $this->get("game.notify");
        $notify->add("test", array("type" => "instant", "message" => "This is awesome"));
        if ($notify->has("test")) {
            return array("notifications" => $notify->get("test"));
        }
        return $this->render('GameMainBundle:Page:index.html.twig');
    }
}

1 个答案:

答案 0 :(得分:2)

根据您对我的第一条评论的回答,由于未遵循您的扩展程序的命名约定,您的服务似乎永远不会被加载。

如果您的捆绑包有GameMainBundle,那么您的扩展程序应该有GameMainExtension。

此处有更多信息:http://symfony.com/doc/current/cookbook/bundles/best_practices.html

一旦你加载了services.yml,你可能仍会遇到一些问题。将您的服务称为控制器有点不合标准。但看看会发生什么。