Я знаю, что название очень запутанное. Я понятия не имею, как объяснить мой вопрос в одном предложении.
Допустим, у меня есть приложение Laravel или Symfony в папке, которую я называю мастером. Это приложение может быть CMS или CRM или что-то еще. В любом случае это очень общий сервис. Но потом, когда я найду клиентов, которые захотят использовать мое приложение, у них у всех будут немного разные пожелания. Некоторые из них я могу обобщить, но некоторые из их пожеланий слишком конкретны c.
Итак, я хотел бы создать отдельную папку рядом с моей папкой master
под названием после имени моего клиента. Но давайте пока назовем эту папку tenant
. Всякий раз, когда кто-то идет на myclientsite.com
, он начинает с tenant/public/index.php
. Который будет include '../../master/public/index.php
. И тогда мастер-код будет знать, какой код клиента используется, благодаря getcwd()
.
Так что теперь я хочу сделать автозагрузчик, который работает таким образом, что всякий раз, когда я use App\Controller\PostController
, он будет на самом деле сначала посмотрите, существует ли этот контроллер в папке tenant
, и если нет, то только тогда он получит этот контроллер из папки master
.
Все это относительно легко осуществить sh. Оба файла будут иметь FQCN App\Controller\PostController
, и мой автозагрузчик просто проверяет, существует ли соответствующий файл в папке tenant
и, если да, включает его.
Теперь позвольте мне рассказать вам более сложную часть. Допустим, у меня есть master/src/Controller/PostController.php
и tenant/src/Controller/PostController.php
. Очень вероятно, что я хочу расширить PostController
мастера, потому что я могу только захотеть изменить или добавить чуть-чуть функциональности. Однако это когда пространства имен становятся проблемой. Как мне сослаться обратно на PostController
мастера изнутри PostController
арендатора? Я подумал, может быть, я мог бы сделать это:
// tenant/src/Controller/PostController.php
namespace App\Controller;
use Master\Controller\PostController as MasterPostController;
class PostController extends MasterPostController
{
}
Поскольку я думал, что я могу просто запрограммировать свой автозагрузчик так, чтобы, если FQCN начинается с Master
, то он знал, что всегда включает файл от мастера папки. Однако это не работает, потому что этот класс также использует пространство имен App\Controller
. Поэтому, даже если я найду файл и включу его, php будет жаловаться, что требуемый класс не существует.
Вы понимаете, для чего я здесь? Как бы вы решили эту проблему?