public function getUserById($id) {
if (Acl::allow(User::SHOW_ALL)) {
$sql = "SELECT * FROM user WHERE id = ? AND active = 1";
} else {
$sql = "SELECT * FROM user WHERE id = ?";
}
}
class Model_User extends Model {
protected $tableName = 'user';
public function __construct() {
$this->where = new WhereBuilder();
$this->where->addAnd('active=1');
}
}
$obj = new Model_User();
$obj->getWhere()->addAnd('id = ?', $id);
$obj->fetchOne();
// правда, у меня получился кривой вариант, нужно переделать
$obj->fetchOne($obj->getWhere()); //fetchOne принимает условие Where Builder
ужасно непрозрачно. Метод не должен два запроса исполнять. Выборка без active=1 и с active=1 -- это разные абсолютно запросы, никак не связанные друг с другом.кстати, это плохая практика, если юзается ORM, то её задача как раз скрыть часть реализации.
реальный запрос будет учитывать дополнительные данные, например
SELECT * FROM user WHERE id = ? AND active = 1; поэтому интерфейс должен либо вынести всё в модель
PHP:public function getUserById($id) { if (Acl::allow(User::SHOW_ALL)) { $sql = "SELECT * FROM user WHERE id = ? AND active = 1"; } else { $sql = "SELECT * FROM user WHERE id = ?"; } }
Ерунда какая-то. Не надо SQL из имен методов получать. А так, вот регулярка -как из
selectUserById - получить user и id?
/**
* Получение и установка свойств объекта через вызов магического
* метода вида:
*
* $model->(get|set)PropertyName($prop);
*
* @see __call
*/
public function __call($method_name, $argument)
{
$args = preg_split('/(?<=\w)(?=[A-Z])/', $method_name);
$action = array_shift($args);
$property_name = strtolower(implode('_', $args));
//...
И кто(где) должен тогда это условие ставить?ужасно непрозрачно. Метод не должен два запроса исполнять. Выборка без active=1 и с active=1 -- это разные абсолютно запросы, никак не связанные друг с другом.
в этом и есть смысл orm - инкапсулировать логику выборок, что позволяет решать более сложные бизнес задачи, нежели вайт-визитка. Представь, что ты спроектировал модель год назад, а затем понадобилось сделать рассылку пользователям с задолженностью, а про то, что пользователь может быть неактивным забыл. и поучаешь эпик фэйл. а так уже проблема решена на уровне конструирования архитектуры. Пэтому доктрина така толстая и имеет кучу точек входа для Слушателей, продвинутые гет-сет c мутаторами.ужасно непрозрачно. Метод не должен два запроса исполнять. Выборка без active=1 и с active=1 -- это разные абсолютно запросы, никак не связанные друг с другом.
Что значит ставить?И кто(где) должен тогда это условие ставить?
Смысл ORM в т.ч и инкапсулировать логику выборок, да. Но в данном случае ты ничего не инкапсулировал - ты усложнил код и заставил меня понимать, почему метод с явно говорящим названием getUserById обладает двойным поведением.в этом и есть смысл orm - инкапсулировать логику выборок
Совершенно верно. Контроллер проверил права доступа и вызвал либо тот, либо другой метод.с active или без - должен решать контроллер. А не модель.
Гггг, ты усложнил код, создал метод с явно говорящим названием и двойным поведением и называешь это ORM.точно так же не логично как и делать echo в контроллере или mysql_query, это будет не ORM, а квери билдер
Цитирую "с active или без - должен решать контроллер". Ну т.е. такая программерская логика - если должен решать, то может решать... а может не решатьMiksIr
Потроллить решил ?
Где я сказал, что _только_ в контроллер ? Я лишь хотел сказать, что в модели этому - нет места.
Да и что это у вас за архитектура такая? На каждый чих по нескольку десятков контроллеров ?)
Я знаю, как она выглядит - как непрозрачный геморрой. Это я о Доктрине. Кстати, а причем тут вообще доктрина?посмотри какие выгоды даёт настоящая объектность
<?
class any
{
protected $_table = "users";
/**
* Generete SQL query from magick method
* <code>
* getUserById(array $id)->
* select user From $this->_table Where id = $id[0] [AND id = $id[n]]
* </code>
* @param string $name see code exemple
* @param array $arguments array arguments list
*/
public function __call($name, $arguments) {
preg_match("#get(\w+)By(\w+)#", $name, $fields);
$strWhere = "";
foreach ($arguments as $key => $arg){
if ($key!=0) {$and = " AND ";}else{ $and="";}
$strWhere .= $and . strtolower($fields[2]) . "=" . $arg;
}
return "select ". strtolower($fields[1]) . " from ". $this->_table . " where ". $strWhere;
}
}
$any = new any;
echo $any->getUserById("1","4");