Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Catalyst и MVC, не понимаю 
:(
    Опции темы
Logo
Дата 13.10.2010, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Работая с Catalyst, обнаружил, что очень многие вещи (в том числе и те, что к модели не отноятся) удобно реализовывать через наследование класса строки таблицы DBIx.

Например есть таблица, содержащая статьи, публикуемые на сайте. Удобно добавить к классу строки таблицы методы, возращающие url статьи и url страници админки для редактирования статьи . Но это, если я правильно понимаю MVC, это задача для контроллера.

Или есть таблица с пользователями, у которых есть логин, имя и фамлия, а на имя пользователя часто выводится в формате "username (Имя Фамилия)", имя и фамилия не обязательны.
Т. е.
Код

[% user.username %]
[% IF user.first_name || user.last_name %] 
 ([% user.first_name %][% IF user.first_name && user.first_name%] [%END%][% user.first_name %])
[%END%]

Удобнее один раз добавить метод обьекту строки таблицы. Эта задача для view.


Но добавляя методы одному классу строки таблицы, получим смешение model, view, controller в одном файле. Как быть? 


Это сообщение отредактировал(а) Logo - 14.10.2010, 18:18
PM MAIL   Вверх
ming
Дата 14.10.2010, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 30.1.2009
Где: Новосибирск

Репутация: 2
Всего: 3



отдавайте во View не объект типа User, который представляет строку таблицы, а заводите промежуточный класс ну например DisplayedUser и отдавайте его экземпляр.

в Model
Код
$UserObj = ... # получить "сырые" данные из базы

$username = $UserObj->username;
$first_name = $UserObj->first_name;
$last_name = $UserObj->last_name;

# проверка наличия first- & lastname пропущена, для наглядности
$DisplayedUserObj->username = $username ." (". $first_name . " " . $last_name .")"; 


а во View:
Код
Имя пользователя : [% displayedUserObj.username %]

PM MAIL ICQ Jabber   Вверх
Logo
Дата 14.10.2010, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Собственно, в том и загвоздка, что код помещается в model. А представление данных должно быть во view.
PM MAIL   Вверх
sir_nuf_nuf
Дата 15.10.2010, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



Logo, представление - очень растянутая вещь.. 
Нет смысла строго придерживаться MVC, если при этом страдает простота и понятность.
У вас есть данные - класс Человек. Данные тоже могут обладать методами, возможно отличными от get/set.
Например, у вас хранится полное имя - Иван Иваны Анонимкин, а вы хотите получать сокращенное - И.И.Анонимкин,
эта логика настролько сильно привязана к данным, что ее правильно помещать в модель.

В вашем случае 
Код

$username ." (". $first_name . " " . $last_name .")"; 

так же можно поместить в модель. Главное, что бы он не был в перемешку с html. 

А вот в случае с URL на страничку статьи - не нужно помещать ее в модель. 
URL вообще имеют свойство меняться. Их желательно никуда не харкодить.


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Logo
Дата 17.10.2010, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Цитата

так же можно поместить в модель. Главное, что бы он не был в перемешку с html. 


Ну, до html там не далеко, возможен вариант username (Фамлия Имя).

Url-ы тоже просто в схему записывать? Ведь это удобно - генерация урла только в одном месте.


PM MAIL   Вверх
sir_nuf_nuf
Дата 17.10.2010, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



Цитата(Logo @  17.10.2010,  13:48 Найти цитируемый пост)
Url-ы тоже просто в схему записывать? Ведь это удобно - генерация урла только в одном месте.  

да, только этим местом не должна быть модель.

Посмотрите Django - там вообще предполагается, что приложение не должно знать полную структуру URLов,
т.к. маппинг URLов на обработчики осущесвтляется программистом в момент установки приложения.
Просто представьте себе, что кто-то захочет использовать ваше приложение как часть своего сайта.
Что потом делать с вашими URLами?


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Logo
Дата 19.10.2010, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Цитата

да, только этим местом не должна быть модель.


Есть тип данных/класс, К примеру App::Schema::Article. У статьи должен быть генератор урла, который должен генерировать url самой статьи и url статьи в админке. Тоесть, фактически, метод в ООП. Я и добаляю генерацию урла как методы App::Schema::Article. Но т. к. эти методы я определяю там же, где и чисто "модельные" методы, получается смешение.

Добавлено через 9 минут и 39 секунд
Делать url hardcode, или нет, другой вопрос. URL можно делать через uri for action.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0489 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.