web-dev-qa-db-ja.com

ビューからモデルのメソッドを呼び出すことはできますが、コントローラーからはできません

コントローラからモデルのメソッドを呼び出そうとしています。

controller.php

_if($view='myview'){   
      $model= $this->getModel('mymodel');  //on echo-prints class name of model
      $locations= $model->get('Locations');
      var_dump($locations);//prints NULL
      ...
}
_

mymodel.php

_public function getLocations(){  
      $db=JFactory::getDBO();
      $query=$db->getQuery(true);  
      $query->select('distinct location');   
      $query->from('#__locations');
      $db->setQuery($query);  
      return $loc = & $db->loadObjectList();  
}
_

コントローラでNULLが返されるのはなぜですか。ただし、getLocations()view.html.phpで正常に機能します。

3
user1926

$model->get('Locations')はしません。正しい構文は、メソッド名$model->getLocations()を呼び出すだけです。

->get('Locations')構文の使用はビューでのみ有効です(get()はビュークラスのメソッドであるため)。

getメソッドもあるため、これはモデルにエラーをスローしません。ただし、他のメソッドのリファレンスとはまったく異なるタスクを実行します。

-

他にコードについて注意したいことがたくさんあります。

  1. コントロールのifステートメントには2つの=記号が必要です。それ以外の場合は、ビューをその文字列に設定します(常に実行されます)。

  2. なぜこれを行うのですか:return $loc = & $db->loadObjectList();?最後にローカル変数にオブジェクトリストを格納するのは奇妙です。また、&を使用して参照によって保存する必要はありません。 return $db->loadObjectList();を実行してください

  3. これはあなたのケースでは当てはまらないかもしれませんが、モデルとコントローラが同じセットからのものである場合(つまり、同じ名前である場合)、通常は$model = $this->getModel();ではなく$model= $this->getModel('mymodel');を実行するだけで済むでしょう。 ]コントローラーは既に同じ名前のモデルにデフォルト設定されています。

5
David Fritsch

コンポーネントに他に何があるかについての背景はほとんどありません。

あなたは本当にデータベースの例外をチェックする必要があります。参照: SQL例外/エラー処理の方法は2.5および3.xと互換性がありますか?

ここには2つのオプションがあります。

1。推奨

お好みのIDEでデバッガをセットアップし、コードを調べて何が行われるか、どこからnullが来ているかを確認します。

これは、現在だけでなく、長期的にも役立ちます。

2。うまくいくかもしれない

この方法の欠点は、コードの品質が引き続き低下し、次に得られるnullが、助けを求める新しい質問になるということです。

_$model_はモデルのインスタンスのようですので、getLocations()が呼び出されていないか、loadObjectList()が失敗の結果としてnullを返しているかどうかを確認できる唯一の機会クエリ。除外されていないことも、どこかのタイプミスです。

3
Valentin Despa