Я пишу тестовое приложение 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 от чтения другого файла маршрутизации?