2015-07-17 2 views
0

У меня есть очень простой мастер -> подробно соотношение:Как я могу избежать использования findOne в действии каждого контроллера?

связь: Клиент (1) ---> (п) Комментарии

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

class ClientController extends \yii\web\Controller{ 

     public function actionViewComment($id) { 
       $model = Comment::findOne($id); 
       if ($model == null) 
        throw new NotFoundHttpException('The requested page does not exist.'); 

       return $this->render('view-comment', ['model' => $model]); 
     } 

     public function actionEditComment($id) { 
       $model = Comment::findOne($id); 
       if ($model == null) 
        throw new NotFoundHttpException('The requested page does not exist.'); 
       $model->scenario = 'update'; 

       if ($model->load(Yii::$app->request->post()) && $model->save()) { 
        return $this->redirect(['view-comment', 'id' => $model->id]); 
       } else { 
        return $this->render('edit-comment', ['model' => $model]); 
       } 
     } 
} 

я могу создать метод Model (findOrThrows), чтобы найти или бросить исключение, но все-таки я должен использовать его в половине моих действий контроллера (вероятно, может быть больше, как приложение растет). Мне было интересно, есть ли лучший способ сделать это? Какой-то глобальный объект, который становится доступным на основе Маршрута и Идентификатора, так что Контроллер (или Вид) может его использовать?

ответ

3

Вы должны посмотреть на контроллер CRUD, чтобы понять, как это делается в Yii.

Существует специальный защищенный метод в каждом контроллере называется findModel(), например:

/** 
* @param integer $id 
* @return Post 
* @throws NotFoundHttpException 
*/ 
protected function findModel($id) 
{ 
    if (($model = Post::findOne($id)) !== null) { 
     return $model; 
    } else { 
     throw new NotFoundHttpException('The requested post not exist.'); 
    } 
} 

метод «Global» будет бесполезно, потому что:

  • Отсутствуют автозаполнения и выделение поддержки в Иде.
  • Иногда вам нужно настроить сообщение об исключении, чтобы указать точный тип объекта, который не существует.

Типичное использование в действиях:

$model = $this->findModel($id); 

И вы не заботитесь об условиях исключения бросили и т.д.

+0

Великий, но в предложенном пути я могу работать только с одной модели каждого контроллера , В моем случае ClientController (надеюсь) понадобится как минимум 3 модели в ближайшем будущем. Я пытался что-то сделать на уровне правил в web.php: ''rules' => ['pattern' => 'client/', 'route' => 'client/show', 'defaults' => [ 'comments' => Комментарии :: findOne ($ id)]] ', но он терпит неудачу. После некоторого тестирования и угадывания я предполагаю, что переменная $ id не существует на данный момент в приложении (используя это как мою ссылку: http://www.yiiframework.com/doc-2.0/guide-runtime-overview.html). Любые другие идеи, пожалуйста? –

Смежные вопросы