About Tobias

Tobias is the founder of incratec.com, a Swiss-based online company.

Symfony2: InactiveScopeException and request

Error message: You cannot create a service (“request”) of an inactive scope (“request”).

[Symfony\Component\DependencyInjection\Exception\InactiveScopeException]   
You cannot create a service ("request") of an inactive scope ("request").

This message is written, when you’re invoking a command on the command line, e.g.

php app/console assetic:dump

Reason: you are using a request object, but this is not available on the command line / cli

The error was in my case that I used an object in my service configuration that references the request object (MobileDetectBundle).

Solution: remove reference for command line

Step 1 was to use a setter for the reference

Step 2 was to create a special compiler pass in the bundle configuration

Source code (based on https://github.com/suncat2000/MobileDetectBundle/commit/73e78070ca7340c9774c19dde3c8460435b0e284 – thanks suncat2000!)

<?php

namespace Acm\DemoBundle\DependencyInjection\Compiler;

use Symfony\Component\DependencyInjection\Reference;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;

/**
 * CLI listener
 */
class CLIListenerPass implements CompilerPassInterface
{
    /**
     * If CLI, when remove setMobileDetector method from definition mobile_detect.twig.extension
     * @param ContainerBuilder $container 
     */
    public function process(ContainerBuilder $container)
    {
        if (php_sapi_name() == "cli") {
            $definition = $container->getDefinition('acme_demo.extension.my_service');
            $definition->removeMethodCall('setMobileDetector');
        }
    }
}

sample code for Google Client API published

Gallery

The sample code for the Google Client API pages has been updated. It now uses the names of the new Google Client PHP API release and also switched from object – reference to arrays. Finally the source code is available … Continue reading

FastCGI, PHP, Symfony2 with basic auth not working

Just had a little issue that seams to be common in the web. Got a new server with Plesk 11 (sorry for that) and it took me nearly a day to get it working and setup for capifony deployment of Symfony2 projects.

The typical issues with not correctly set access rights for the root directory of the project (should be 755), manually editing of parameters.ini and other stuff was ok. But what nearly killed me was that my Plesk installation always returned a 503 when running PHP as apache module. FastCGI was default and seemed to be working, so I went with this.

Unfortunately this did not work with the admin interface that was running in a “virtual” subdirectory. It was not possible to login. In the background it is using the default, simple, boring and potentially unsecure basic authentification.

Did you know that there is a problem with FastCGI, Symfony2 and basic authentification? I did not, but know I know. It is fixed in the current release (2.0.16) – which is good. But unfortunately there is a RewriteRule that has to be written inside your web/.htaccess. Check the comment in src/symfony/src/Symfony/Component/HttpFoundation/ServerBag.php:

* php-cgi under Apache does not pass HTTP Basic user/pass to PHP by default
* For this workaround to work, add this line to your .htaccess file:
* RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
*
* A sample .htaccess file:
* RewriteEngine On
* RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

Unfortunately, I tried a different line that was written in the ticket above:

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization},L]

This did not work, but resulted in 401 results for all requests. Just remove the ,l which means that this .htaccess file will be left.

So if you are running a Symfony2 project with FastCGI, add this line to your web/.htaccess file:

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]