Компонент маршрутизации Symfony не является URL-адресом маршрутизации - PullRequest
0 голосов
/ 11 сентября 2018

У меня mvc php cms, как эта структура папок:

application
---admin
--------controller
--------model
--------view
--------language
---catalog
--------controller
------------------IndexController.php
--------model
--------view
--------language
core
--------controller.php
//...more
public
--------index.php
vendor

Я устанавливаю компонент Symfony / router , чтобы получить справку по URL-адресу моего маршрута, используя composer json:

{
  "autoload": {
    "psr-4": {"App\\": "application/"}
  },
  "require-dev":{
    "symfony/routing" : "*"
  }
}

Теперь к маршрутным документам я добавляю этот код для маршрутизации в index.php:

require '../vendor/autoload.php';
use Symfony\Component\Routing\Matcher\UrlMatcher;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;

$route = new Route('/index', array('_controller' => 'App\Catalog\Controller\IndexController\index'));
$routes = new RouteCollection();
$routes->add('route_name', $route);

$context = new RequestContext('/');

$matcher = new UrlMatcher($routes, $context);

$parameters = $matcher->match('/index');

В моем IndexController у меня есть:

namespace App\Catalog\Controller;

class IndexController {

    public function __construct()
    {
        echo 'Construct';
    }


    public function index(){
        echo'Im here';
    }
}

Сейчас в действии я работаю по этому URL: localhost:8888/mvc/index и не вижу результата: Im here IndexController.

Как работает URL-адрес маршрутизации Symfony и найти контроллер в моей структуре mvc? спасибо за любую практику и помощь.

1 Ответ

0 голосов
/ 11 сентября 2018

Контекст запроса должен быть заполнен фактическим URI, попадающим в приложение.Вместо того, чтобы пытаться сделать это самостоятельно, вы можете использовать пакет HTTP Foundation из symfony для заполнения этого:

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\RequestContext;

$context = new RequestContext();
$context->fromRequest(Request::createFromGlobals());

Здесь также задокументировано: https://symfony.com/doc/current/components/routing.html#components-routing-http-foundation

После сопоставления ($parameters = $matcher->match('/index');) вы можете использовать клавишу _controller параметров для создания экземпляра контроллера и отправки действия.Мое предложение было бы заменить последний \ другим символом для легкого разделения, например App\Controller\Something::index.

. Затем вы можете сделать следующее:

list($controllerClassName, $action) = explode($parameters['_controller']);
$controller = new $controllerClassName();
$controller->{$action}();

Что должно повторитьответ у вас в классе контроллера.

...