За последние 24 часа нас посетили 18200 программистов и 1682 робота. Сейчас ищут 1089 программистов ...

Model, Mapper, Generator

Тема в разделе "Решения, алгоритмы", создана пользователем Padaboo, 10 ноя 2010.

  1. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    PHP:
    1. <?php
    2.     if(!file_exists($modelTpl)) {
    3.         trigger_error("$modelTpl не найден", E_USER_ERROR);
    4.         return;
    5.     }
    6.     if(!is_readable($modelTpl)) {
    7.         trigger_error("$modelTpl не читаем", E_USER_ERROR);
    8.         return;
    9.     }
    10.     if(!is_dir($output)) {
    11.         trigger_error("$output не директория", E_USER_ERROR);
    12.         return;
    13.     }
    14.  
    15.     $this->modelTpl = file_get_contents($modelTpl);
    16.     $this->output   = $output;
    17.     $this->db       = $db;
    18.  
    не?
     
  2. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Volt(220)
    так и было, в 3м посте замечание высказали... ну я глянул как везде делают и написал, хз
     
  3. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    там, я думаю, имеется в виду такая структура:
    PHP:
    1.  
    2. <?php
    3.      if(!file_exists($modelTpl)) throw new Exception ("$modelTpl не найден");
    4.      if(!is_readable($modelTpl)) throw new Exception ("$modelTpl не читаем");
    5.      if(!is_dir($output)) throw new Exception ("$output не директория");
    6.  
    7.      $this->modelTpl = file_get_contents($modelTpl);
    8.      $this->output  = $output;
    9.      $this->db      = $db;
    И ловить исключения уже в вызывающем методе.
    Иначе смысл генерить стандартное исключение, тут же его ловить и делать то, что в общем то спокойно делается без них.

    А про тройную вложенность if еще у Макконнелла написано.
     
  4. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Volt(220)
    ну тогда как ты выше написал, сразу trigger_error, или все таки нет хз в общем))
     
  5. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    так что ли получается...
    PHP:
    1. <?php
    2. try {
    3.          $g = new ModelGenerator($db);
    4.          $g->create('users');
    5.       } catch (Exception $e) {
    6.              trigger_error($e->getMessage(), E_USER_ERROR);
    7.       }
    8.      
     
  6. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Padaboo
    Например. Просто я trigger_error не использую.
     
  7. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Volt(220)
    мне кажется есть смысл что то ловить, если ты специфический эксепшен используешь и предусмотрел действие
    это еше Simpliest ссылку на видос давал про заплатки, так мне кажется
    PHP:
    1. <?php
    2. try {
    3.                 //что то делаем
    4.       } catch (MyException $e) { //тут пишем в лог
    5.             try {
    6.                       //снова пытаемся что то делать
    7.                   } catch (Exception $e){ //тут уже простой Exception, если совсем ничего не выходит
    8.                      //trigger_error
    9.                   }
    10.       }
    а чем пользуешься?
     
  8. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Ловить надо, иначе пользователь увидит ошибку или пустой лист, т.е. грубо говоря:
    PHP:
    1. <?php
    2. /*типа index.php*/
    3. require_once('ini.php');
    4.     $core=new Core();
    5. try{
    6.     $core->showPage();
    7. }catch(MyException $e){
    8.     $core->showMyErrorPage();
    9. }
    10. }catch(Exception $e){
    11.     $core->showStandartErrorPage();
    12. }
    13.  
    Чем хорош Java и всякие IDE для него, так это тем что тебе сразу сообщат если ты забыл заловить исключение.

    Я вообще использую свои исключения, которые наследуют от VoltException. Тогда можно отделить мои исключения от исключений сторонних разработчиков и стандартных PHP'шных. Так вот, этот VoltException в конструкторе логирует исключение (при желании отключается в настройках, вплоть до отключения/включения логирования конкретного класса исключений).

    А trigger_error он же только сообщение создает да error_handler() вызывает. Или что-то еще делает?
     
  9. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Volt(220)
    прикольно, удобно получается, у меня просто переопределен хэндлер и уже там логирование, а то что active record у тебя, как будет выглядеть поиск пользователя с двумя AND например?
     
  10. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Padaboo
    PHP:
    1. <?php
    2. Apocalipsis::start();
    3. try{
    4.    $me->goOut(Person::UseTrain);
    5. }catch(TrainsException){
    6.    try{
    7.        $me->goOut(Person::UseCar);
    8.    }catch(RoadsException){
    9.       try{
    10.           $me->goOut(Person::UseLegs);
    11.       }catch(WalkException){
    12.           $me->waitForDie();
    13.       }
    14.    }
    15. }
    16. Town::allDie();
     
  11. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Padaboo
    В смысле?
    PHP:
    1. <?php
    2. $user=new User();
    3. $user->name='Vasa';
    4. $user->hobbi='sleep';
    5. $user->insert();
    6. ?>
    7.  
    8. <?php
    9. $userArr=array('name'=>'Vasa', 'hobbi'=>'sleep');
    10. $user=new User($userArr);
    11. $user->email='a@a.aa';
    12. $user->update();
    13. ?>
     
  12. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Volt(220)
    Хаахахха,
    PHP:
    1. <?php
    2. try{
    3.            $me->goOut(Person::UseLegs);
    4.        }catch(WalkException){
    5.            $me->waitForDie();
    6.        }
     
  13. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Volt(220)
    а искать он должен уметь?
     
  14. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Volt(220)
    Эммм ... это что такое?
    Допустим есть два класса: User и Users
    Класс User содержит всю информацию о пользователе и любые методы манипуляции информацией только в контексте класса. Класс User не может затрагивать других пользователей.
    Поэтому:

    PHP:
    1. <?php
    2.  
    3. $users->update($userInstance);
    4.  
    5. ?>
     
  15. Костян

    Костян Активный пользователь

    С нами с:
    12 ноя 2009
    Сообщения:
    1.724
    Симпатии:
    1
    Адрес:
    адуктО
    я вообще никогда не пользовался trigger_error
     
  16. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Apple
    не, это другой паттерн, active record, там класс user сам себя записывать умеет, либо я что то не так понял
    http://www.phpactiverecord.org/projects ... uick_Start
    да и в книгах тоже mapper внутри вызывает у модели $model->save(), мне просто кажется что модель по минимуму про базу должна знать
     
  17. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Padaboo
    На практике это разумно для таких объектов как Directory, например.
    PHP:
    1. <?php
    2.  
    3. $directory->rename("New Folder");
    4.  
    5. ?>
    Для User ... довольно странно и необычно ИМХО.
     
  18. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Apple
    угу, мне тоже не больно нравится так, поэтому все в маппере делаю
     
  19. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Строка
    Код (Text):
    1. new User($userArr)
    создает новый объект и заполняет объект(вызывая метод select) данными пользователя, которому в базе соответствует $userArr(массив поле-значение или идентификатор пользователя), или данными по умолчанию, если никто не найден.

    Apple
    Есть класс SiteUser и DBUser.
    SiteUser - представляет пользователя, как посетителя сайта.
    DBUser - по сути манипулирует данными пользователя в базе.

    $dbUser, если выбран из базы, имеет идентификатор и в update() его использует.

    А чем не нравиться?
     
  20. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Volt(220)
    да нет, тоже в принципе удобно, просто у меня 1 объект того же юзера, даже не в этом дело, методов лишних нету в нем...
    ну это конкретно для моей реализации, хочу нечто вроде асинхронных демонов, $mapper->find() возвращает массив с индексами соответствующими id в таблице, при старте демона
     
  21. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    крутую штуку нашел в мануале
    PHP:
    1. <?php
    2. abstract class Model {
    3.    
    4.    public function toArray() {
    5.         return $this->processArray(get_object_vars($this));
    6.     }
    7.    
    8.     private function processArray($array) {
    9.         foreach($array as $key => $value) {
    10.             if (is_object($value)) {
    11.                 $array[$key] = $value->toArray();
    12.             }
    13.             if (is_array($value)) {
    14.                 $array[$key] = $this->processArray($value);
    15.             }
    16.         }
    17.         // If the property isn't an object or array, leave it untouched
    18.         return $array;
    19.     }
    20.    
    21.     public function __toString() {
    22.         return json_encode($this->toArray());
    23.     }
    24.    
    25. }
    26. ?>
     
  22. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Apple
    На каждую сущность создается по два класса, с "s" на конце и без нее?
     
  23. Dagdamor

    Dagdamor Активный пользователь

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    Padaboo
    PHP:
    1. <?php
    2.  
    3. $user=$database->getLine("users","id=$id AND posts>=$posts");
    Вы своих примеров так и не привели, кстати. ;)
     
  24. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Dagdamor
    заставим Вась прыгать
    PHP:
    1. <?php
    2. $users = $map->find(new User(),"`login` = 'Vasia'");
    3. foreach($users as $user){
    4.      $user->jump();
    5.  }
     
  25. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    научитесь же уже правильно писать мое имя
    Vasya
    Еще уникальность e-mail'а например тоже можно задавать прямо при создании таблицы, тогда было бы удобно в маппере определить все уникальные поля, а не только id