Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
Borja committed Sep 3, 2014
2 parents 36cc770 + 2929362 commit 0045b25
Show file tree
Hide file tree
Showing 9 changed files with 400 additions and 4 deletions.
5 changes: 4 additions & 1 deletion Event/Subscriber/I18n/I18nSubscriber.php
Expand Up @@ -34,7 +34,10 @@ public function __construct($defaultLocale, $wordpressI18nCookieName)
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
$locale = $request->cookies->get($this->wordpressI18nCookieName, $this->defaultLocale);
$session = $request->getSession();
$locale = $request->cookies->get($this->wordpressI18nCookieName, $session->get('_locale', $this->defaultLocale));

$session->set('_locale', $locale);
$request->setLocale($locale);
}

Expand Down
84 changes: 84 additions & 0 deletions Event/Subscriber/WordpressResponseSubscriber.php
@@ -0,0 +1,84 @@
<?php

namespace Ekino\WordpressBundle\Event\Subscriber;

use Ekino\WordpressBundle\Wordpress\Wordpress;
use Ekino\WordpressBundle\Wordpress\WordpressResponse;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;

class WordpressResponseSubscriber implements EventSubscriberInterface
{
/**
* @var string|array
*/
protected $httpHeaderCallback;

/**
* @var Wordpress
*/
protected $wordpress;

/**
* @param string|array $httpHeaderCallback
* @param Wordpress $wordpress
*/
public function __construct($httpHeaderCallback, Wordpress $wordpress)
{
$this->httpHeaderCallback = $httpHeaderCallback;
$this->wordpress = $wordpress;
}

/**
* @param FilterResponseEvent $event
*/
public function onKernelResponse(FilterResponseEvent $event)
{
$response = $event->getResponse();

if (!$response instanceof WordpressResponse || $event->getRequestType() != HttpKernelInterface::MASTER_REQUEST) {
return;
}

if (!$wp_query = $this->wordpress->getWpQuery()) {
return;
}

$callback = $this->getHttpHeadersCallback();
$wpHeaders = (array) call_user_func_array($callback, array($event->getRequest()->getUri()));

foreach ($wpHeaders as $name => $value) {
// TODO add cache headers support
if ($name == 'cache-control') {
//$response->setCache($value);
continue;
}

$response->headers->set($name, $value);
}

if ($wp_query->is_404()) {
$response->setStatusCode(404);
}
}

/**
* @return string
*/
public function getHttpHeadersCallback()
{
return $this->httpHeaderCallback;
}

/**
* {@inheritdoc}
*/
public static function getSubscribedEvents()
{
return array(
KernelEvents::RESPONSE => array('onKernelResponse'),
);
}
}
10 changes: 10 additions & 0 deletions Resources/config/hooks.xml
Expand Up @@ -4,6 +4,9 @@
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">

<parameters>
<parameter key="ekino.wordpress.response_subscriber.class">Ekino\WordpressBundle\Event\Subscriber\WordpressResponseSubscriber</parameter>
</parameters>
<services>

<service id="ekino.wordpress.event.hook.user" class="Ekino\WordpressBundle\Event\Hook\UserHookListener">
Expand All @@ -16,5 +19,12 @@
<argument type="service" id="session" />
</service>

<service id="ekino.wordpress.response_subscriber" class="%ekino.wordpress.response_subscriber.class%">
<tag name="kernel.event_subscriber" />

<argument>wp_get_http_headers</argument>
<argument type="service" id="ekino.wordpress.wordpress"/>
</service>

</services>
</container>
2 changes: 2 additions & 0 deletions Tests/Controller/WordpressControllerTest.php
Expand Up @@ -19,6 +19,8 @@
*/
class WordpressControllerTest extends \PHPUnit_Framework_TestCase
{
protected $wp_query;

/**
* @var \Ekino\WordpressBundle\Wordpress\Wordpress
*/
Expand Down
20 changes: 19 additions & 1 deletion Tests/Event/Subscriber/I18nSubscriberTest.php
Expand Up @@ -32,9 +32,18 @@ public function testOnKernelRequestNoExisingCookie()
$event = $this->getMockBuilder('Symfony\Component\HttpKernel\Event\GetResponseEvent')->disableOriginalConstructor()->getMock();
$request = $this->getMockBuilder('Symfony\Component\HttpFoundation\Request')->disableOriginalConstructor()->getMock();
$cookies = $this->getMockBuilder('Symfony\Component\HttpFoundation\ParameterBag')->disableOriginalConstructor()->getMock();
$session = $this->getMockBuilder('Symfony\Component\HttpFoundation\Session\Session')->disableOriginalConstructor()->getMock();

$request->cookies = $cookies;

$session->expects($this->once())
->method('get')
->with($this->equalTo('_locale'))
->will($this->returnValue($this->defaultLanguage));

$request->expects($this->once())
->method('getSession')
->will($this->returnValue($session));
$event->expects($this->once())
->method('getRequest')
->will($this->returnValue($request));
Expand All @@ -44,6 +53,9 @@ public function testOnKernelRequestNoExisingCookie()
->with($this->equalTo($this->cookieName), $this->equalTo($this->defaultLanguage))
->will($this->returnValue($this->defaultLanguage));

$session->expects($this->once())
->method('set')
->with($this->equalTo('_locale'), $this->equalTo($this->defaultLanguage));
$request->expects($this->once())
->method('setLocale')
->with($this->equalTo($this->defaultLanguage));
Expand All @@ -56,18 +68,24 @@ public function testOnKernelRequest()
$event = $this->getMockBuilder('Symfony\Component\HttpKernel\Event\GetResponseEvent')->disableOriginalConstructor()->getMock();
$request = $this->getMockBuilder('Symfony\Component\HttpFoundation\Request')->disableOriginalConstructor()->getMock();
$cookies = $this->getMockBuilder('Symfony\Component\HttpFoundation\ParameterBag')->disableOriginalConstructor()->getMock();
$session = $this->getMockBuilder('Symfony\Component\HttpFoundation\Session\Session')->disableOriginalConstructor()->getMock();

$request->cookies = $cookies;

$request->expects($this->once())
->method('getSession')
->will($this->returnValue($session));
$event->expects($this->once())
->method('getRequest')
->will($this->returnValue($request));

$cookies->expects($this->once())
->method('get')
->with($this->equalTo($this->cookieName), $this->equalTo($this->defaultLanguage))
->will($this->returnValue('en'));

$session->expects($this->once())
->method('set')
->with($this->equalTo('_locale'), $this->equalTo('en'));
$request->expects($this->once())
->method('setLocale')
->with($this->equalTo('en'));
Expand Down

0 comments on commit 0045b25

Please sign in to comment.