Как обработать шаблоны для веб-сайтов MVC?

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

let (|ValidInt|ValidString|Invalid|) (value:obj) = 
    match value with
    | :? int as x -> if x > 0 then ValidInt x else Invalid
    | :? string as x -> if x.Length > 0 then ValidString x else Invalid
    | _ -> Invalid

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

match someValue with
| ValidInt x -> // ...
| _ -> // ...
6
задан hakre 14 November 2011 в 11:35
поделиться

6 ответов

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

5
ответ дан 17 December 2019 в 07:10
поделиться

Да, у Вас должны быть заголовок, нижний колонтитул, и т.д. разделение.

Для конкретного примера Вы показываете, разве это не работало бы лучше?

    require "templates/header.php";
    require "templates/navigation.php";
    require "views/$page.php";
    require "templates/footer.php";

(Где $page 'домой', 'поиск', и т.д.),

1
ответ дан 17 December 2019 в 07:10
поделиться

Вот упрощенная версия того, как я делаю шаблоны со своим текущим проектом, если это - какое-либо использование:

class Template {
    var $pagename = 'index';

    function __construct() {
        $this->pagename = basename($_SERVER['SCRIPT_NAME'], '.php');
        register_shutdown_function(array($this, 'do_output'));
    }

    function do_output() {
        $this->header();
        $this->display($this->pagename);
        $this->footer();
    }

    function __call($template, array $params) {
        call_user_func(array($this, 'display'), $template, params);
    }

    function display($template, array $params = null) {
        include "templates/$template.php";
    }
}

Идея позади него состоит в том, что можно записать, "включают 'Template.inc'; новый Шаблон"; и это принимает меры, чтобы do_output () работал в конце сценария автоматически. Существует несколько вещей, оставленных из него как метод, используемый для передачи переменных шаблону.

Вы упомянули, что не используете PHP, и там существует несколько PHP-измов: register_shutdown_function () удостоверяется, что шаблоны называют перед объектными деструкторами, но после основного сценария и вызовов к $this-> заголовок () / нижний колонтитул () волшебные вызовы функции, которые просто отображаются ('заголовок') и дисплей ('нижний колонтитул'), они предназначены, чтобы быть переопределенными.

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

require "templates/header.php";
require "templates/navigation.php";
switch ($page)
{
    case "home":
        require "views/home.php";
        break;
    case "search":
        require "views/search.php";
        break;
}
require "templates/footer.php";

... или Вы могли заменить переключатель () с чем-то на основе имени файла как, я использовал выше, если это работает на способ, которым настраиваются Ваши страницы. Переключатель является самым безопасным путем, если Вы планируете выполнение его через параметры URL все же.

0
ответ дан 17 December 2019 в 07:10
поделиться

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

require "templates/header.php";
require "templates/navigation.php";

switch ($page) {
    case "home":
        require "views/home.php";
        break;
    case "search":
        require "views/search.php";
        break;
}

require "templates/footer.php";

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

0
ответ дан 17 December 2019 в 07:10
поделиться

Если Вы используете прямые страницы PHP в качестве своих шаблонов, Вы могли бы по существу установить глобальную / переменную сеанса для содержания страницы, которую Вы хотите. У Вас был бы "основной шаблон" php страницей, которая включает заголовок и элементы нижнего колонтитула, затем называет включение за $page. Что-то вроде этого в контроллере:

$_SESSION['page'] = sanitize_input($_GET['page']);
require "templates/main.php";

и затем в main.php обрабатывают файл по шаблону:

require "templates/header.php";
require "templates/navigation.php";
require "views/{$_SESSION['page']}.php";
require "templates/footer.php";
-2
ответ дан 17 December 2019 в 07:10
поделиться

Я соглашаюсь с tvanfosson и хочу объяснить, почему и как он касается MVC.

Проблема с Вашим вторым примером состоит в том, что контроллер выставляется тому, как представление создается. В строгом смысле контроллер упорядочивает исходные данные для представления и передает их ему и ничто больше.

Практический образ мыслей этого - то, если представление смещается в зависимости от требований к приложению или самих исходных данных. Например, если сгенерированное представление для всплывающего окна JavaScript, оно могло бы (и вероятно будет) использовать другой набор заголовков, нижних колонтитулов, CSS, meta, и т.д. С Вашим вторым примером, все, что выставляется контроллеру. В Вашем первом это - представление, кто знает, как генерировать представление - который является точно точкой.

Для взятия моего примера далее предположите, что всплывающее окно JavaScript перепроектировано, чтобы быть полностраничным представлением или пересмотрено для Ajax (или ПОЯВЛЯЮЩАЯСЯ/СТРАНИЦА/AJAX вопрос определяется исходными данными, такими как скрытый элемент в поле). Теперь Вы разрываете контроллер, потому что представление изменилось. Это не так, что Вы нарушили MVC, но Вы не должны были беспокоиться им во-первых.

0
ответ дан 17 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

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