Zend的多态性/资源加载器

时间:2012-01-09 09:59:59

标签: php polymorphism zend-form

我以前从未使用过多态性。当这个问题出现时我才刚刚听说过。

我有一个有2个权限的后端。管理员/普通用户。根据权限,我想在表单上显示不同的导航,更少或更多的选项等。但我不想为每个权限创建一个表单,而是禁用我不需要的元素等。

我该怎么做?

目前,我正在使用类似的东西:(这不是真正的多态性)

<?php

class My_Resources_ResourceLoader extends Zend_Application_Resource_ResourceAbstract {
    public $templateForm = null;
    public $customerForm = null;

    function init() {
        $permission = 'admind';
        if($permission == 'admin') {
            $this->templateForm = new Application_Form_newTemplate;
        } else {
            $form = new Application_Form_newTemplate;
            $form->removeElement('newTemplate_customer');
            $this->templateForm = $form;
        }
        return $this;
    }
}

在我的控制器中,例如

<?php

$bootstrap = $this->getInvokeArg('bootstrap');
$xx = $bootstrap->getResource('ResourceLoader');
$this->view->test = $xx->templateForm;

角色永远不会改变。这可能没问题,但不是最好的解决方案。什么是更好的方法呢?

1 个答案:

答案 0 :(得分:1)

我已经抛弃了上面的方法,现在使用这样的真正多态:

应用程序/模型中的

获得了如下界面:

和2个类一样:

<?php

class Application_Model_TemplateUser implements Application_Model_TemplateInterface {
    private $table = null;
    private $row = null;
    private $id = null;
    private $formValues = null;

    function __construct() {}
    public function exist() {}
    public function save() {}   
    public function getCustomerId($name) {}
    public function update() {}
    public function getForm() {
        $form = new Application_Form_newTemplate;
        $form->removeElement('newTemplate_customer');
        return $form;
    }
}

<?php

class Application_Model_TemplateAdmin implements Application_Model_TemplateInterface {
    private $table = null;
    private $row = null;
    private $id = null;
    private $formValues = null;


    function __construct() {}
    public function exist() {}
    public function save() {}
    public function getCustomerId($name) {}
    public function update() {}

    public function getForm() {
        return new Application_Form_NewTemplate();
    }
}

在我的控制器中我做:

<?php
        $permission = 'User'; //TODO: Get from Session
        $class = 'Application_Model_Template' . $permission;
        $xx = new $class;
        $form = $xx->getForm();
        $this->view->test = $form;

这只是一个例子。但我认为我真的是在一个更好的方式。也许我将使用抽象类,因为我使用的是Zend_Db-Table_Row,它对于更新行总是相同的,所以使用抽象类而不是接口会更有意义。

关于PHP中多态性的好文章:http://net.tutsplus.com/tutorials/php/understanding-and-applying-polymorphism-in-php/