Эти методы имеют как преимущества, так и недостатки.
Я разрабатываю приложение среднего размера, используя Yii.
Yii принял шаблон AR и поддерживает его по умолчанию. Преимущества использования шаблона репозитория предельно ясны, но вопрос в том, должен ли я действительно тратить время на реализацию шаблона репозитория в сочетании с Yii?
Также я хотел бы узнать ваше мнение об этих двух шаблонах. Я также хотел бы знать, почему AR так популярен и так часто используется? На мой взгляд, шаблон репозитория является более гибким, более тестируемым, имеет более чистый код и лучше интегрируется в корпоративное приложение.
Должен ли я продолжать использовать шаблон AR с Yii?
Я также думаю о переходе от Yii к Laravel. В этот момент я не потеряю большую часть своей работы, занимаясь этим.
Что касается меня, ActiveRecord довольно хорош в небольших проектах, но для средних и больших приложений его сложно поддерживать.
В случае Yii слишком много логики сконцентрировано в модельных классах AR:
Это делает код:
Когда приложение становится достаточно большим, необходим дополнительный слой между контроллером и моделью AR. Репозиторий — отличный выбор. Что касается меня, я начал использовать репозиторий в Laravel, но теперь я использую его и в Yii 1/2.
На самом деле проблема не в реализации репозитория в Yii. AR Yii очень похож на Eloquent в Laravel. Гораздо сложнее заставить всех членов команды не работать с AR напрямую, а вместо этого использовать репозитории.
Если у вас есть опыт в Laravel, я рекомендую его использовать.
Это зависит от типа вашего приложения:
Комплексное бизнес-приложение (домен) стоит усилий для хранилища по следующим причинам:
Небольшие приложения (в основном CRUD) просто пойти с активным хранилищем записей может перебить.
Я использую активную запись Yii2, оформленную в реализации репозитория, в действительности с Yii2 вы можете иметь реальную реализацию репозитория, потому что вы можете использовать ActiveQuery вместо самого класса ActiveRecord, ActiveQuery может возвращать необработанные данные массива:
namespace app\clean\infrastructure;
class ActiveRepository implements ActiveRepositoryInterface
{
protected $activeRecordClass;
protected $query;
protected $factory;
function __construct($activeRecordClass)
{
$this->query = new ActiveQuery($activeRecordClass);
$this->factory = new TheEntityFactoy;
}
public function findAll(){
$data = $this->query->asArray()->all();
return $this->factory->create($data);
}}