Полиморфизм / загрузчик ресурсов с Zend - PullRequest
0 голосов
/ 09 января 2012

Я никогда раньше не работал с полиморфизмом. Я только слышал об этом, когда возник этот вопрос.

У меня есть небольшой бэкэнд с 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 Ответ

1 голос
/ 10 января 2012

Я отбросил описанный выше подход и теперь использую настоящий полиморфизм, подобный этому:

в приложении / модели получил интерфейс, подобный:

И 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/

...