Вопрос по модели и проверке значения )

Духовность™

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

Есть такой код:

PHP:
if (!empty($_POST['submit']))
{
    if (empty($_POST['user_login']))
    {
        $_HTML['err'][] = 'Вы не ввели логин';
    }
    else
    {
        // тут надо лезть в базу и проверять наличие в базе пользователя
        //с логином = $_POST['user_login']
    }
}
если мы на минуту представим, что этот код у нас выступает в качестве контроллера в системе MVC, то кто-то должен заниматься проеркой в блоке else. Либо сам контроллер:

PHP:
$db->query('SELECT * FROM users WHERE login = "?"', $_POST['user_login']);
либо некоторый набор функционала, известный как модель:

PHP:
$userModel = new userModel();

if ($userModel->getDataByLogin($_POST['user_login'])){
    echo 'Логин занят';
}
Тут у общественности мнения однозначного нет, поэтому меня больше интересует построение модели в приведенной концепции. Посмотрите на код:
PHP:
$userModel = new userModel();

if ($userModel->getDataByLogin($_POST['user_login'])){
    echo 'Логин занят';
}

// или можно так:

$userModel = new userModel();
// инициализируем по какому-то полю, в данном случае по user_login
$userModel->initByField('user_login', $_POST['user_login']);
// получаем данные пользователя
if ($userModel->getData()) {
    echo 'Логин занят';
}
имеет ли право модель быть так написана, когда при инициализации объекта userModel() не создается объект конкретной уже существующей сущности, а просто инстанцируется класс с функционалом для работы с данными модели "пользователь"? Следовательно, получается можно использовать модель как хочешь:

PHP:
$userModel = new userModel();
// Создать пользователя
$userModel->create($_POST);
// Получить его данные 
$userModel->getData();
// Удалить пользователя
$userModel->delete();
PHP:
$userModel = new userModel();
// Инициализируем, т.е. назначаем пользователя с id = $_GET['id_user']
$userModel->setId($_GET['id_user']);
// Получаем его данные
$userModel->getData();
Я доходчиво объяснил? :D
 

Кощей

if(!$needle) die("ooh");
Не совсем ясно обяснили, ну если так нужно почему бы и нет. А если вам нужна конкретная функция класа к ней можно обратиться так
Class::function()
 

Кощей

if(!$needle) die("ooh");
Мне кажеться тут нужно делать иначе, работать не с класом юзера а с общим класом модели который и возвращает объект юзера или масив объектов юзеров по запросу, вот его можно напичкать статическими функциями и спрашивать про юзера
 

cranchzerro

Новичок
Re: Вопрос по модели и проверке значения )

Автор оригинала: triumvirat
не создается объект конкретной уже существующей сущности, а просто инстанцируется класс с функционалом для работы с данными модели "пользователь"?
хз, если правильно понял, что ты имеешь ввиду, то это называется Lazy Load (Lazy Loading etc)

>имеет ли право модель быть так написана
ещё как имеет, если имелась ввиду загрузка по требованию

p.s хотя, я бы многое что изменил в твоём коде (точнее сказать в структуре, которую отображает часть кода), но сама суть загрузки по требованию именно такова.

-~{}~ 20.08.08 14:38:

... блин, сорри, невнимательно прочитал весь твой пост ;)

то что ты делаешь является обычным Data Mapper, так что да, имеет право конечно же

ну далее уже флейм про количество ярусов в твоём приложении, может кое-что вынести в более нижний ярус и т.д...

-~{}~ 20.08.08 14:39:

а Data Mapper "тесно" дружит с ORM, так что ещё раз советую пересмотреть всю архитектуру )
 

Кощей

if(!$needle) die("ooh");
По моему это нелогично, создавать объект пользователь не имея пользователя)
 

cranchzerro

Новичок
фитч в том, что созданный объект пользователя (ещё незаполненный) абстрагирует особенности структуры БД и способы обмена (CRUD) информацией (впринципе, любого хранилища данных), и предоставляет возможность на соотв. ярусе оперировать понятиями (предметной областью) этого яруса

то есть, всё зависит от того, сколько этих самых ярусов вы решили использовать в своём приложении...

зы: если это просто несколько скриптов что-то делающих с пользаками, заморачиваться со всем этим не стоит, но если в вопросе значится : имеет ли модель право выглядеть именно так, то что ж, конечно же имеет (хоть для приложения с несколькими страничками, писать именно так, ессно смысла не имеет ;)
 

Кощей

if(!$needle) die("ooh");
Тогда нужно просто метод по заполнению объекта отделить от выборки данных, и добавить метод по сохранению объекта в нужную структуру данных ( в базу там или файл или еще куда)
 

cranchzerro

Новичок
ну это уже различные варианты реализации работы с БД или чем там ещё
вопрос в другом был, на него и отвечаю )
 

dr-sm

Новичок
помоему модель в MVC неразрывно связана с View (или наоборот :)).
а твоя triumvirat userModel, это скорее Domain Object,
абстракция над БД слоем.
 

kode

never knows best
хм...я тоже задумывался над такой ситуацией, придумал вот что

class User - все базовые операции с пользователем
инстанцируется либо по логину либо по id

class NewUser extends user - создает нового пользователя в конструкторе и дальше работаем с ним

class PreloadedUser extends User - в конструктор передаём массив с данными из БД
 

Духовность™

Продвинутый новичок
помоему модель в MVC неразрывно связана с View (или наоборот ).
а твоя triumvirat userModel, это скорее Domain Object,
Да? А я всегда думал, что контроллер связан с View, а модель ничего не знает о View :)

kode
а какой большой смысл такое разделение делать?
 

Ярослав

Новичок
cranchzerro
Еп ты какие умные слова

dr-sm
<<помоему модель в MVC неразрывно связана с View (или наоборот ).
Серьезно?

-~{}~ 20.08.08 16:24:

PHP:
$userModel = new userModel();

if ($userModel->getDataByLogin($_POST['user_login'])){
    echo 'Логин занят';
}
Это ты эхо из модели будешь делать?
 

kode

never knows best
Автор оригинала: triumvirat
а какой большой смысл такое разделение делать?
По идеалогическим причинам

Автор оригинала: Кощей
покажите примерчик пожалуйста
PHP:
class User {
	
	final protected $dbData = array();
	
	public function __construct($login){
		$this->dbData = $this->fetch($uid);
		if(empty($this->dbData)){
			throw new Exception("User not found");
		}
	}

	public function __get($var){
		return $this->dbData[$var];
	}
	
	protected function fetch($login){
		$db = Registry::get('db');
		$db->select('users',array('login'=>$login));
		return $db->fetchRow();
	}
	
	public function update($data){
		$db = Registry::get('db');
		$db->update('users',$data,array('id'=>$this->dbData['id']));
	}
	
	public function checkPassword($password){
			return ($this->dbData['password'] == md5($password));
	}
	
	public function sendPM(User $to,$subject,$message){		
		$msg = new NewPM($this,$to,$subject,$message);
		$msg->setMessage($message);
		$msg->setSubject($subject);
		$msg->sendReminder(($to['email']&&$to['sendReminder']));

		if(!$to->ignored($this)){
			$msg->send();
		}else{
			throw new Exception("You are ignored by this user");
		}
	}
}

class NewUser extends User {
	
	public function __construct($data){
		$this->dbData = $data;
		$this->dbData['id'] = $this->addToDB($data);
	}
	
	protected function addToDB($data){
		$db = Registry::get('db');
		$db->insert('users',$data);
		return $db->lastInsertId();
	}
}

class PreLoadedUser extends User {
	public function __construct($data){
		$this->dbData = $data;
	}
}
 

Ярослав

Новичок
Незнаю насколько такой вариант может жить но как это реализовано у меня на данный момент
есть:
My_Controller

My_Model

Для подобного случая используеться обьект My_Response
PHP:
class My_Response
{
     protected $_dataCollection;   // обект данный
     protected $_statusCollection;   // обьект статусов
}

дальше если по схеме что сверху будет так
if (!empty($_POST['submit'])) {
    $model = new My_Model();
    $response = $model->check... ($_POST); // модель сама знает какие данные ей нужны и проверит их там и вернет обькт ответа
    if (!$response->isSuccess()) {   // если какая то хрень то выводим или закидаем во вьюв для подальшей обработки шаблонизатором или другим видом (json) это уже не столь важно
         $status = array();
         foreach ($response->getStatusCollection() as $status) {
               $status[] = array('id' => $status->getCole(), 'msg' => $status->getMessage());
        }
        $this->view->assign('message', $status);
         ...
         $this->view->success = false;

    }
    // иначе привет чел
}
-~{}~ 20.08.08 16:38:

если надо возвращать еще какие то данные кроме статусов то используем dataCollection

$response->get('username');

выдаст привет Вася
 

cranchzerro

Новичок
фига се тему раздули...

народ а собсна апчём спор идёт?
в демонстрации кусков кода как у кого сделана проверка логина?
 

Farsh

~ on ~ high ~ wave ~
Re: Вопрос по модели и проверке значения )

Автор оригинала: triumvirat
имеет ли право модель быть так написана, когда при инициализации объекта userModel() не создается объект конкретной уже существующей сущности, а просто инстанцируется класс с функционалом для работы с данными модели "пользователь"?
Блин , тема интересна, но сам не могу четко дать на это ответ .
Для получения инфы с модели юзера - используется статический класс модели ( спец. для ретривинга данных, ) . И из контроллера что-нить типа $exists = UserPeer::isset($_POST['name']);
То есть в случае проверки существования юзера - либо контроллер -> модель ( статическая, для ретривинга ) , либо класс валидатора -> модель ( аналогично : делает запрос в модель, и результат передает во view, контроллер ничего не знает ) .
А последний приведенный пример - да, имеет . Почему нет то ? По нему видно что создается и удаляется сущность юзера, больше ничего .
 

dr-sm

Новичок
Автор оригинала: triumvirat
Да? А я всегда думал, что контроллер связан с View, а модель ничего не знает о View :)
нуда, только если нету View, зачем нам Model?
те, в моем понимании, применительно к Web MVC, модель это набор данных необходимых для отображения.
вот пример
 
Сверху