Я занимаюсь разработкой PHP CMS и у меня возник вопрос о гибкой и «расширяемой» архитектуре.
Я хочу позволить пользователям «расширять» каждый класс в системе.
Например, если у меня есть класс User
:
<?php
namespace MyCMSName\Extensions\Users;
class User
{
public function getUserAvatar()
{
// return file path, for example
}
}
Теперь я хочу сделать что-то с пользователями аватаров. Например, вернуть разные изображения для каждого пользователя.
<?php
namespace MyCMSName\Extensions\FakeUserAvatars;
class User extends MyCMSName\Extensions\Users\User
{
public function getUserAvatar()
{
// return another path
}
}
Но где-то в системе у меня есть пользовательский объект конструирования. Мне нужно создать FakeUserAvatars\User
, не оригинал Users\User
объект.
...
$user = new (? How can I determine which class to construct?)
Должен ли я создать что-то для карты «оригинальный класс → расширенный класс», а затем сгенерировать это при установке новых расширений? Затем я могу получить класс, который перегрузит оригинал и создать новый экземпляр. Но как насчет автозагрузки? Кажется, у меня должна быть пользовательская функция для загрузки каждого класса в системе, если я хочу сделать его «расширяемым».
Как вы думаете?
Извините, если я написал что-то не так, английский не мой родной язык …
Задача ещё не решена.
Других решений пока нет …