Платформа зенда: Используя Модели и Представления, [закрытые] лучшие практики

Google не поддерживает TestCafe специально. TestCafe использует прокси-сервер, который вставляет тестовый код JavaScript в тестируемую страницу. Тестовый код использует все, что предоставляет браузер API.

9
задан matt b 2 March 2009 в 20:54
поделиться

4 ответа

Одна возможность состоит в том, чтобы использовать волшебство __, набор и __ получает методы в PHP. Я использую их как так в моем абстрактном Образцовом классе:

abstract class Model_Abstract
{
    protected $_data;

    // Private Data Members assigned to protected $_data
    public function __construct($data = null)
    {
        // Makes it so that I can pass in an associative array as well as 
        // an StdObject.
        if(!is_object($data)) {
            $data = (object) $data;
        }

        $this->_data = $data;

    }

    public function __get($key)
    {
        if (method_exists($this, '_get' . ucfirst($key))) {
            $method = '_get' . ucfirst($key);
            return $this->$method();            
        }
        else {
            return $this->_data->$key;
        }   
    }

    public function __set($key, $val)
    {
        if ( method_exists( $this, '_set' . ucfirst($key) ) ) {
            $method = '_set' . ucfirst($key);
            return $this->$method($val);            
        }
        else {
            $this->_data->$key = $val;
            return $this->_data->$key;
        }
    }
}


class Model_User extends Model_Abstract
{
    //Example overriding method for the property firstName in the $_data collection.
    protected function _getFirstName()
    {
        // Do some special processing and then output the first name.
    }
}

Это делает его так, чтобы Вы могли указать методы считывания и методы set для свойств по мере необходимости, но сделали его так, чтобы Вы не определяли шаблонные функции для каждого свойства, просто те, где Вы хотите сделать своего рода обработку на нем прежде, чем возвратить значение. Например, я использую функциональность во многих местах для изменения ISO совместимые даты (как сохранено в MySQL) в более компактный и читаемый формат для пользователей.

До того, что поместить в Вашем контроллере, я рекомендовал бы смотреть на это сообщение для некоторой определенной обратной связи на какой, обработав для размещения в контроллере.

Некоторое чувство, что у них был бы помощник, который автоматически загружает модели в представление и окаймляет контроллер в целом. Лично я сказал бы, что в контексте Платформы Зенда и PHP это имеет много смысла передать модели в представление от контроллера, потому что состояние моделей в представлении часто зависит от того, что прибыло из запроса (который должен определенно быть обработан в контроллере).

Обновление: Согласно критическим замечаниям в комментариях, одна вещь, на которую я указал бы, состоит в том, что Ваш слой доступа к базе данных и домен (или модель) слой является действительно двумя разными вещами, хотя с Активной Записью они смешиваются вместе. Я задал этот вопрос некоторое время назад и получил некоторую полезную обратную связь по этому вопросу. Независимо от того, что Вы решаете сделать с моделью, Вы захотите обеспечить последовательный API для всех объектов области независимо от того, куда данные для модели прибывают из.

Я предполагаю, что одно преимущество, предлагаемое ответом Saem, - то, что он предлагает способность непосредственно отобразить свойства / функциональные возвращаемые значения от одного или нескольких объектов области до объекта представления. Теоретически использование в рамках представления затем похоже на это:

// Mapped from Model_User::_data->last_name and Model_User::_data->first_name
$this->name 
4
ответ дан 4 December 2019 в 20:25
поделиться

Если бы только другие разработчики собираются быть работой с шаблонами, я рекомендовал бы просто передать в моделях. Вот является ссылка на сообщение Jeff Atwood на MVC Пониманием Образцового Контроллера Представления

3
ответ дан 4 December 2019 в 20:25
поделиться

Это особенно не приспособлено к платформе зенда, но проблема является довольно общей в моем уме.

Кажется, что Вы находитесь на правильном пути, вместо трудного проводного соединения модели к представлению, в контроллере. У Вас были бы то абстрактное, особенно важное, если Вы отображаете тонну моделей или отображаете ту же модель много раз.

Что-то простое должно было бы записать набор отображения функций, которые будут прекрасны, если все, чего Вы избегали, отобразит то же самое много раз.

Если Вы хотели более общее решение, которое также обратилось, стараются не писать тот шаблонный код и сохранять вещи большим количеством DRY, я предлагаю создать класс картопостроителя.

Вы могли создать ViewModelMapper, который возьмет модель или несколько моделей и отобразит их на представление.

class ViewModelMapper
{
    public function __construct($view)
    {
        //set the properties
    }

    public function addModel($model, $overrideViewProperty = null)
    {
        //add the model to the list of models to map, use the view's property 
        // name to figure out what to map it to? Allow for an override just in case.
    }

    public function getMappedView()
    {
        //take the view, map all the models
    }
}

Вы могли затем инстанцировать это на своем контроллере и установить отображения, таким образом, контроллер управляет отображением все еще, но весь шаблон и кодирование логики централизованы, для всех карт контроллера, за исключением редких исключений.

3
ответ дан 4 December 2019 в 20:25
поделиться

Для хорошего чтения на образцовой архитектуре, прочитанной это сообщение. Это конкретно не говорит о представлении, но это определенно стоит считать.

Я закончил тем, что добавил a getViewClass() функционируйте к моим моделям. Контроллер вызывает эту функцию для получения защищенных переменных, к которым это иначе не имело бы доступа, и представление не должно волноваться о вызове никаких методов считывания.

//controller
$object = new Object();
$object->setName('Foo Bar');
$this->view->object = $object->getViewClass();

//view template
<h2><?= $this->object->name ?></h2>

Я не знаю, существует ли лучший способ сделать задание в Платформе Зенда, но это - одно решение.

1
ответ дан 4 December 2019 в 20:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: