Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Так устроены Модели у меня, а как у вас?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
chalenkoa
Отправлено: 18 Сентября, 2013 - 12:13:50
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




Я использую MVC. С контролерами и шаблона, мне все понятно, но вот модели, тут не все так просто. Некоторое время назад мне нужно было определиться какая структура у меня будет у моделей, и я пошел искать чужой опыт. Нашел только это http://laravel[dot]ru/docs/v3/models это и было принято за основу. Я не буду говорить про то как устроено там, а буду о том к чему я сам пришел и сейчас использую.

Модели у меня делаться на 3 типа

1. Сущности (лежат в \Models\Entities и имеет такое же пространство имен)
2. Хранилища (в \Models\Repositories)
3. Сервисы (в \Models\Services)

Сущности
========
Это простейшие объекты, являющиеся по сути прямой проекцией данных из БД.

PHP:
скопировать код в буфер обмена
  1.     class User {
  2.         public $id;
  3.         public $login;
  4.         public $pass_hash;
  5.     }


У сущностей могут быть методы напрямую относящиеся к ним (читай к данным)
Поэтому методы не могут быть статическими, то есть методы работают с конкретным объектом, созданным на основание данных из БД.

PHP:
скопировать код в буфер обмена
  1.     class User {
  2.         ...
  3.         public function delete() {}
  4.         public function setPassHash() {}
  5.     }


Например, не может быть такого метода, потому что это просто не логично, добавить конкретному пользователю другого пользователя нельзя. Добавить пользователя можно будет с помощью хранилища работающего с пользователями, о чем ниже.

PHP:
скопировать код в буфер обмена
  1.     class User {  
  2.         public static function add($user) {}
  3.     }



Хранилища
=========
Хранилища — это объекты, исключительно со статическими методами, помогающими получать сущности из БД, добавить новые и т.п.

PHP:
скопировать код в буфер обмена
  1.     class Users {
  2.         /** @return \Models\Entities\User */
  3.         public static function getByLogin($login) {}
  4.    
  5.         /** @return \Models\Entities\User */
  6.         public static function create($login, $pass) {}
  7.    
  8.         /** @param \Models\Entities\User $user */
  9.         public static function add($user) {}
  10.     }


Чего не должно быть в хранилище? Логики работы с данными. Например, если нам нужно как-то данные из БД обработать для получения результата, то это уже задача для сервиса, о которых ниже.
Такой код в хранилище недопустим.

PHP:
скопировать код в буфер обмена
  1.     class Users {
  2.         /** @return bool */
  3.         public static function isAdmin($user) {
  4.                 return self::inGroup($user, 'Admin');
  5.         }
  6.    
  7.         /** @return bool */
  8.         private static function inGroup($user, $group) {}
  9.     }


Сервисы
=======
Так как это последний тип моделей, все что не подошло для предыдущих двух помещаем сюда Улыбка Звучит не серьезно, но в моем реальном проекте, что бы здесь не размещалось, не противоречит названию Сервис, так что помойкой это врятли станет.

Продолжим наши примеры с пользователем и приведём, что бы могло быть сервисом, кроме не подходящего для хранилища, но подходящего для сервиса, примера выше.

PHP:
скопировать код в буфер обмена
  1.     use \Models\Repositories\Users;
  2.    
  3.     class Auth {
  4.         public static function reg($login, $pass){
  5.                 $user = Users::create($login, $pass);
  6.                 Users::add($user);
  7.         }
  8.    
  9.         public static function login($login, $pass){
  10.                 $user = Users::getByLogin($login);
  11.                 $result = self::_checkPass($pass, $user->pass_hash);
  12.                 return $result;
  13.         }
  14.    
  15.         private static function _checkPass($pass, $pass_hash) {}
  16.     }


В чем вопрос
============
А вопросов собственно несколько

1. Какие очевидные недостатки вы видите в используемой мною схеме?
2. Какие предложения по улучшению?
3. Если ли у вас какое-то разбиение на типы моделей, что используете вы?

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

(Отредактировано автором: 18 Сентября, 2013 - 12:15:33)

 
 Top
caballero
Отправлено: 18 Сентября, 2013 - 12:24:34
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




индуский код

все это можно свести к сущностям а хранилища и сервисы - статические методы сущностей.

(Отредактировано автором: 18 Сентября, 2013 - 12:25:12)



-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
chalenkoa
Отправлено: 18 Сентября, 2013 - 12:30:03
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




caballero пишет:
индуский код

Отличное начало.
С вами разговор закончен
 
 Top
caballero
Отправлено: 18 Сентября, 2013 - 12:51:00
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




очередное самолюбивое и самоувереное школоло.

я тебе по делу написал. Сущности на основе паттерна Active record и статических фабричных методов перекрывают 90% функционала. Остальное можно сделать хелперными классами -
всегда будет витиеватый кусок логики который не впишется в структуру моделей и придется выполнять нативный SQL.

если считаешь что архитектура которую ты слямзил - клевая а не индусская - зачем вопросы задаешь.


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
imya
Отправлено: 18 Сентября, 2013 - 15:09:42
Post Id



Участник


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Сент. 2012  
Откуда: Запорожье, Украина


Помог: 19 раз(а)




chalenkoa пишет:
С вами разговор закончен

Вы зря так, послушайте, что вам умный человек говорит Подмигивание


-----
PHP:
скопировать код в буфер обмена
  1. do {box != cat;} while (cat != box);


Когда нормальный человек, уезжая из дома одевает на жену пояс верности, веб-дизайнер ставит на нее счетчик...
 
My status
 Top
DelphinPRO
Отправлено: 18 Сентября, 2013 - 16:10:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012  


Помог: 353 раз(а)




мама родная!!! к чему такие сложности? Все гениальное - просто.


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
chalenkoa
Отправлено: 18 Сентября, 2013 - 16:17:37
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




DelphinPRO

Люблю когда все красиво Улыбка
 
 Top
avtor.fox
Отправлено: 18 Сентября, 2013 - 16:18:27
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2083
Дата рег-ции: Март 2012  
Откуда: Воронеж


Помог: 50 раз(а)





chalenkoa пишет:
Люблю когда все красиво

Странное у Вас понятие о красоте.
 
 Top
chalenkoa
Отправлено: 18 Сентября, 2013 - 16:27:21
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




avtor.fox пишет:

chalenkoa пишет:
Люблю когда все красиво

Странное у Вас понятие о красоте.


Ну это как раз нормально, на вкус и цвет товарища нет Улыбка
Интересно было вдруг кто то что то еще придумал кроме как все хранить в одной сущности.
 
 Top
Zuldek
Отправлено: 18 Сентября, 2013 - 16:39:35
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




Сторонником тонкой модели и толстого контроллера был и остаюсь Хм
именно вот поэтому:
Цитата:
всегда будет витиеватый кусок логики который не впишется в структуру моделей и придется выполнять нативный SQL.

(Отредактировано автором: 18 Сентября, 2013 - 16:40:56)

 
 Top
caballero
Отправлено: 18 Сентября, 2013 - 17:17:12
Post Id


Активный участник


Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011  
Откуда: Харьков


Помог: 126 раз(а)




вообще то бизнес-логика должна относится к модели. Просто модель обычно более широкое понятие чем набор классов. Поэтому в модель могут входить как Entity для выполнения элементарных операций так и более сложный функционал.
Модель вообще может быть отдеена от приложения -это может быть отдельный модуль к которому ходят через апи или вебсервисы. Или, как раньше делали, - бизнес-логика реализуется хранимыми процедурами


-----
Бесплатная система складского учета с открытым кодом https://zippy[dot]com[dot]ua/zstore
 
 Top
DeepVarvar Супермодератор
Отправлено: 18 Сентября, 2013 - 17:20:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Да человек всеравно не понимает и стоит на своем.
Пусть так и остается, раз слушать не хочет.
Когда настанет ключевой момент в будущем - он вспомнит этот топик и сядет переписывать.
 
 Top
chalenkoa
Отправлено: 18 Сентября, 2013 - 18:40:09
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




DeepVarvar пишет:
Да человек всеравно не понимает и стоит на своем.
Пусть так и остается, раз слушать не хочет.
Когда настанет ключевой момент в будущем - он вспомнит этот топик и сядет переписывать.

Не понял о чем вы.
 
 Top
esterio
Отправлено: 18 Сентября, 2013 - 19:21:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


Помог: 127 раз(а)




chalenkoa
Если Вы пришли на форум с вопросами значит готовы выслушать критику, которая по любому будет, так как каждому свое.

Вот я сегодня считаю что я написал идеальный код, а завтра для меня ето уже индуськый код.

Теперь по существу
Возмем мой любимый Yii - так там модель имеет:
- данные с базы
- допольнительные аттрибуты
- валидация
- связи
- текстовое описание полей для аттрибута label
- ошибкы заполнения
- behavior-ы
- action-ы
- поиск по primary key
- поиск по аттрибутам
- поиск по sql
- поиск одного, несколькых и всех записей
- структуру таблицы
- кеширование
- типи полей
- работа с формой
ну и много еще чего

вот видите сколько обьязоностей берет на себя модель?
У Вас же все ети три типа моделей можна смело обеденить в одну можель. Ну и не всегда модель должна работать с базой.
 
 Top
chalenkoa
Отправлено: 18 Сентября, 2013 - 20:39:15
Post Id


Новичок


Покинул форум
Сообщений всего: 14
Дата рег-ции: Июль 2013  


Помог: 0 раз(а)




esterio
Круто что то по теме.
Я не работаю с Yii поэтому было бы интересно если бы ты рассказал подробнее о том что там с моделями в том аспекте что я предложил к обсуждению.
В том виде что ты дал информацию, она мало полезна извини.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB