PHP has a function to get the visitors browser information. It will return a
lot of information and you can read more about it at
php.net/get_browser . In this example I will show
you how to set this up in your symfony2 project without the need to edit your
php.ini file.
First you need to install
garetjax/phpbrowscap
php composer.phar require garetjax/phpbrowscap:dev-master
The above command will install the code needed.
Next up, we want to hook into the kernel.request
event so we can add some
extra information.
<?php
// src/Acme/AppBundle/EventListener/RequestListener.php
namespace Acme\AppBundle\EventListener ;
use Symfony\Component\DependencyInjection\ContainerInterface ;
use Symfony\Component\DependencyInjection\ContainerAware ;
use Symfony\Component\HttpKernel\Event\GetResponseEvent ;
use phpbrowscap\Browscap ;
/**
* This class will listen for the kernel.request event and add some extra attributes
* to the request related to the browser.
*/
class RequestListener extends ContainerAware
{
/**
* @var ContainerInterface
*/
protected $container ;
/**
*/
public function __construct ( ContainerInterface $container )
{
$this -> container = $container ;
}
/**
* @param GetResponseEvent $event
*/
public function onKernelRequest ( GetResponseEvent $event )
{
$bc = new Browscap ( $this -> container -> getParameter ( 'kernel.cache_dir' ));
$event -> getRequest () -> attributes -> set ( '_browser' , $bc -> getBrowser ());
}
}
Now for the services.xml file
<!-- src/Acme/AppBundle/Resources/config/services.xml -->
<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= "acme_app.request_listener" class= "Acme\AppBundle\EventListener\RequestListener" >
<argument type= "service" id= "service_container" />
<tag name= "kernel.event_listener" event= "kernel.request" method= "onKernelRequest" />
</service>
</services>
</container>
That’s all the code that is required. Now let’s look at an example of how to
get the information from the controller.
<?php
// src/Acme/AppBundle/Controller/DefaultController.php
namespace Acme\AppBundle\Controller ;
use Symfony\Bundle\FrameworkBundle\Controller\Controller ;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route ;
class DefaultController extends Controller
{
/**
* @Route("/", name="homepage")
*/
public function indexAction ()
{
$browser = $this -> getRequest () -> attributes -> get ( '_browser' );
die ( var_dump ( $browser ));
}
}
Here’s what it looks like in the profiler.
References and Resources
https://github.com/GaretJax/phpbrowscap/wiki/QuickStart
http://php.net/get_browser
http://symfony.com/doc/master/book/internals.html#kernel-request-event
http://symfony.com/doc/master/reference/dic_tags.html#kernel-event-listener