Мысли о переопределении метода сохранения ORM - PullRequest
0 голосов
/ 29 августа 2011

Я подумываю о переопределении методов сохранения / создания / обновления классов ORM в приложении, разрабатываемом с помощью PHP-фреймворка Kohana.

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

Например. Рассмотрим простое приложение для опросов. с двумя классами ORM - Model_Poll и Model_Choice с отношением один ко многим.

прямо сейчас следующий код будет помещен в контроллер для создания нового опроса, а также для сохранения выбора для него, если он найден в $ _POST

$poll = ORM::factory('poll');
$poll->name = 'some question ?';
$poll->save();
if ($this->request->post('choices')) {
   foreach ($this->request->post('choices') as $choice) {
       $c = ORM::factory('choice'); 
       $c->name = $choice;
       $poll->add($c);
   }       
}

Я хочу изменить это на следующее

в контроллере,

$poll = ORM::factory('poll');
$poll->name = 'some question ?';
$poll->set_choices($this->request->post('choices'));
$poll->save();

в Model_Poll,

public function create(Validation $validation = null) {
    $return = parent::create($validation);
    if ($this->_choices) {
        foreach ($this->_choices as $choice) {
           $c = ORM::factory('choice'); 
           $c->name = $choice;
           $this->add($c);
        }
    }
    return $return;        
}

public function set_choices($choices) {
    $this->_choices = $choices;
}

Этот метод create будет внутренне вызван методом save. Позже, если есть что-то еще, я могу сделать это здесь сам.

Спасибо за любую помощь.

1 Ответ

1 голос
/ 29 августа 2011

Выбранные вами объекты не будут сохранены ($c->save() обязательно), поэтому $this->add($c) также не будет работать.

Почему бы не использовать что-то вроде этого:

$poll->save();
$poll->set_choices($this->request->post('choices'));

Где метод set_choices() создаст (если потребуется) выбор и сохранит отношения для текущего опроса.

...