У меня есть код на основе пространства имен с папкой «Модель». Я называю свои модели статический везде в моем коде:Как я могу специализировать класс пространства имен и использовать его без изменения слишком большого кода?
\Myapp\Model\PersonModel::doSomething()
Теперь я хотел бы распространить свое применение в ряде стран, и иметь возможность переопределить некоторые особенности PersonModel для некоторых стран (и добавить модели для некоторых стран, и так далее).
у меня будет:
\MyApp\Model\France\PersonModel::doSomething()
Я хотел бы иметь возможность использовать специализированную версию, имея это в виде:
- Не модифицирующий слишком много кода
- Поддерживаю мой IDE код завершение
Одним из решений было бы специализировать каждый контроллер для каждой страны, и использовать полнофункциональные имена повсюду, но я не уверен, что это реалистично (отнимает много времени и, возможно, даже не работает).
Другим решением было бы переопределить каждую модель и добавить функцию где-нибудь, которая даст мне имя полностью квалифицированного класса (для текущей страны), но код станет уродливым, и я потеряю завершение кода.
Третьим решением будет иметь репозиторий для каждой страны и попытаться изменить все, чтобы основной код находился в подмодуле Git, а все остальное - специализированные классы ... Кажется, это лучшее решение для меня но это похоже на работу Titan, и я предпочел бы, чтобы все страны внутри одного хранилища держали вещи под контролем.
У меня нет другой идеи. Я уверен, что я не единственный с этой проблемой, но я искал и ничего не нашел. Пожалуйста, скажите, есть ли волшебная функция для пространств имен, о которых я не знал или что-то еще? :)
Edit: это частично решается
Я теперь с помощью пользовательского автозагрузчика, который будет загружать собственный класс для конкретной страны. Но все классы, относящиеся к конкретной стране, будут разделять то же самое пространство имен (что будет работать, потому что мы используем только одну страну в данный момент времени). Тем не менее, я теряю завершение кода, но это компромисс, с которым я в порядке. Если у кого-то есть решение, которое должно было бы также, позвольте сохранить код завершения, пожалуйста, не стесняйтесь отвечать!
Я пытаюсь привязать это к конкретному вопросу. Вопрос о том, как лучше всего сделать вызов '\ MyApp \ Model \ France \ PersonModel'? Если это так, вы можете использовать 'call_user_func', но это удаляет ваше автозаполнение. Однако было бы лучше, если бы во всех случаях «PersonModel» вызывать вещи в контексте экземпляра, а затем переменная '$ personModel' может поступать с фабрики, помеченной (с блоками док-станции), как возвращающая« PersonModelInterface ». Здесь статические вызовы - сложнее обобщить. – halfer
Контроллер на страну или репо на страну обычно являются (действительно) неправильными решениями. Обобщите как можно больше. – halfer
На самом деле я нашел решение самостоятельно: используя пользовательский автозагрузчик, который будет искать пользовательский класс в текущей папке страны, но пространство имен для всех стран будет таким же, что позволит мне использовать полностью квалифицированные классы. Хотя, я теряю завершение кода ... Но это компромисс, с которым я в порядке, по сравнению со стоимостью создания репо для каждой страны! –