Domanda

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

È stato utile?

Soluzione

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top