Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Был бы очень признателен, если бы в комментариях Вы поделились своими вариантами решения по внедрению паттерна DataMapper, каких-то других ORM в Yii, о своих способах решения разрастания бизнес логики в моделях ActiveRecord в Yii, о предметно-ориентированном программировании с использовании Yii
class CCotoCustQueryParameters{
function __construct()
{
$this->CUSTNO = new DBQuery\Parameters\CIntegerParameter();
}
}
class CCotoCustQueryRecordSet extends DBQuery\ResultSet\ObjectResultSet {
function __construct()
{
$this->CUST_CUSTNO = new DBQuery\Parameters\CIntegerParameter();
$this->CUST_NAME = new DBQuery\Parameters\CStringParameter();
$this->CUST_ADDR = new DBQuery\Parameters\CStringParameter();
$this->CUST_WTEL = new DBQuery\Parameters\CStringParameter();
}
}
//Объявляем источник параметров
$coto_params = new SqlSchema\Service\CCotoCustQueryParameters();
//У нас параметр всего один - заполняем его из переданных в форму параметров
$coto_params->CUSTNO->setValue($reportParams->woCOTOCustNo->getValue());
//Источник SQL - плейтнекстовый файл, унаследован от CAbstractSource
$coto_sqlsource = new DBQuery\SqlSource\CTextFileSource('service/coto_cust');
//подгружаем в текстовый файл ранее забитые переменные
$coto_sqlsource->loadObject($coto_params);
//создаем экземпляр резалтсета
$coto_resultset = new SqlSchema\Service\CCotoCustQueryRecordSet();
//Связываем источник sql и массив выходных резалтсетов (их может быть больше одного, если столько отдаёт запрос)
$coto_query = new CDBQuery($coto_sqlsource,array($coto_resultset));
//Ну и выполняем
$coto_query->ExecuteSQL();
<td><?=$rs_workorders->GRECNO->getValue()?></td>
<td><?=$rs_workorders->CREATED->format(CDateTimeParameter::PhpOutputFormatDateOnly)?></td>
<td><?=$rs_workorders->BILLD->format(CDateTimeParameter::PhpOutputFormatDateOnly)?></td>
<td style='text-align: right'><?=$rs_workorders->SUM_WORK->formatMoney()?></td>
<td style='text-align: right'><?=$rs_workorders->SUM_ITEM->formatMoney()?></td>
По поводу кеширования — у вас модель ничего и не знает о нем. Этим занимается сервисный слой который сохраняет данные. Модель вообще ничего не знает где она хранится.
Translatable — не использовал в продакшене так что не могу ничего сказать. Но ничего страшного в нем не увидел. То что нужно для DDD и т.д.
Главный плюс доктрины в том, что она вынесена целиком и полностью в сервисный слой. Это значит что вы можете без особых проблем в будущем заменить ORM скажем на ODM, не меняя при этом сами модели (или просто сменить ORM, или часть данных хранить где-то еще).
потому что это определение active record? Ну то есть если мы убираем всю бизнес логику из AR моделек, и оставляем там только тупое хранение данных и доступ к рядам таблиц через объектную прослойку — это будет уже не AR. У этого подхода есть свое имя — row data gateway, и это вполне себе норм практика.
естественно что в AR будет лежать только та бизнес логика, которая непосредственно относится к самой записи а не вообще вся бизнес логика. Это было бы глупо.
Рекомендую: Data-Context-Interaction
Как связать Yii Framework и Doctrine 2 ORM?