У меня есть проект Symfony, где я разделил свой код на два разных пакета, скажем, HomeBundle и AppBundle, однако маршруты обычно доступны внутри обоих пакетов.
например:- /home
определенные в HomeBundle также доступны из AppBundle
а также
/App
определенные в AppBundle также доступны из HomeBundle
я хочу получить доступ /home
ТОЛЬКО из HomeBundle
а также /App
только AppBundle
Я ищу «структурирование» своего кода таким образом, чтобы мне не нужно было писать какую-либо логику для достижения этой цели, но вместо этого я использую структуру фреймворков Symfony, чтобы сделать это для меня, что-то вроде ограничения маршрутизации только внутри пакета, или каким-то образом, когда определение маршрута выходит за рамки, когда находится в неправильном пакете
я использую аннотации для маршрутизации и определяется в app / config / routing.yml
редактировать: приложение требует субдоменных разделов, поэтому я также использую этот хост / по умолчанию с заполнителем
любая помощь будет оценена 🙂 спасибо
К сожалению, это невозможно, прежде всего из-за архитектуры пакетов Symfony. В то время как разделение вашего кода на пакеты полезно с когнитивной точки зрения, Symfony не имеет понятия, что нужно «входить в пакет»; какой код запускается (особенно действия вашего контроллера) обычно обрабатывается маршрутами, и маршруты должны быть скомпилированы вместе из ВСЕХ пакетов, чтобы гарантировать успешную маршрутизацию запроса.
Вы должны написать дополнительный код, чтобы выполнить то, что вы просите — моя первоначальная мысль будет вашей собственной Controller
класс (может продолжаться от FrameworkBundle\Controller\Controller
) который выполнял некоторый код перед запросом (см. документация что может достичь этого).
По сути, это архитектурное решение для вас, и мой вопрос был бы — почему вы не хотите иметь доступ /home
от AppBundle
? Будет ли работать настройка безопасности / роли или вы пытаетесь вставить код в песочницу?
РЕДАКТИРОВАТЬ После некоторых дополнительных подробностей выясняется, что требование заключается в двух разных действиях для одного и того же пути URL (например, /home
) но в разных доменах, например www.example.com/home
а также subdomain.example.com/home
, В данном случае речь шла не о совместном использовании кода, а о URL, поэтому Symfony маршрутизация на основе хоста / домена Решение сработало.
Я предполагал, что бизнес-логика внутри пакетов изолирована и не будет «осведомлена» о маршрутах, определенных внутри других пакетов, оказалось, что маршруты доступны глобально для всех пакетов, я хотел использовать среду Symfony для достижения того, что я просил потому что это происходит, поэтому нет способа сделать это. Я, вероятно, должен использовать Слушатели или перед фильтрами и т. д. для достижения этой цели. Джон Ноэль ответил на это.
К счастью для меня, комплекты работают на отдельных доменах (один на основном домене, а другой на поддомене). Я заметил это после разговора с @John Noel, он предложил сопоставить маршрут на основе хоста / домена. Я имел это на месте ранее, при втором взгляде, который я понял, я должен на основе домена перенаправить все (кроме белого списка маршрутов) маршруты на контроллер, который выдает исключение 404. Вот что я имею в виду.
Home_restrict:
path: /{slug}
host: "{domain}"defaults:
_controller: HomeBundle:Home:notfound
requirements:
domain: example.com|www.example.com
slug: ^(?!.*(admin|login)$).*
Маршруты, которые появляются в верхней части списка на странице, имеют приоритет, поэтому их следует размещать соответствующим образом.
Вы можете добавить routing.yml
за пакет и включите их в свою «глобальную» маршрутизацию:
# src/HomeBundle/Resources/config/routing.yml
home:
resource: "@HomeBundle/Controller/HomeController.php"type: annotation
а также
# src/AppBundle/Resources/config/routing.yml
home:
resource: "@AppBundle/Controller/AppController.php"type: annotation
затем импортируйте их в app/config/routing.yml
и, может быть, даже префикс там?
# app/config/routing.yml
app:
resource: "@AppBundle/Resources/config/routing.yml"prefix: /app