Ряд решений о том, как взаимодействуют отдельные части системы. Это, в основном, глобальные решения, которые тяжело изменить потом.
Архитектура — это про интерфейсы и контракты. Не про код и конкретную реализацию.
Наследование знают все. А что такое инкапсуляция и полиморфизм? Какой их смысл?
Он не построит архитектуру за вас.
Фреймворк ничего не знает об элементах вашего приложения и не может определить интерфейсы для взаимодействия этих элементов.
Но может дать начальный шаблон и инфраструктуру. В случае Yii это MVC.
basic/advanced — не догма и не шаблон полноценной архитектуры
Это проверенные варианты решения более-менее распространённых проблем. У каждого паттерна есть как плюсы, так и минусы.
Для борьбы со сложностью.
Цель — сделать понятным каждый уровень абстракции.
Хорошая архитектура — это дорого. Плохая — еще дороже.
"If you think good architecture is expensive, try bad architecture"
– Brian Foote and Joseph Yoder
Класс должен делать что-то одно.
Класс или модуль (несколько связанных классов) должен скрывать детали реализации (то есть как именно он работает внутри), но иметь чётко определённый интерфейс, который позволяет как использовать модуль или класс (public методы), так и расширять его наследованием (protected и public методы).
Принцип об иерархии и наследовании. Классическое определение очень запутанное. Можно проще.
Когда мы реализовываем новый класс, наследуясь от существующего, новый должен быть с тем же интерфейсом и вести себя абсолютно так же в тех же ситуациях. Так, чтобы программа работала, если подсунуть ей как родителя, так и наследника.
Интерфейс не должен определять больше функциональности, чем используется за один раз. Это как Single Responsibility, только для интерфейсов. Если интерфейс описывает больше одной задачи, разбиваем его на несколько интерфейсов.
Класс должен объявлять зависимости (то, что ему нужно) через интерфейсы, но никогда не получать их самостоятельно.
Зависимость классов, которые служат единой цели.
Зависимость классов, цели которых отличаются.
Cohesion - хорошо. Coupling - плохо.
Чрезмерное увлечение абстракцией может привести к тому, что каждый отдельный её уровень слишком прост, а взаимодействие уровней слишком сложно.
Исправляю одно, отваливается другое...
Тестировать.
Ключевые места хорошей архитектуры не сложно тестировать.
Архитектура зависит в большей степени от предметной области, а не от применяемых фреймворков и библиотек.
Domain Driven Design
Программист недостаточно знает автоматизируемый им процесс.
Есть человек, который знает его от и до. Это доменный эксперт.
Доменный слой не зависит ни от чего, только от PHP.