MVC 設計パターンに準拠している場合、インスタンスがコントローラーにある理由はありません。User
プレゼンテーション層に漏れるのではなく、モデル層の一部である必要があります。
あなたが「コントローラー」と呼んでいるものは、実際には、データストレージ関連の構造(マッパー、リポジトリー、DAO)上のドメインオブジェクト間の相互作用を処理する、モデルレイヤーの一部であるはずのサービスのようです。
基本的に、欠けているのは、懸念事項の正しい分離です。
コントローラーは、ドメイン ビジネス ロジックを処理するのではなく、データを認識またはユーザー管理サービスに渡すだけである必要があります。このサービスは、User
オブジェクトを初期化し、データを検証して、保存を試みる必要があります。コントローラーはこれを認識してはなりません。
このようなもの:
class SomeController
{
// ---- snip ----
public function postRegister( $request )
{
$accounts = $this->serviceFactory->create('AccountManagement');
$account->create( $request->getPost('username'),
$request->getPost('email'),
$request->getPost('password'),
$request->getPost('password2') );
$this->view->setState( View::STATE_POST );
}
// ---- snip ----
}
class AccountManagement extends Service
{
// ---- snip ----
public function addUser( $username, $email, $password, $repeated_password )
{
$user = $this->domainObjectFactory->create( 'User' );
$user->setNickname( $username );
$user->setEmail( $email );
$user->setPassword( $password );
$user->matchRepeatedPassword( $repeated_password );
if ( $user->isValid() )
{
$dao = $this->DAOFactory->create( 'User' );
$dao->save( $user );
}
// additional code for saving the error state
// if domain object turns out to be invalid
// or DAO returns an error
}
// ---- snip ----
}
PSこの投稿は関連性があると思われるかもしれません。