MVC и валидация

hell0w0rd

Продвинутый новичок
WRONG.

Это как раз типичное неправильное понимание роли контроллера, о котором Василий М. пытался написать в википедии. Это как раз ТТУК.

Контроллер _связывает_ model и view, об их данных он ничего не знает. Зачем ему знать?
Как же? Контроллер видит что ему запрошен user: id=100500 - он просит модель - дай-ка мне юзера с id 100500, она дает, он сует в шаблон эти данные и отдает.
 

fixxxer

К.О.
Партнер клуба
Как же? Контроллер видит что ему запрошен user: id=100500 - он просит модель - дай-ка мне юзера с id 100500, она дает, он сует в шаблон эти данные и отдает.
Нет.
PHP:
$UserModel = new UserModel;
$UserModel->loadById($Request->getVar('user_id'));
$View->assign('User', $UserModel);
return $this->render('template.tpl', $View);
Никаких "сует данные".
 

hell0w0rd

Продвинутый новичок
GusakovNick
Легко, кстати.
http://symfony.com/doc/current/book/templating.html - там рядышком примеры на Twig и PHP.
Не то, чтобы я был против, я приверженец как раз Твига, но справедливости ради.
Конечно! Через шаблонизатор же)) <?php $view->extend('::base.html.php') ?>
Фактически язык шаблонизатора - просто синтаксический сахар.
 

hell0w0rd

Продвинутый новичок
О каком наследовании идет речь?
Почитайте по ссылке в следующем ответе. Удобная штука)
Нет.
PHP:
$UserModel = new UserModel;
$UserModel->loadById($Request->getVar('user_id'));
$View->assign('UserModel', $UserModel);
return $this->render('template.tpl', $View);
Никаких "сует данные".
хорошо, отправляет данные - суть не меняется
 

fixxxer

К.О.
Партнер клуба
Суть меняется.

Если будет

$user_data = $UserModel->getById(...);
//...
$View->assign('user_data', $user_data);

то плейсхолдер "//..." становится миной замедленного действия, где будет укореняться и произрастать говнокод с обработкой $user_data ифами, форичами и такой-то матерью, то есть контроллер становится смесью бизнес-логики, вью-логики и вообще хз чем но не контроллером.

Если же мы делаем assign модели, это становится невозможно.

Да, такой же говнокод может образоваться в модели, но этот говнокод будет РЕЮЗАБЕЛЕН, в отличие от контроллера (из которого потом пойдет копипаста по другим контроллерам =))
 

hell0w0rd

Продвинутый новичок
Суть меняется.

Если будет

$user_data = $UserModel->getById(...);
//...
$View->assign('user_data', $user_data);

то плейсхолдер "//..." становится миной замедленного действия, где будет укореняться и произрастать говнокод с обработкой $user_data ифами, форичами и такой-то матерью, то есть контроллер становится смесью бизнес-логики, вью-логики и вообще хз чем но не контроллером.

Если же мы делаем assign модели, это становится невозможно.
Я разве где-то сказал, что после запроса у модели данных контроллер их как-то обрабатывает?
 

fixxxer

К.О.
Партнер клуба
А это неважно, что сказал. =)

Все равно там ОНО появится при таком подходе. Неминуемо. Начнется с "ну я же по-быстрому, потом поправлю". А потом не успеешь опомниться, как там уже сто строк.

Особенно если пишешь не ты один.
 

hell0w0rd

Продвинутый новичок
А это неважно, что сказал. =)

Все равно там ОНО появится при таком подходе. Неминуемо. Начнется с "ну я же по-быстрому, потом поправлю". А потом не успеешь опомниться, как там уже сто строк.

Особенно если пишешь не ты один.
Вы любитель додумывать за других:)
Чувствуется не раз на подобное натыкались) Я так не делаю))
 

vanicon

Новичок
Вообще то обсуждение было сначала о валидации данных, то есть где и как ее делать.
А мы как то съехали в сторону обсуждения моделей и контроллеров.
Давайте отойдем вообще от паттерна mvc на время и посмотрим с точки зрения ооп.
Есть сущность пользователь, у него есть свойства логин, пароль и т.п, есть действия...
Есть заполнители сетеры и гетеры, для получения и изменения свойств объекта, в данном случае пользователя.
И в сетерах прописывать как может меняться то или иное свойство (правила валидации), вроде бы логично...
Так что же получается, что такие правила как капча и т.п, которые не может валидировать модель, должен валидировать кто-то другой, перед взаимодействием с объектом.
Теперь вопрос, кто этим должен заниматься, ну наверно это должен быть еще один объект или класс, в контекте которого и будет происходить работа с объектом...
Давайте лучше продолжим обсуждение с этого момента, а потом и вернемся к mvc...

Также мне не понятна идея fixxxer насчет всего этого, так что если вам не трудно можно не много поподробнее про это (реализация самих методов или валидации не важна, главное суть...).
 

WMix

герр M:)ller
Партнер клуба
fixxxer
а если так
PHP:
$View->assign('user_data', $UserModel->getById(...));
 

Absinthe

жожо
php по моему мнению и так является шаблонизатором, и его вполне хватает...
Вот из мануала по Symfony цитата:
Twig can also do things that PHP can't, such as whitespace control, sandboxing, automatic and contextual output escaping, and the inclusion of custom functions and filters that only affect templates.
Я бы не стал использовать PHP в виде шаблонизатора, плохо справляется.
 

vanicon

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

hell0w0rd

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

Василий М.

Новичок
vanicon
покажу на примере. на истину не претендую, просто покажу как у меня с капчей.

PHP:
// обработка POST-запроса на регистрацию
private function post()
{
	// Из POST принимаем данные и создаем объект модели $this->user
	// Валидация модели УЖЕ прошла при присвоении значений свойствам объекта
	// модель МОЖЕт содержать ошибочные данные, но в модели будет информация об этих ошибках
	$this->user = $this->getMapper('User/User')->createFromPost($this->getRequest()->getPost('user'));

	// Пользователь может послать любой числовой ID,
	// который будет транслирован в объект - предотвращаем хак
	$this->user->setId($this->getCurrentUser()->getId());

	// Инстанцируем валидатор, работающий на основе цепочек.
	// Он может принимать много-много валидаторов, проверять их и отдавать отчеты об ошибках в виде массива..
	// параметры - пути к языковым фай1лам описания ошибок
	$validator = new Krugozor_Validator_Chain('common/general', 'user/registration');

	// Добавляем в валидатор ошибки модели (если они есть там)
	$validator->addModelErrors($this->user->getValidateErrors());

	// добавляем новый валидатор проверки капчи
	$validator->add('captcha', new Krugozor_Module_Common_Validator_Captcha(
		$this->getRequest()->getPost('captcha_code'), Krugozor_Session::getInstance()->code
	));

	// если логин указан...
	if ($this->user->getLogin())
	{	// добавляем валидатор проверки занятости такого логина
		$validator->add('login', new Krugozor_Module_User_Validator_UserLoginExists(
			$this->user, $this->getMapper('User/User')
		));
	}

	// если указан email... 
	if ($this->user->getEmail()->getValue())
	{	// добавляем валидатор проверки занятости такого email адреса
		$validator->add('email', new Krugozor_Module_User_Validator_UserMailExists(
			$this->user, $this->getMapper('User/User')
		));
	}

	// валидируем все валидаторы
	$validator->validate();

	// ошибки в модели либо ошибки из цепочки валидаторов 
	if ($this->getView()->err = $validator->getErrors())
	{
		// давай, до свидания! (показ формы с ошибками)
	}
	else // ошибко нет - запись данных 
	{
		// ...
 

vanicon

Новичок
Не знаю как в других - в симфони все сведется к объекту модели, ее и отправляют на валидацию. Что еще нужно подвергать валидации-то?
Выше я написал, что такие поля как капча или повтор пароля, это никак к сущности пользователя не относится, соответственно в сущности пользователя этих данных и не будет...
 
Сверху