8

私が望むのは、データがデータベースに含まれるオブジェクト (つまりユーザー) のグループを持つシステムの理想的なフレームワークを確認することです。User クラスと UserMapper クラスを用意するようにアドバイスされましたが、これがどのように見えるべきかについての私の理解です。

user.class.php

/* The class for constructing any user's information
 */

    class User {

        protected $userId, $email, $userGroup;

        protected function getEmail() {
            return $this->email;
        }

        protected function getUserId() {
            return $this->userId;
        }


        public function __construct($userId, $email, $userGroup) {
            $this->userId = $userId;
            $this->email = $email;
            $this->userGroup = $userGroup;
        }

    }

    class UserMapper {
        // database connection
        private $db;

        public function __construct($db)
        {
            $this->db = $db;
        }

        public function findByUserId ($userId) {
            $userObject = new User();
            $q = $this->db->prepare("SELECT userId, email, userGroup FROM user WHERE userId = :userId");
            $q->bindValue(":userId", $id);
            $q->setFetchMode( PDO::FETCH_INTO, $userObject);
            $q->execute();
            $q->fetch(PDO::FETCH_INTO);
            return $userObject;

        }
    }   
?>

main.php

<?php  
    include user.class.php;
    $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(PDO::ATTR_PERSISTENT => true));
    $getUser = new UserMapper($dbh);
    $user = $getUser->findByUserId(41);
    echo $user->getEmail();
?>

しかし、これは main.php 側に関しては少し面倒です。1 つの PDO オブジェクトを作成して、それをすべてのスクリプトで定義することはできませんか? UserMapper オブジェクトと同様に? または、データベースからユーザーを取得するたびに、新しい userMapper オブジェクトを作成してから、findByUserId (上記のように) を実行する必要があります。または、これを行うためのより簡単な方法はありますか?

クラス User 内で UserGroup オブジェクトを呼び出したい場合、どのようにすればよいでしょうか? (これは、PDO を介してデータベースに接続する必要もあります)。以下を行うのは面倒に思えます:

<?php
       $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(PDO::ATTR_PERSISTENT => true));
        $getUserGroup = new UserGroupMapper($dbh);
        $userGroup = $getUserGroupMapper->findByUserId($this->userGroup);
?>
4

3 に答える 3

1

私が考えることができることの 1 つは、このクラスをシングルトンにして、クラスの宣言の上に $user を作成することです。これにより、このクラスを含めるたびに、そのユーザー オブジェクトが作成されます。

于 2013-10-15T11:47:59.383 に答える
1

1 つの PDO オブジェクトを作成して、それをすべてのスクリプトで定義することはできませんか? UserMapper オブジェクトと同様に?

あなたは実際にフロントコントローラーを探しています。

つまり、同じクラスの同じインスタンス化を避けるために、それらを準備しておく必要があります。ほとんどの人は通常、bootstrap.php必要なすべての依存関係を「微調整」する でこれを行います。

ただし、フロント コントローラーの実装には、ディスパッチャーとルーターも含まれます。これについては深く掘り下げませんが、解決しようとしている問題に集中してください。

工場パターン

基本的にインスタンス化ロジックを抽象化します。利点は次のとおりです。1) オブジェクトのインスタンス化を遅らせることができます。2) 単体テストに悪いグローバル状態を回避できます。簡略化したバージョンは次のようになります。

class UserFactory
{
   private $pdo;

   private $cache = array();

   public function __construct($pdo)
   {
      $this->pdo = $pdo;
   }

   public function build($mapper)
   {
      if (isset($this->cache[$mapper])) {
         return $this->cache[$mapper];
      } else {
         // Inject an instance into a mapper
         $instance = new $mapper($this->pdo);
         // Save the state into a cache
         $this->cache[get_class($instance)] = $instance;
         return $instance;
      }
   }
}

そして最後に

ブートストラップ er の非常に単純化されたバージョンは、次のようになります。

<?php

/* File : bootstrap.php */

$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(PDO::ATTR_PERSISTENT => true));

// Include here UserFactory class
$userFactory = new UserFactory($dbh);

// Its kinda ready to be used

ユーザーにアクセスする必要があるすべてのスクリプトに含めるだけです。

<?php

/* File: main.php */
include(__DIR__ . '/bootstrap.php');

$getUser = $userFactory->build('UserMapper');
$user    = $getUser->findByUserId(41);

echo $user->getEmail();
于 2013-10-15T13:03:02.477 に答える