Где ID?

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

Ну вот например для вызовы методов /controller/view без ID записи смысла не имеют. Я в таких случаях делаю redirect на метод index. Примерно так:
function view()
{
   if (!$this->Model->id)
   {
      $this->redirect(array('controller'=>'mycontroller', 'action'=>'index'));
      die();
   }
/*
 * Ну тут код дальше
 */
 
}
Один раз это написать можно, два раза - начинает раздражать. В итоге задумываешься об автоматизации этой проверки. Что я и сделал.

Маленький метод, который можно добавить в AppController. Работу с PHP4 не тестировал. И работу с контроллером, у которого несколько моделей тоже ;-)
protected function redirect_if_no_id($params = array())
{
// Значения по умолчанию
   $defaults = array(
      'flash' => null,
      'id' => $this->{$this->modelNames[0]}->id,
      'action' => 'index'
   );
 
   extract(array_merge($defaults, $params));
 
// Если ID есть, то ничего не делаем
   if ($id) return;
 
// Если передана переменная flash -- отдадим ее
// SessionComponent'у
// Здесь хорошо бы проверку, загружен-ли
// SessionComponent вообще
   if ($flash) $this->Session->setFlash($flash);
 
// Редиректим и умираем
   $this->redirect(array('controller'=>$this->params['controller'], 'action'=>$action));
   die();
}
Как видно, можно передавать (но не обязательно), массив с параметрами: Все это будет работать в пределах одного контроллера, т.е. редирект будет на действие того-же контроллера. Желающие могут доработать напильником.

4 Responses to “Где ID?”

  1. kondrat - Ноябрь 16th, 2008

    Спасибо, буду использовать. Напильником только уберу die(),
    напишу $this->redirect(array(’controller’=>$this->params['controller'], ‘action’=>$action), null, true);
    что впрочем тоже самое.
  2. Сергей - Ноябрь 16th, 2008

    После $controller->redirect() жизнь продолжается, т.е. выполнение всех остальных инстукций, которые после redirect не прервется. Потому и die()
  3. Сергей - Ноябрь 16th, 2008

    Сходил посмотрел API — ура, приделали выход. И вправду можно просто redirect сделать. :-)
  4. Сергей - Ноябрь 16th, 2008

    Еще можно сделать

    if($id) return $id

    тогда можно писать, например:

    $this->read($this->redirect_if_no_id());

    :-)

Leave a Reply