-1

假设我们有一个应用程序,人们可以在其中创建角色,类似于魔兽世界或 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 回答