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