How to give container as argument to services How to give container as argument to services symfony symfony

How to give container as argument to services


It's easy, if service extends ContainerAware

use \Symfony\Component\DependencyInjection\ContainerAware;class YouService extends ContainerAware{    public function someMethod()     {        $this->container->get('router')->generate('fos_user_profile_edit')         ...    }}

service.yml

  your.service:      class: App\...\YouService      calls:          - [ setContainer,[ @service_container ] ]


Add:

<argument type="service" id="service_container" />

And in your listener class:

use Symfony\Component\DependencyInjection\ContainerInterface;//...public function __construct(ContainerInterface $container, ...) {


It's 2016, you can use trait which will help you extend same class with multiple libraries.

<?phpnamespace iBasit\ToolsBundle\Utils\Lib;use Doctrine\Bundle\DoctrineBundle\Registry;use Symfony\Component\DependencyInjection\ContainerInterface;trait Container{    private $container;    public function setContainer (ContainerInterface $container)    {        $this->container = $container;    }    /**     * Shortcut to return the Doctrine Registry service.     *     * @return Registry     *     * @throws \LogicException If DoctrineBundle is not available     */    protected function getDoctrine()    {        if (!$this->container->has('doctrine')) {            throw new \LogicException('The DoctrineBundle is not registered in your application.');        }        return $this->container->get('doctrine');    }    /**     * Get a user from the Security Token Storage.     *     * @return mixed     *     * @throws \LogicException If SecurityBundle is not available     *     * @see TokenInterface::getUser()     */    protected function getUser()    {        if (!$this->container->has('security.token_storage')) {            throw new \LogicException('The SecurityBundle is not registered in your application.');        }        if (null === $token = $this->container->get('security.token_storage')->getToken()) {            return;        }        if (!is_object($user = $token->getUser())) {            // e.g. anonymous authentication            return;        }        return $user;    }    /**     * Returns true if the service id is defined.     *     * @param string $id The service id     *     * @return bool true if the service id is defined, false otherwise     */    protected function has ($id)    {        return $this->container->has($id);    }    /**     * Gets a container service by its id.     *     * @param string $id The service id     *     * @return object The service     */    protected function get ($id)    {        if ('request' === $id)        {            @trigger_error('The "request" service is deprecated and will be removed in 3.0. Add a typehint for Symfony\\Component\\HttpFoundation\\Request to your controller parameters to retrieve the request instead.', E_USER_DEPRECATED);        }        return $this->container->get($id);    }    /**     * Gets a container configuration parameter by its name.     *     * @param string $name The parameter name     *     * @return mixed     */    protected function getParameter ($name)    {        return $this->container->getParameter($name);    }}

Your object, which will be service.

namespace AppBundle\Utils;use iBasit\ToolsBundle\Utils\Lib\Container;class myObject{    use Container;}

Your service settings

 myObject:         class: AppBundle\Utils\myObject        calls:            - [setContainer, ["@service_container"]]

Call your service in controller

$myObject = $this->get('myObject');