Опять я путаюсь с регулярками(

AmdY

Пью пиво
Команда форума
кстати, это плохая практика, если юзается 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 = ?";
    }
}
либо позволять накапливать условие
PHP:
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
p.s. Никогда не думал, что из-за неудобного кресла можно допускать столько очепяток. Нуно покупать другое, помнится HraKK где-то давал экспертную оценку, какое кресло удобное.
 

MiksIr

miksir@home:~$
Какая-то демоническая магия ваще-то пошла уже
/^select(\w+)by(\w+)$/
 
  • Like
Реакции: AmdY

Духовность™

Продвинутый новичок
кстати, это плохая практика, если юзается 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 = ?";
    }
}
ужасно непрозрачно. Метод не должен два запроса исполнять. Выборка без active=1 и с active=1 -- это разные абсолютно запросы, никак не связанные друг с другом.
 

Духовность™

Продвинутый новичок
как из

selectUserById - получить user и id?
Ерунда какая-то. Не надо SQL из имен методов получать. А так, вот регулярка -
PHP:
    /**
     * Получение и установка свойств объекта через вызов магического
     * метода вида:
     *
     * $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));
//...
 

AmdY

Пью пиво
Команда форума
ужасно непрозрачно. Метод не должен два запроса исполнять. Выборка без active=1 и с active=1 -- это разные абсолютно запросы, никак не связанные друг с другом.
в этом и есть смысл orm - инкапсулировать логику выборок, что позволяет решать более сложные бизнес задачи, нежели вайт-визитка. Представь, что ты спроектировал модель год назад, а затем понадобилось сделать рассылку пользователям с задолженностью, а про то, что пользователь может быть неактивным забыл. и поучаешь эпик фэйл. а так уже проблема решена на уровне конструирования архитектуры. Пэтому доктрина така толстая и имеет кучу точек входа для Слушателей, продвинутые гет-сет c мутаторами.
 

cDLEON

Онанист РНРСlub
AmdY
с active или без - должен решать контроллер. А не модель.
У модели попросили - модель отдала. А у тебя получается, что в модели появляется магия, которая в свою очередь(магия), должна быть ещё и инициализирована.
ИМХО - нарушается принцип ООП - инкапсуляция.
 

MiksIr

miksir@home:~$
Ага, во все несколько десятков контроллеров. Пихать. И еще туда же в каждый несколько if-ов так как может потребоваться выборка и с active и без и т.п.
Мы это в датамапер пихали... так к слову.
 

AmdY

Пью пиво
Команда форума
cDLEON
как нарушается, модель остаётся чёрным ящиком, даже становится ещё чернее за счёт внутренней магии. но это гарантирует нам целостность и верность данных, потому что всё зависит от модели, а не размывается между моделью и контроллером.
указывать всё это в контроллере тоже самое что просто писать
точно так же не логично как и делать echo в контроллере или mysql_query, это будет не ORM, а квери билдер
 

Духовность™

Продвинутый новичок
И кто(где) должен тогда это условие ставить?
Что значит ставить?
Если вам нужен метод получающий пользователей по ID и с ACTIVE=1 то создайте такой метод - findActiveUserById(). Если нужно без ACTIVE, создайте метод findUserById(). Чётко и ясно.

в этом и есть смысл orm - инкапсулировать логику выборок
Смысл ORM в т.ч и инкапсулировать логику выборок, да. Но в данном случае ты ничего не инкапсулировал - ты усложнил код и заставил меня понимать, почему метод с явно говорящим названием getUserById обладает двойным поведением.

с active или без - должен решать контроллер. А не модель.
Совершенно верно. Контроллер проверил права доступа и вызвал либо тот, либо другой метод.
 

cDLEON

Онанист РНРСlub
MiksIr
Потроллить решил ? :)
Где я сказал, что _только_ в контроллер ? Я лишь хотел сказать, что в модели этому - нет места.
Да и что это у вас за архитектура такая? На каждый чих по нескольку десятков контроллеров ? :))
AmdY
Ну как тебе сказать... Я от модели хочу получить юзера. Просто юзера. А про состояние твоего ACL я вообще не вкурсе. Что тогда ? В одном месте у меня код отработает как надо, во втором - вернёт false, потому что у юзера, которого я хочу получить active = 0
И тут начинается дебагинг... Где то в конце я додумываюсь залезть в код твоей модели, и о чудо - я нашёл почему модель себя ведёт именно так!!!!!!!! И вдовесок придумываю как это инициализировать твою ACL, что бы мне возвращалось именно то, чего я хочу!
 

Духовность™

Продвинутый новичок
точно так же не логично как и делать echo в контроллере или mysql_query, это будет не ORM, а квери билдер
Гггг, ты усложнил код, создал метод с явно говорящим названием и двойным поведением и называешь это ORM.

ORM - это когда твой getUserById() возвращает объект пользователя по запросу "SELECT * user WHERE id = ?" или null. И все другие методы тоже оперируют объектами. Вот это - ORM. Проецировании реляционной структуры на объекты. А как оно реализовано -уже не важно.
 

MiksIr

miksir@home:~$
MiksIr
Потроллить решил ? :)
Где я сказал, что _только_ в контроллер ? Я лишь хотел сказать, что в модели этому - нет места.
Да и что это у вас за архитектура такая? На каждый чих по нескольку десятков контроллеров ? :))
Цитирую "с active или без - должен решать контроллер". Ну т.е. такая программерская логика - если должен решать, то может решать... а может не решать ;)

Архитектура самая обычная... а сколько у вас контроллеров в обычном таком портальчике? Любой более-менее самостоятельный раздел сайта - свой контроллер. Там тебе и статьи, и фирмы, и всякие товары/итемы и пр пр пр... В каждом контроллере разной сложности выборки... как вон одухотворенность предлагает осуществить подмешивание active во все это не очень представляю.
 
  • Like
Реакции: AmdY

AmdY

Пью пиво
Команда форума
Духовность™
ситуация точно такая же как с массивом, ты просто меняешь интерфейс, но не пользуешься полученной объектностью для получения нового функционала.

я не думаю. что мы сможем тебе что-то доказать, просто посмотри какие выгоды даёт настоящая объектность.
http://www.doctrine-project.org/projects/orm/1.2/docs/manual/behaviors/en#behaviors
 

craz

Нестандартное звание
к примеру простая таблица,
и магический call дадут мне

getUsernameById($id)- ("select username from users where id = ?", $id)
getPasswordById - -//-
getRoleById- -//-

PHP:
<?

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");
это права на жизнь по вашему мнению получаеться не имеет?
 
Сверху