1つの可能性は、PHPで魔法の__setメソッドと__getメソッドを使用することです。私は抽象モデルクラス内でそのようにそれらを使用します:
abstract class Model_Abstract
{
protected $_data;
// Private Data Members assigned to protected $_data
public function __construct($data = null)
{
// Makes it so that I can pass in an associative array as well as
// an StdObject.
if(!is_object($data)) {
$data = (object) $data;
}
$this->_data = $data;
}
public function __get($key)
{
if (method_exists($this, '_get' . ucfirst($key))) {
$method = '_get' . ucfirst($key);
return $this->$method();
}
else {
return $this->_data->$key;
}
}
public function __set($key, $val)
{
if ( method_exists( $this, '_set' . ucfirst($key) ) ) {
$method = '_set' . ucfirst($key);
return $this->$method($val);
}
else {
$this->_data->$key = $val;
return $this->_data->$key;
}
}
}
class Model_User extends Model_Abstract
{
//Example overriding method for the property firstName in the $_data collection.
protected function _getFirstName()
{
// Do some special processing and then output the first name.
}
}
これにより、必要に応じてプロパティのゲッターとセッターを指定できるようになりますが、プロパティを返す前に何らかの処理を実行するプロパティだけで、すべてのプロパティに定型関数を定義する必要がなくなります。価値。たとえば、私は多くの場所で機能を使用して、ISO準拠の日付(MySQLに保存されている)をユーザーにとってよりコンパクトで読みやすい形式に変更します。
コントローラーに何を配置するかについては、この投稿を参照して、コントローラー内に配置する処理に関する具体的なフィードバックを確認することをお勧めします。
モデルをビューに自動的にロードし、コントローラー全体をスカートするヘルパーが必要だと感じる人もいます。個人的には、Zend FrameworkとPHPのコンテキスト内では、ビュー内のモデルの状態はリクエストからのモデルに依存することが多いため、コントローラーからビューにモデルを渡すことは十分に理にかなっています(これは確実に処理する必要があります)コントローラ内)。
更新:コメントの批判によると、私が指摘することの1つは、データベースアクセス層とドメイン(またはモデル)層は実際には2つの異なるものですが、ActiveRecordではそれらがブレンドされているということです。私はしばらく前にこの質問をし、この問題についていくつかの有益なフィードバックを受け取りました。モデルで何をするにしても、モデルのデータがどこから来たかに関係なく、すべてのドメインオブジェクトに一貫したAPIを提供する必要があります。
Saemの回答によって提供される1つの利点は、1つ以上のドメインオブジェクトからビューオブジェクトにプロパティ/関数の戻り値を直接マップする機能を提供することだと思います。理論的には、ビュー内の使用法は次のようになります。
// Mapped from Model_User::_data->last_name and Model_User::_data->first_name
$this->name