Страница 1 из 1
Оптимальный метод сохранения в модели
Добавлено: 2016.01.29, 11:04
devv
В лучших практиках по MVC говорится, что лучшая архитектура проекта считается таковой, если контроллеры - тонкие, а модели толстые. Посему, в контроллере наткнулся на вариант вставки данных:
Код: Выделить всё
$request = Yii::$app->request;
$parentTask = TaskData::findOne(['dataId' => $request->post('id')]);
$taskModel = new Task();
$childTaskData = new TaskData();
if ($childTaskData->load($request->post()) && $childTaskData->prependTo($parentTask)) {
$taskModel->ownerId = Yii::$app->user->id;
$taskModel->attributes = $request->post();
$taskModel->link('taskData', $childTaskData);
return (new Levels())->addExperience(Yii::$app->user->identity->username, 10);
}
С точки зрения Yii записывать данные в модель и тут же сохранять их - обыденно, например, через load() && save(). Но в этих же практиках пишется:
К примеру, в типичном действии обновления модели контроллер может сначала создать экземпляр модели, затем заполнить его данными из $_POST и, в случае успешного сохранения модели, перенаправить браузер пользователя на страницу созданной модели. Стоит отметить, что само сохранение модели должно быть реализовано в классе модели, а не в контроллере;
Поэтому вопрос, правильно ли реализовано сохранение у меня? Сперва хотел создать метод в модели и дернуть его в контроллере, но вспомнил, что передать данные из $request->post() туда согласно советам нельзя.
Re: Оптимальный метод сохранения в модели
Добавлено: 2016.01.29, 11:30
andrei.obuhovski
Re: Оптимальный метод сохранения в модели
Добавлено: 2016.01.29, 11:40
zelenin
Re: Оптимальный метод сохранения в модели
Добавлено: 2016.01.29, 11:47
zelenin
devv писал(а):В лучших практиках по MVC говорится, что лучшая архитектура проекта считается таковой, если контроллеры - тонкие, а модели толстые. Посему, в контроллере наткнулся на вариант вставки данных:
Код: Выделить всё
$request = Yii::$app->request;
$parentTask = TaskData::findOne(['dataId' => $request->post('id')]);
$taskModel = new Task();
$childTaskData = new TaskData();
if ($childTaskData->load($request->post()) && $childTaskData->prependTo($parentTask)) {
$taskModel->ownerId = Yii::$app->user->id;
$taskModel->attributes = $request->post();
$taskModel->link('taskData', $childTaskData);
return (new Levels())->addExperience(Yii::$app->user->identity->username, 10);
}
С точки зрения Yii записывать данные в модель и тут же сохранять их - обыденно, например, через load() && save(). Но в этих же практиках пишется:
К примеру, в типичном действии обновления модели контроллер может сначала создать экземпляр модели, затем заполнить его данными из $_POST и, в случае успешного сохранения модели, перенаправить браузер пользователя на страницу созданной модели. Стоит отметить, что само сохранение модели должно быть реализовано в классе модели, а не в контроллере;
Поэтому вопрос, правильно ли реализовано сохранение у меня? Сперва хотел создать метод в модели и дернуть его в контроллере, но вспомнил, что передать данные из $request->post() туда согласно советам нельзя.
лично я не понял что вы хотите. код - типичный.
$request->post() можно куда угодно передавать, т.к. это массив, а вот $request использовать везде уже нет.
я бы ваше код перевел бы в TaskService::addTaskData или что-то подобное
Re: Оптимальный метод сохранения в модели
Добавлено: 2016.01.29, 12:54
devv
zelenin писал(а):devv писал(а):В лучших практиках по MVC говорится, что лучшая архитектура проекта считается таковой, если контроллеры - тонкие, а модели толстые. Посему, в контроллере наткнулся на вариант вставки данных:
Код: Выделить всё
$request = Yii::$app->request;
$parentTask = TaskData::findOne(['dataId' => $request->post('id')]);
$taskModel = new Task();
$childTaskData = new TaskData();
if ($childTaskData->load($request->post()) && $childTaskData->prependTo($parentTask)) {
$taskModel->ownerId = Yii::$app->user->id;
$taskModel->attributes = $request->post();
$taskModel->link('taskData', $childTaskData);
return (new Levels())->addExperience(Yii::$app->user->identity->username, 10);
}
С точки зрения Yii записывать данные в модель и тут же сохранять их - обыденно, например, через load() && save(). Но в этих же практиках пишется:
К примеру, в типичном действии обновления модели контроллер может сначала создать экземпляр модели, затем заполнить его данными из $_POST и, в случае успешного сохранения модели, перенаправить браузер пользователя на страницу созданной модели. Стоит отметить, что само сохранение модели должно быть реализовано в классе модели, а не в контроллере;
Поэтому вопрос, правильно ли реализовано сохранение у меня? Сперва хотел создать метод в модели и дернуть его в контроллере, но вспомнил, что передать данные из $request->post() туда согласно советам нельзя.
лично я не понял что вы хотите. код - типичный.
$request->post() можно куда угодно передавать, т.к. это массив, а вот $request использовать везде уже нет.
я бы ваше код перевел бы в TaskService::addTaskData или что-то подобное
Я хотел уточнить, можно ли в модель передавать POST массив, как данные, чтобы все то что я делаю в экшене, делать в моделях. Но если я буду делать это
Код: Выделить всё
TaskData::findOne(['dataId' => $request->post('id')])
в модели то это вроде как неправильно. Передавать кучу параметров это тоже не вариант. Или я ошибаюсь? Про компонент request даже мыслей не было.
Re: Оптимальный метод сохранения в модели
Добавлено: 2016.01.29, 13:03
zelenin
devv писал(а):Я хотел уточнить, можно ли в модель передавать POST массив
$_POST - нет, $request->post() - да, т.к. это обычный массив.
devv писал(а):как данные, чтобы все то что я делаю в экшене, делать в моделях. Но если я буду делать это
Код: Выделить всё
TaskData::findOne(['dataId' => $request->post('id')])
в модели то это вроде как неправильно. Передавать кучу параметров это тоже не вариант. Или я ошибаюсь? Про компонент request даже мыслей не было.
я дал вам наводку - используйте сервис для таких обработок. В модели пишите только то, что относится непосредственно к моделе. findOne, как вы правильно сказали, там не место.
Re: Оптимальный метод сохранения в модели
Добавлено: 2016.01.29, 15:10
devv
zelenin писал(а):devv писал(а):Я хотел уточнить, можно ли в модель передавать POST массив
$_POST - нет, $request->post() - да, т.к. это обычный массив.
devv писал(а):как данные, чтобы все то что я делаю в экшене, делать в моделях. Но если я буду делать это
Код: Выделить всё
TaskData::findOne(['dataId' => $request->post('id')])
в модели то это вроде как неправильно. Передавать кучу параметров это тоже не вариант. Или я ошибаюсь? Про компонент request даже мыслей не было.
я дал вам наводку - используйте сервис для таких обработок. В модели пишите только то, что относится непосредственно к моделе. findOne, как вы правильно сказали, там не место.
Я не нашел сведений о таком сервисе, где мне можно узнать поподробнее?
Re: Оптимальный метод сохранения в модели
Добавлено: 2016.01.29, 15:15
zelenin
devv писал(а):zelenin писал(а):devv писал(а):Я хотел уточнить, можно ли в модель передавать POST массив
$_POST - нет, $request->post() - да, т.к. это обычный массив.
devv писал(а):как данные, чтобы все то что я делаю в экшене, делать в моделях. Но если я буду делать это
Код: Выделить всё
TaskData::findOne(['dataId' => $request->post('id')])
в модели то это вроде как неправильно. Передавать кучу параметров это тоже не вариант. Или я ошибаюсь? Про компонент request даже мыслей не было.
я дал вам наводку - используйте сервис для таких обработок. В модели пишите только то, что относится непосредственно к моделе. findOne, как вы правильно сказали, там не место.
Я не нашел сведений о таком сервисе, где мне можно узнать поподробнее?
ручками пишите, передаете туда данные, делаете обработку, которая у вас в экшне.
Re: Оптимальный метод сохранения в модели
Добавлено: 2016.01.29, 15:28
andrei.obuhovski
Тут главное понимать зачем это нужно.
Если вы не пишите unit-тесты, если у вас экшны влезают в экран, и если вы не собираетесь дублировать этот код в другом месте, то особого смысла в сервисе нет.
Re: Оптимальный метод сохранения в модели
Добавлено: 2016.01.29, 15:34
zelenin
andrei.obuhovski писал(а):Тут главное понимать зачем это нужно.
Если вы не пишите unit-тесты, если у вас экшны влезают в экран, и если вы не собираетесь дублировать этот код в другом месте, то особого смысла в сервисе нет.
когда вы поймете, что данный код используется в пяти местах будет уже поздно. В контроллере вообще должно быть чистенько. Передали куда-то пришедшие данные и спите спокойно.
Re: Оптимальный метод сохранения в модели
Добавлено: 2016.01.29, 15:44
devv
Спасибо всем за ответы, буду знать теперь.