-1

World of Warcraft や Everquest のようなキャラクターを作成できるアプリケーションがあるとします。MVC を使用することにしました。

ユーザーがアプリケーションにログインした後、ホームページからキャラクターのリストをユーザーに表示する必要があります。当初、ユーザーにキャラクターのリストを表示する唯一のビジネス要件は、ユーザー アカウントに関連付けられているすべてのアクティブなキャラクターのリストを取得することでした。このキャラクターのリストは、複数のコントローラーからもアクセスできる必要があります。

ある時点で、ビジネス モデルが変更され、ユーザーの支払い状況に基づいて特定の文字のみをユーザーが表示できるように、支払い状況が設定されます。たとえば、ゴールド レベルの支払いステータスではすべてのキャラクターにアクセスでき、シルバー レベルでは 2 種類のキャラクターに制限されます。

    <?php
    class Controller{
        public function index(){
            //array of users active characters(would be done via lookups with datamapper pattern)
            $arrCharacters = array(0=>$objChar1, 1=>$objChar2);

            //set a payment status of silver(would be done via lookups with datamapper pattern)
            $objPayment = new objPayment();
            $objPayment->setStatus('Silver');

            //loop through each character object and check the character access level against what the user paid for
            //if the character access level is not at least equal to the payment level, remove the character object from the
            //array that we want to pass to the output(view)
            foreach($arrCharacters as $key=>$objCharacter){                
                if($objCharacter->getCharAccessLevel()<=$objPaymentLevel()){
                    unset($arrCharacters[$key]);
                }
            }
        }
    }
    ?>

明らかにこのアプローチは機能しますが、ユーザーのキャラクターにアクセスするために必要なすべてのコントローラーにその機能をコピーする必要があることを意味します。この問題を解決するためのより効率的な方法に関する提案。自分の場合に適した良いデザイン パターンが見つかりません。

助言がありますか?

4

1 に答える 1

0

これは MVC の問題ではありませんが、インターフェイスで簡単に解決できます。

たとえば、PlayerServiceインターフェイスを作成して、さまざまな実装を作成できます。この場合、無料および有料の実装です。

interface PlayerService {
    public function getPlayers();
}

class FreePlayerService implements PlayerService {
    public function getPlayers() { ... }
}

class PayedPlayerService implements PlayerService {
    private $status;

    public function __construct($status) { ... }
    public function getPlayers() { /* return players based on status */ }
}

コントローラ

class PlayerController {
    PlayerService $service;

    public function setPlayerService(PlayerService $service) {
        $this->service = $service;
    }

    public function index() {
        $players = $service->getPlayers();
    }
}

これで、コントローラー サービスをいずれかの実装に設定できますが、違いはわかりません。

于 2013-08-13T11:59:59.843 に答える