Создание толстых моделей с использованием методов CRUD в cakephp

Согласно руководству по книге cakephp, такие действия, как обновление базы данных, выполняются в контроллере путем проверки того, установлен ли $id в пути ulr, если выполняется сохранение. Во время этого действия cakephp нужен $this->id, который считывается из базы данных с помощью $this->Model->find();

Во время этого процесса в контроллере интенсивно используются данные $this->request->data. Стоит отметить, что у Модели нет доступа к $this->request->data.

Мой вопрос: есть ли у вас собственные стратегии для создания тонкого контроллера и толстой модели во время действий CRUD?

У меня есть один большой пользовательский контроллер для выполнения действий CRUD, но модели, необходимые для этих действий, тонкие.

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

Вот пример метода контроллера, скопированного много раз в контроллере (по сути, во всех подобных действиях меняется только имя модели)

public function strona_edytuj($id = null)
{
$this->loadModel('Page');
//$this->render('strona/strona_edytuj');
if (!$id) {
    $this->recursve = 0;
    $data = $this->Page->find('all');
    $this->set('data', $data);
    $this->render('strona/strona_pokaz_wszystkie');
    return false;
}
$post = $this->Page->findById($id);
if (!$post) {
    throw new NotFoundException(__('Nie ma takiej strony !'));
}
if ($this->request->is(array('post', 'put'))) {
    $this->Page->id = $id;
    if ($this->Page->save($this->request->data)) {
        $this->Session->setFlash(__('Strona została zaktualizowana.'));
        $this->redirect(array('controller' => 'users', 'action' => 'strona_edytuj'));
    }
    $this->Session->setFlash(__('Wystąpił błąd. Spróbuj ponownie.'));
}
if (!$this->request->data) {
    $this->request->data = $post;
}
}

Спасибо за предложения.


person user2610146    schedule 10.06.2014    source источник


Ответы (1)


вы можете уменьшить код за счет большего количества функций в модели, например, если вам нужно вызвать детали вашей модели, просто поместите функцию в модель, а затем пламя на контроллере. единственный драйвер, который я имею дело с данными, полученными по модели.

    public function strona_edytuj($id = null)
    {

    $post = $this->Page->name_of_your_function($id);
    if (!$post) {
        throw new NotFoundException(__('Nie ma takiej strony !'));
    }
    if ($this->request->is(array('post', 'put'))) {
        $this->Page->id = $id;
        if ($this->Page->save($this->request->data)) {
            $this->Session->setFlash(__('Strona została zaktualizowana.'));
            $this->redirect(array('controller' => 'users', 'action' => 'strona_edytuj'));
        }
        $this->Session->setFlash(__('Wystąpił błąd. Spróbuj ponownie.'));
    }
    if (!$this->request->data) {
        $this->request->data = $post;
    }

}

в вашей модели страницы

public function name_of_your_function($id)
{
   return $this->findById($id);     
}

вы сокращаете так много кода, когда FindByid находит или объединяется

person CoolLife    schedule 10.06.2014
comment
Спасибо за ответ. Я уже делаю это, но знаю, что сокращаю код контроллера на 2 или 3 строки... Но спасибо. - person user2610146; 10.06.2014