Question

Good morning,

I have been developing an application using Silex for the past couple of weeks and last night I either made a change to my code or something was updated as part of updating composer but it will not work.

I am using the 'Igorw\ConfigServiceProvider' to load up my routes which link to my configured controllers. But when I access the webpage I get the error message:

InvalidArgumentException: Unable to find controller "controllers.admin:index".

My files are as follows

composer.json

{
    "require": {
        "silex/silex": "1.2.*@dev",
        "igorw/config-service-provider": "1.2.*@dev",
        "symfony/yaml": "2.5.*@dev"
    },

    "autoload": {
        "psr-4": {
            "Turtle\\Controllers\\": "src/turtle/controllers"
        }
    }
}

config/routes.yml

config.routes:
  admin:
    pattern: /admin
    defaults: { _controller: 'controllers.admin:index' }
    method: GET

web/index.php

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use \Igorw\Silex\ConfigServiceProvider;
use \Turtle\Controllers\AdminController;

$app = new Silex\Application;

$app["debug"] = true;

// load the routes
$app -> register (new ConfigServiceProvider(__DIR__ . "/../config/routes.yml"));
foreach ($app["config.routes"] as $name => $route) {
    $app -> match($route["pattern"], $route["defaults"]["_controller"]) -> bind($name) -> method(isset($route["method"]) ? $route["method"] : "GET");
}

// register the classes
$app["controllers.admin"] = $app -> share(function($app) {
    return new AdminController($app);
});

$app -> run();

src/turtle/controllers/AdminController.php

<?php

namespace Turtle\Controllers;

use Silex\Application;
use Symfony\Component\HttpFoundation\Request;

class AdminController {

    protected $app;

    public function __construct(Application $app) {
        $this -> app = $app;
    }

    public function index (Request $request) {
        return "Hello World!";
    }

}

I have checked the $app variable and it contains an instantiated AdminController class, but for some reason the system is picking up the controller properly. I really do not understand what has happened and can only put it down to an obscure mistake or an update.

Can anyone shed any light on this please?

Thanks, Russell

Was it helpful?

Solution

I cross posted this on the Silex GitHub issue site at https://github.com/silexphp/Silex/issues/919 and the problem has been pointed out. Kudos to Dave Marshall.

The web/index.php file is not registering the Silex ServerControllerServiceProvider. After adding this in the system now works. The updated file now looks like:

<?php

require_once __DIR__ . '/../vendor/autoload.php';

use \Igorw\Silex\ConfigServiceProvider;
use \Turtle\Controllers\AdminController;

$app = new Silex\Application;

$app["debug"] = true;

$app->register(new Silex\Provider\ServiceControllerServiceProvider());

// load the routes
$app -> register (new ConfigServiceProvider(__DIR__ . "/../config/routes.yml"));
foreach ($app["config.routes"] as $name => $route) {
    $app -> match($route["pattern"], $route["defaults"]["_controller"]) -> bind($name) -> method(isset($route["method"]) ? $route["method"] : "GET");
}

// register the classes
$app["controllers.admin"] = $app -> share(function($app) {
    return new AdminController($app);
});

$app -> run();

I must have removed the line inadvertently when I was re-organising the files.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top