Как указать, какой файл маршрутизации Symfony следует использовать с несколькими ядрами - PullRequest
0 голосов
/ 18 февраля 2020

Я пишу тестовое приложение Symfony, в котором у меня есть AdminKernel и ShopKernel, поэтому у меня могут быть разные порталы. У них обоих разные файлы маршрутизации, потому что я не хочу, чтобы пользователи могли go заходить на страницы администратора. Я не хочу использовать if is_granted() в моих файлах веток, потому что я хочу, чтобы и панель администратора, и магазин работали на разных портах на моем сервере (в тестовой настройке 80 для моего магазина и 8080 для моей страницы администратора, как там в конце будет находиться прокси-сервер перед приложением, который будет получать запрос от vhost на основе порта, хотя может быть несколько доменных имен).

У меня все это работает, но когда я проверяю маршрутизацию, магазин может go к панели администратора, даже если они не должны быть.

При отладке маршрутов отображаются правильные маршруты.

Когда я набираю php bin/console debug:router product_show, который является страницей администратора в моем ShopKernel, он говорит: The route "product_show" does not exist., что хорошо.

И в AdminKernel он также работает как положено, возвращая маршрут : /product/{id}/show/.

Но когда я пытаюсь go перейти на страницу магазина в браузере и набираю localhost:80/product/9/show, она показывает страницу, а не должна.

Symfony загрузка страницы занимает довольно много времени, поэтому я подозреваю, что Symfony пытается найти маршрут, но не может, а затем использует файл маршрутизации, который я использовал для страницы администратора но я не уверен. Может ли кто-нибудь помочь мне с этим, поскольку я уже пытался найти решение, но я просто не понимаю, почему загружаются маршруты другого ядра.

Это мой ShopKernel:

class ShopKernel extends BaseKernel
{
    use MicroKernelTrait;

    private const CONFIG_EXTS = '.{php,xml,yaml,yml}';

    public function registerBundles(): iterable
    {
        $contents = require $this->getProjectDir().'/config/bundles.php';
        foreach ($contents as $class => $envs) {
            if ($envs[$this->environment] ?? $envs['all'] ?? false) {
                yield new $class();
            }
        }
    }

    public function getProjectDir(): string
    {
        return \dirname(__DIR__);
    }

    protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void
    {
        $container->addResource(new FileResource($this->getProjectDir().'/config/bundles.php'));
        $container->setParameter('container.dumper.inline_class_loader', \PHP_VERSION_ID < 70400 || $this->debug);
        $container->setParameter('container.dumper.inline_factories', true);
        $confDir = $this->getProjectDir().'/config';

        $loader->load($confDir.'/packages/*'.self::CONFIG_EXTS, 'glob');
        $loader->load($confDir.'/packages/'.$this->environment.'/*'.self::CONFIG_EXTS, 'glob');
        $loader->load($confDir.'/services'.self::CONFIG_EXTS, 'glob');
        $loader->load($confDir.'/services_'.$this->environment.self::CONFIG_EXTS, 'glob');

    }

    protected function configureRoutes(RouteCollectionBuilder $routes): void
    {
        $confDir = $this->getProjectDir().'/config/portal/shop/';

        $routes->import($confDir.self::CONFIG_EXTS, '/', 'glob');
        $routes->import($confDir.'routes.yaml', '/', 'glob');
    }
}

, и это мой AdminKernel:

<?php

namespace App;

use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\Config\Resource\FileResource;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Kernel as BaseKernel;
use Symfony\Component\Routing\RouteCollectionBuilder;



class Kernel extends BaseKernel
{
    use MicroKernelTrait;

    private const CONFIG_EXTS = '.{php,xml,yaml,yml}';

    public function registerBundles(): iterable
    {
        $contents = require $this->getProjectDir().'/config/bundles.php';
        foreach ($contents as $class => $envs) {
            if ($envs[$this->environment] ?? $envs['all'] ?? false) {
                yield new $class();
            }
        }
    }

    public function getProjectDir(): string
    {
        return \dirname(__DIR__);
    }

    protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void
    {
        $container->addResource(new FileResource($this->getProjectDir().'/config/bundles.php'));
        $container->setParameter('container.dumper.inline_class_loader', \PHP_VERSION_ID < 70400 || $this->debug);
        $container->setParameter('container.dumper.inline_factories', true);
        $confDir = $this->getProjectDir().'/config';

        $loader->load($confDir.'/{packages}/*'.self::CONFIG_EXTS, 'glob');
        $loader->load($confDir.'/{packages}/'.$this->environment.'/*'.self::CONFIG_EXTS, 'glob');
        $loader->load($confDir.'/{services}'.self::CONFIG_EXTS, 'glob');
        $loader->load($confDir.'/{services}_'.$this->environment.self::CONFIG_EXTS, 'glob');
    }

    protected function configureRoutes(RouteCollectionBuilder $routes): void
    {
        $confDir = $this->getProjectDir().'/config';

        $routeDir = "../public/admin/";

        $routes->import($confDir.'/portal/admin/*'.self::CONFIG_EXTS, '/', 'glob');
        $routes->import($confDir.'/portal/admin/'.self::CONFIG_EXTS, '/', 'glob');
    }
}

, это мой admin router.yaml:

product_index:
   path: /
   controller: App\Controller\ProductController::index

product_new:
   path: /product/new/
   controller: App\Controller\ProductController::new

product_edit:
   path: /product/{id}/edit/
   controller: App\Controller\ProductController::edit

product_show:
   path: /product/{id}/show/
   controller: App\Controller\ProductController::show

product_delete:
   path: /product/{id}/delete/
   controller: App\Controller\ProductController::delete

fos_user_security_login:
   path: /login/
   defaults: { _controller: FOSUserBundle:Security:login }

fos_user_security_check:
   path: /login_check/
   defaults: { _controller: FOSUserBundle:Security:check }

fos_user_security_logout:
   path: /logout/
   defaults: { _controller: FOSUserBundle:Security:logout }

и мой магазин route.yaml:

index:
   path: /
   controller: App\Controller\ProductController::index

product_bestel:
  path: /product/{id}/bestel
  controller: App\Controller\ProductController::addtocart

product_checkout:
   path: /product/checkout
   controller: App\Controller\ProductController::checkout

fos_user_security_login:
   path: /login/
   defaults: { _controller: FOSUserBundle:Security:login }

fos_user_security_check:
   path: /login_check/
   defaults: { _controller: FOSUserBundle:Security:check }

fos_user_security_logout:
   path: /logout/
   defaults: { _controller: FOSUserBundle:Security:logout }

Так как я могу остановить Symfony от чтения другого файла маршрутизации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...