#model-view-controller #yii
#model-view-controller #yii
Вопрос:
Я пишу веб-приложение mvc с фреймворком yii. У меня есть часть бизнес-логики, и я не уверен, где ее разместить. $usernameid=$model->random_id_gen('5');
это функция, о которой я говорю.
SiteController:
<!-- snip -->
public function actionIndex()
{
$model = new Users();
if (isset($_POST['Users'])) {
//call the active record table model
$model = new Users();
//massively assign attributes
$model->attributes=$_POST['Users'];
//generate random userid
$usernameid=$model->random_id_gen('5');
<!-- snip -->
Класс активной записи пользователей:
<!-- snip -->
public function random_id_gen($length)
{
$characters = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ';
$max = strlen($characters) - 1;
$string = '';
for ($i = 0; $i < $length; $i ) {
$string .= $characters[mt_rand(0, $max)];
}
return $string;
}
Мой вопрос: Принадлежит ли эта функция генератора идентификаторов модели Active record? Должно ли это быть в контроллере? Должно ли это быть в отдельной модели, поскольку это «бизнес-логика», но имеет мало общего с базами данных?
Я пытаюсь стать лучше в том, чтобы не «раздувать» мои классы MVC. Заранее спасибо, ребята.
ОБНОВЛЕНИЕ Я ищу решение, специфичное для yii. Похоже, вопрос перерос в «куда следует помещать библиотеки в yii», если существует такое соглашение.
Ответ №1:
MVC следует переименовать в MVCL .. то есть Model-View-Controller-Library. Такого рода функции должны быть вынесены в отдельную систему библиотек.
Контроллер должен быть сверху. Он выполняет две основные функции: принимает пользовательский ввод и координирует другие элементы (контроллер / библиотека / представление) для вывода. традиционно контроллер запрашивает данные у модели. Но манипулирование данными (наиболее распространенное) должно выполняться функциями в библиотеке.
Может быть два уровня библиотек, один может быть сложным (на основе объектов), а другой может быть простым (на основе глобальных функций) для наиболее распространенных операций. Что-то вроде удаления тегов ИЛИ подготовки XML-данных, очистки URL и т.д. Библиотеки простых функций могут быть доступны всей системе без какого-либо создания экземпляра конкретного библиотечного объекта.
Имеет смысл?
Комментарии:
1. Спасибо за ответ, Стьюи. Я ищу конкретный ответ для yii. Где yii обрабатывает библиотеки? Я обновлю вопрос.
2. Извините, я не использовал yii .. но все основные фреймворки имеют концепцию библиотек.. у yii это тоже должно быть
3. Опять же, входные данные приветствуются. Спасибо.
4. Возможно, это поможет: yiiframework.com/doc/guide/1.1/en/extension.integration
5. Я бы убрал это редактирование. Это в ядре yii, на которое вы просто ссылаетесь. Вы не пишете для него код. Я ценю детективную работу. Я думаю, что собираюсь просто создать свою собственную модель, которая будет действовать как библиотека всякой всячины.
Ответ №2:
Я использую для размещения библиотек :
- в расширении (/protected /extensions) для универсальных библиотек
- в protected/components, если библиотека является общей для проекта
- в protected/modules/xxx/components для библиотек, специфичных для модуля
- в каталоге поставщиков, если библиотека огромна, и я не хочу ее версифицировать
Обычно вы импортируете каталог protected/components (Yii::import(‘application.components.*’), чтобы эти библиотеки были доступны по запросу.
У меня это работает нормально.
Ответ №3:
Я знаю, что это довольно необычно. Но поскольку эта конкретная функциональность не связана с базой данных или логикой оператора (контроллера) и не взаимодействует с ними, она просто не принадлежит ни одному объекту. Более того, это упрощенная утилита function
.
Итак, вот куда это должно пойти. (Если вы намеренно не выполняете CCP.)
Комментарии:
1. Согласны ли вы со Стьюи, что ему место в библиотеке?
2. Используете ли вы это пространство имен, помещаете ли его в оболочку статического класса или сохраняете как фактическую функцию, зависит от аспекта повторного использования. Но в целом, да. Что он сказал. Библиотека.
Ответ №4:
Насколько я знаю, и я сам этим пользуюсь, в Yii есть вспомогательная папка, и именно это место я использую для размещения вспомогательных функций, подобных той, о которой вы спрашивали. Я не часто им пользовался, поскольку в yii предусмотрено ооочень много функций, но мне пришлось добавить функцию времени, которая показывала бы время до / назад для события, которая работала как шарм в папке helper, и самое приятное, что Yii точно знал, где искать, когда я использовал Yii :: import … надеюсь, это поможет