Где 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(); }
- ключ id - значение, которое надо проверить. Если не указано, используем id от первой загруженной модели
- ключ flash - сообщение для пользователя. Если не указано, значит все делаем молча
- ключ action - действие, на которое надо редирект сделать. Если не указано, то index.



4 Responses to “Где ID?”
kondrat - Ноябрь 16th, 2008
Спасибо, буду использовать. Напильником только уберу die(),напишу $this->redirect(array(’controller’=>$this->params['controller'], ‘action’=>$action), null, true);
что впрочем тоже самое.
Сергей - Ноябрь 16th, 2008
После $controller->redirect() жизнь продолжается, т.е. выполнение всех остальных инстукций, которые после redirect не прервется. Потому и die()
Сергей - Ноябрь 16th, 2008
Сходил посмотрел API — ура, приделали выход. И вправду можно просто redirect сделать. :-)
Сергей - Ноябрь 16th, 2008
Еще можно сделатьif($id) return $id
тогда можно писать, например:
$this->read($this->redirect_if_no_id());
:-)
Leave a Reply