Оптимальный метод сохранения в модели

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Закрыто
devv
Сообщения: 39
Зарегистрирован: 2015.04.26, 22:37

Оптимальный метод сохранения в модели

Сообщение 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() туда согласно советам нельзя.
andrei.obuhovski
Сообщения: 610
Зарегистрирован: 2015.07.16, 10:50

Re: Оптимальный метод сохранения в модели

Сообщение andrei.obuhovski »

Ну так это еще не толстые. Посмотрите на код нового сайта yii фреймворка:
https://github.com/yiisoft-contrib/yiif ... r.php#L286
https://github.com/yiisoft-contrib/yiif ... er.php#L79
https://github.com/yiisoft-contrib/yiif ... er.php#L44
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Оптимальный метод сохранения в модели

Сообщение zelenin »

andrei.obuhovski писал(а):Ну так это еще не толстые. Посмотрите на код нового сайта yii фреймворка:
https://github.com/yiisoft-contrib/yiif ... r.php#L286
https://github.com/yiisoft-contrib/yiif ... er.php#L79
https://github.com/yiisoft-contrib/yiif ... er.php#L44
господи, ужасающий код.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Оптимальный метод сохранения в модели

Сообщение 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 или что-то подобное
devv
Сообщения: 39
Зарегистрирован: 2015.04.26, 22:37

Re: Оптимальный метод сохранения в модели

Сообщение 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 даже мыслей не было.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Оптимальный метод сохранения в модели

Сообщение zelenin »

devv писал(а):Я хотел уточнить, можно ли в модель передавать POST массив
$_POST - нет, $request->post() - да, т.к. это обычный массив.
devv писал(а):как данные, чтобы все то что я делаю в экшене, делать в моделях. Но если я буду делать это

Код: Выделить всё

TaskData::findOne(['dataId' => $request->post('id')]) 
в модели то это вроде как неправильно. Передавать кучу параметров это тоже не вариант. Или я ошибаюсь? Про компонент request даже мыслей не было.
я дал вам наводку - используйте сервис для таких обработок. В модели пишите только то, что относится непосредственно к моделе. findOne, как вы правильно сказали, там не место.
devv
Сообщения: 39
Зарегистрирован: 2015.04.26, 22:37

Re: Оптимальный метод сохранения в модели

Сообщение devv »

zelenin писал(а):
devv писал(а):Я хотел уточнить, можно ли в модель передавать POST массив
$_POST - нет, $request->post() - да, т.к. это обычный массив.
devv писал(а):как данные, чтобы все то что я делаю в экшене, делать в моделях. Но если я буду делать это

Код: Выделить всё

TaskData::findOne(['dataId' => $request->post('id')])
в модели то это вроде как неправильно. Передавать кучу параметров это тоже не вариант. Или я ошибаюсь? Про компонент request даже мыслей не было.
я дал вам наводку - используйте сервис для таких обработок. В модели пишите только то, что относится непосредственно к моделе. findOne, как вы правильно сказали, там не место.
Я не нашел сведений о таком сервисе, где мне можно узнать поподробнее?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Оптимальный метод сохранения в модели

Сообщение zelenin »

devv писал(а):
zelenin писал(а):
devv писал(а):Я хотел уточнить, можно ли в модель передавать POST массив
$_POST - нет, $request->post() - да, т.к. это обычный массив.
devv писал(а):как данные, чтобы все то что я делаю в экшене, делать в моделях. Но если я буду делать это

Код: Выделить всё

TaskData::findOne(['dataId' => $request->post('id')]) 
в модели то это вроде как неправильно. Передавать кучу параметров это тоже не вариант. Или я ошибаюсь? Про компонент request даже мыслей не было.
я дал вам наводку - используйте сервис для таких обработок. В модели пишите только то, что относится непосредственно к моделе. findOne, как вы правильно сказали, там не место.
Я не нашел сведений о таком сервисе, где мне можно узнать поподробнее?
ручками пишите, передаете туда данные, делаете обработку, которая у вас в экшне.
andrei.obuhovski
Сообщения: 610
Зарегистрирован: 2015.07.16, 10:50

Re: Оптимальный метод сохранения в модели

Сообщение andrei.obuhovski »

Тут главное понимать зачем это нужно.
Если вы не пишите unit-тесты, если у вас экшны влезают в экран, и если вы не собираетесь дублировать этот код в другом месте, то особого смысла в сервисе нет.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Оптимальный метод сохранения в модели

Сообщение zelenin »

andrei.obuhovski писал(а):Тут главное понимать зачем это нужно.
Если вы не пишите unit-тесты, если у вас экшны влезают в экран, и если вы не собираетесь дублировать этот код в другом месте, то особого смысла в сервисе нет.
когда вы поймете, что данный код используется в пяти местах будет уже поздно. В контроллере вообще должно быть чистенько. Передали куда-то пришедшие данные и спите спокойно.
devv
Сообщения: 39
Зарегистрирован: 2015.04.26, 22:37

Re: Оптимальный метод сохранения в модели

Сообщение devv »

Спасибо всем за ответы, буду знать теперь.
Закрыто