InvalidArgumentException в ControllerResolver в Silex

0

Я новичок в работе с каркасом и Silex, я пытаюсь работать с Silex и писать свой первый проект.

Я использую этот silex-bootstrap: https://github.com/fbrandel/silex-boilerplate

и теперь в моем app/app.php:

<?php
require __DIR__.'/bootstrap.php';

$app = new Silex\Application();
$app->register(new Silex\Provider\ServiceControllerServiceProvider());
// Twig Extension
$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path' => __DIR__.'/views',
));

// Config Extension
$app->register(new Igorw\Silex\ConfigServiceProvider(__DIR__."/config/config.yml"));

$app->get('/admin', new App\Controller\Admin\AdminDashboard());

return $app;

и в app/Controller/Admin/AdminDashboard.php:

<?php


namespace App\Controller\Admin;

use Silex\Application;
use Silex\ControllerProviderInterface;
use Silex\ControllerCollection;

class AdminDashboard implements ControllerProviderInterface {


    function __construct()
    {
        return "Dashboard";

    }

    function index()
    {
        return "Index Dashboard";
    }

    public function connect(Application $app)
    {
        return "OK";
    }


}

Когда я пытаюсь получить доступ к сайту, я получаю эту ошибку: http://localhost/project/public

InvalidArgumentException in ControllerResolver.php line 69:
Controller "App\Controller\Admin\AdminDashboard" for URI "/admin" is not callable.

Что мне делать?

Теги:
controller
silex

1 ответ

1
Лучший ответ

Вы пытаетесь использовать поставщика контроллера в качестве фактического контроллера. Это две разные вещи. Поставщик просто регистрирует контроллеры с вашим приложением silex. Ваш провайдер должен выглядеть примерно так:

namespace App\Controller\Admin;

use Silex\Application;
use Silex\ControllerProviderInterface;

class AdminDashboardProvider implements ControllerProviderInterface
{
    public function connect(Application $app)
    {
        $controllers = $app['controllers_factory']();

        $controllers->get('/', function() {
            return 'Index Dashboard';
        });

        return $controllers;
    }
}

Затем вы должны подключить этот контроллер к вашему приложению в app/app.php.

$app->mount('/admin', new AdminDashboardProvider());

Очевидно, что это не очень элегантно, когда вы получаете больше нескольких контроллеров или если ваши контроллеры становятся большими. То, что входит ServiceControllerServiceProvider. Это позволяет вашим контроллерам быть отдельными классами. Обычно я использую такой шаблон:

<?php
namespace App\Controller\Admin;

use Silex\Application;
use Silex\ControllerProviderInterface;

class AdminDashboardProvider implements ControllerProviderInterface, ServiceProviderInterface
{
    public function register(Application $app)
    {
        $app['controller.admin.index'] = $app->share(function () {
            return new AdminIndexController();
        });
    }

    public function connect(Application $app)
    {
        $controllers = $app['controllers_factory']();

        $controllers->get('/', 'controller.admin.index:get');

        return $controllers;
    }

    public function boot(Application $app)
    {
        $app->mount('/admin', $this);
    }
}

Контроллер выглядит так:

namespace App\Controller\Admin;

class AdminIndexController
{
    public function get()
    {
        return 'Index Dashboard';
    }
}

Затем вы можете зарегистрировать его в своем приложении в app/app.php например:

$app->register(new AdminDashboardProvider());

Ещё вопросы

Сообщество Overcoder
Наверх
Меню