Рассмотрев свой вопрос, ответы и ваши ответы; Я мог бы помочь немного больше здесь (хотя сложно охватить все в одном ответе).
Я вижу, что вы ищете здесь, и, честно говоря, это то, как начинаются большинство фреймворков; создавая набор классов для обработки всего, тогда, когда они становятся более многоразовыми, они часто попадают на проверенные и проверенные шаблоны, пока, наконец, не вернутся к тому, что я сказал бы «просто еще одна инфраструктура», все они делают почти то же самое, в основном, одинаково, и стремятся быть такими же многоразовыми, как они могут - в целом, единственная разница между ними - это стили кодирования и качество - то, что они делают, почти одинаково для всех.
Я считаю, что вы нанесете немного анти-шаблона в своем дизайне здесь, чтобы объяснить. Вы сосредоточены на том, чтобы сделать большой кусок кода повторно используемым, валидацию, презентацию и т. Д. - но то, что вы Фактически (и, конечно, не обижайтесь) делает рабочий код приложения очень специфичным для домена, и не только это, но дизайн, который вы проиллюстрируете, сделает почти невозможным расширение, изменение слоев (например, сделать мобильную версию), (например, swap db vendors) и, тем не менее, потому что у вас есть уровни представления и приложений (и данных), смешанные вместе, любой дизайнер, попавший в приложение, должен будет работать и изменять код вашего приложения в то время, когда у вас есть две версии приложения, и у вас есть большая неприятная проблема tbh.
Как и большинство проблем программирования, вы можете решить эту проблему, делая три вещи:
- разработки модели предметной области.
- уточнение и разработка интерфейсов, а не беспокойство по поводу реализации.
- отделяя сквозная относится
Проектирование модели предметной области является очень важной частью программирования ОО класса на основе, если вы никогда не делали этого раньше, то сейчас самое подходящее время, это не имеет значения, является ли вам сделайте это на языке моделирования, таком как UML или просто в обычном тексте, идея состоит в том, чтобы определить все сущности в вашем домене, легко обсуждать это при написании книги при обсуждении этого вопроса, но давайте сделаем это простым. Ваша модель домена включает в себя все сущности в домене вашего приложения, каждая сущность - это вещь, думаю, пользователь, адрес, статья, продукт и т. Д., Каждый объект обычно определяется как класс (который является планом этого объекта) и каждый класс имеет свойства (например, имя пользователя, register_date и т. д.).
Class User {
public $username;
public $register_date;
}
Часто мы можем сохранить их как POPOs, однако они часто лучше мысль о том, как передача объектов (часто называемые объекты передачи данных, Value Objects) - простой план класса для объекта в домене - обычно мы стараемся чтобы их можно было переносить на любом языке, передавать между приложениями, сериализовывать и отправлять другим приложениям и тому подобное - это не обязательно, и в самом деле это не обязательно, но он затрагивает разделение в том смысле, что он обычно голый, подразумевая отсутствие функциональности, а только представление о сохранении значений. Резко контрастируйте с бизнес-объектами и классами полезности, которые на самом деле «делают» вещи, являются реализациями функциональности, а не просто владельцами ценностей.
Не обманывайте себя, хотя как наследование, так и состав также играют свою роль в модели домена, Пользователь может иметь несколько Адресов, каждый Адрес может быть адресом нескольких разных Пользователей. BillingAddress может распространять обычный адрес и добавлять дополнительные свойства и т. Д. (в стороне: что такое Пользователь, есть ли у вас Пользователь? есть ли у вас лицо с 1 * UserAccounts?).
После того, как вы получили свою модель домена, следующий шаг обычно отображает это до некоторой формы уровня персистентности (обычно это база данных), два общих способа сделать это (четко определенным образом) - с помощью ORM (например, доктрина, которая находится в симфонии, если я правильно помню), а другой способ - использовать шаблон DAO - я оставлю эту часть там, но обычно это отдельная часть системы, DAO layers имеют то преимущество, что вы укажите все методы, доступные для работы с уровнем персистентности для каждого объекта, сохраняя при этом абстрагирование реализации, таким образом вы можете обменять поставщиков баз данных без изменения кода приложения (или, как многие говорят, бизнес-правила).
Я собираюсь отправиться в серое место со следующим примером, как упоминалось ранее. Переносные объекты (наши сущности), как правило, являются обнаженными объектами, но они также часто являются хорошим местом для крепления других функций, Посмотрю, что я имею в виду.
Для иллюстрации интерфейсов, можно просто определить интерфейс для всех лиц, которые что-то вроде этого:
Interface Validatable {
function isValid();
}
то каждый из ваших объектов может осуществить это с их собственной обычной пользовательской проверки:
Class User implements Validatable {
public function isValid()
{
// custom validation here
return $boolean;
}
}
Теперь вам не нужно беспокоиться о создании некоторого запутанного способа проверки объектов, вы можете просто вызвать isValid() для любого объекта и выяснить, действительно ли это или нет.
Самое главное отметить, что, определяя интерфейс, мы отделили некоторые из проблем, поскольку никакая другая часть приложения не должна делать что-либо для проверки объекта, все, что им нужно знать, это то, что он является Validatable и вызывает метод isValid().
Однако мы перешли некоторые опасения в том, что каждый объект (экземпляр класса) теперь имеет свои собственные правила и модель проверки. Это может иметь смысл абстрагироваться это, один простой способ сделать это, чтобы сделать метод проверки статической, так что вы можете определить:
Class User {
public static function validate(User $user)
{
// custom validation here
return $boolean;
}
}
Или вы могли бы перейти к использованию методов получения и установки, это еще один очень распространенный шаблон, в котором вы можете скрыть проверку внутри сеттера, тем самым гарантируя, что каждое свойство всегда содержит достоверные данные (или значение null или значение по умолчанию).
Возможно, вы переместите валидацию в свою собственную библиотеку? Class Validate с помощью собственных методов или, может быть, вы просто поместите его в слой DAO, потому что вам нужно только что-то проверить, когда вы его сохраняете, или, может быть, вам нужно проверить, когда вы получаете данные, и когда вы это продолжаете - как вы заканчиваете это ваш звонок, и нет «лучшего способа».
Третье соображение, о котором я уже говорил, - это разделение проблем - должен ли слой настойчивости заботиться о том, как вещи, которые оно сохраняется, представлены? должна ли бизнес-логика заботиться о том, как вещи представлены? должен ли Entity заботиться о том, где и как он отображается? или должен ли слой презентации заботиться о том, как вещи представлены? Точно так же мы можем спросить, существует ли когда-нибудь один слой презентации? на одном языке? Как насчет того, как ярлык появляется в предложении, уверен, что особый пользователь и адрес имеет смысл, но вы не можете просто + s показывать списки, потому что пользователи прав, но адреса неверны;) - также у нас есть рабочие соображения, как я хочу новый дизайнер, который должен изменить код приложения, чтобы изменить представление «учетной записи пользователя» на «Учетная запись пользователя», даже если я хочу изменить код приложения в классах при запросе этого изменения?
Наконец, и просто чтобы бросить все, что я сказал, вы должны спросить себя, что я делаю здесь? Я создаю большое многоразовое приложение с потенциально многими разработчиками и долгий жизненный цикл здесь - или будет достаточно простой скрипт php для каждого представления и действия (тот, который читает $ _GET/$ _ POST, проверяет, сохраняет в db, затем отображает то, что он должен или перенаправляет туда, где он должен) - во многих, если не во всех случаях, это все, что нужно.
Помните, что PHP вызывается, когда запрос выполняется на веб-сервер, а затем отправляет ответ [end], то есть то, что происходит между вами, это ваш домен, ваша работа, клиент и пользователь обычно не делают Не волнуйтесь, и вы можете подытожить то, что вы пытаетесь сделать это просто: постройте скрипт, чтобы как можно быстрее ответить на этот запрос с ожидаемыми результатами. Вот и это не должно быть сложнее.
Чтобы быть грубым, делая все, о чем я упоминал, и многое другое - это замечательная вещь, вы научитесь загружать, лучше понимаете свою работу и т. Д., Но если вы просто хотите получить работу за дверь и иметь простой в обслуживании простой код в конце, просто создайте один сценарий для каждого представления и один за действие, с нечетным многоразовым битом (например, обработчик http, класс db, класс электронной почты и т. д.).
Вы пробовали использовать среду MVC, такую как CakePHP или CodeIgniter? Я думаю, вы найдете их интересными. – quantumSoup
@Aircule - Я посмотрел на множество фреймворков - Symfony, кажется, ближе всего, но я не признаю свою проблему выше в любом из своих примеров. – boatingcow