Как написать автозагрузчик, который позволяет приложению-арендатору перезаписывать классы из основного приложения, а также расширять их? - PullRequest
0 голосов
/ 07 февраля 2020

Я знаю, что название очень запутанное. Я понятия не имею, как объяснить мой вопрос в одном предложении.

Допустим, у меня есть приложение 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 будет жаловаться, что требуемый класс не существует.

Вы понимаете, для чего я здесь? Как бы вы решили эту проблему?

...