Монтаж маршрутов Silex, необходима помощь

Я регистрирую следующие маршруты, как это:

$app->register(new HomeServiceProvider());
$app->register(new UserServiceProvider());

$app->mount('/', new HomeControllerProvider());
$app->mount('/', new UserControllerProvider());

Оба контроллера имеют такую функцию:

$controllers->get("/", 'home.controller:index')
    ->bind('homepage');

$controllers->get("/", 'user.controller:collection')
    ->bind('users');

И я могу видеть домашнюю страницу, когда я иду по следующему url:

/Testing/demo/web/index.php

ВОПРОС:

Как изменить это так, чтобы единственными маршрутами в системе были:

/Testing/demo/home
/Testing/demo/user

Я попытался изменить вышеуказанные крепления на:

$app->mount('/home', new HomeControllerProvider());
$app->mount('/user', new UserControllerProvider());

Но я просто получаю 404 для следующего:

/Testing/demo/web/index.php/home
/Testing/demo/web/index.php/user
/Testing/demo/web/home
/Testing/demo/web/user
/Testing/demo/home
/Testing/demo/user

Структура проекта:

root
-src
--Home
--User
---UserController.php
---UserControllerProvider.php
---UserModel.php
---UserRepository.php
---UserServideProvider.php
--Application.php
-web
--.htaccess
--index.php

.htaccess файл:

<IfModule mod_rewrite.c>
    Options -MultiViews

    RewriteEngine On
    RewriteBase /src
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [QSA,L]
</IfModule>

Я что-то упускаю?

РЕДАКТИРУЕТ:

// UserController.php
<?php
namespace AppUser;

use AppApplication;
use SymfonyComponentHttpFoundationRequest;
use SymfonyComponentHttpFoundationResponse;

class UserController
{
    protected $app;

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

    public function collection()
    {
        return $this->app['twig']->render('user/collection.html.twig', [
            'users' => $this->app['user.repository']->collection()
        ]);
    }
}

// UserControllerProvider.php
<?php

namespace AppUser;

use SilexApplication;
use SilexControllerProviderInterface;

class UserControllerProvider implements ControllerProviderInterface
{
    public function connect(Application $app)
    {
        $controllers = $app['controllers_factory'];
        $controllers->get("/", 'user.controller:collection')
            ->bind('user.collection');

        return $controllers;
    }
}

1 ответ

  1. У вас есть ошибка в определении контроллера в маршруте. Попробуйте изменить его на:

    $controllers->get("/", '\App\User\UserController::collection')
        ->bind('user.collection');
    

    Приложение недоступно в конструкторе контроллера. Он передается в качестве аргумента методу, который должен обработать согласованный маршрут. Попробуйте изменить контроллер на:

    class UserController
    {
        public function collection(\Silex\Application $app)
        {
            return $app['twig']->render('user/collection.html.twig', [
                'users' => $app['user.repository']->collection()
            ]);
        }
    }
    

    $app->mount(prefix, ControllerProvider) добавляет все маршруты с ControllerProviderпрефиксом prefix. Бывший.:

    class UserControllerProvider implements ControllerProviderInterface
    {
    public function connect(Application $app)
    {
        $controllers = $app['controllers_factory'];
    
        // url: /user
        $controllers->get("/", '\App\User\UserController::collection')
                    ->bind('user.collection');
    
        // url: /user/111
        $controllers->get("/111", '\App\User\UserController::somemethod')
                    ->bind('user.route111');
    
        return $controllers;
    }
    }
    
    $app->mount('/user', new UserControllerProvider())