Как программы PHP передают значения между страницами модели, представления и контроллера? Например, если у контроллера был массив, как он передает это представление?
РЕДАКТИРОВАТЬ:
Спасибо за ответы. Я вижу, что несколько из них заявили, что компоненты находятся на одной странице, но когда я смотрю на что-то вроде CodeIgniter, я вижу три отдельные страницы PHP для модели, представления и контроллера.
Обычно ваш контроллер создаст объект вида и когда он создаст этот объект вида, он передает информацию.
<?php class Controller { public function __construct() { $arr = array("a","b","c"); $myView = new View($arr); } } class View { private $content; public function __construct($content) { $this->content = $content; include_once('myPage.inc.html'); } } ?>
CodeIgniter, как и большинство фреймворков PHP MVC, поставляется с представлением «движок». Другими словами, в структуре, отвечающей за загрузку и передачу данных с вашего контроллера на представление, есть класс.
Конкретные для CodeIgniter, эти вызовы выглядят следующим образом:
$data = array( 'title' => 'My Title', 'heading' => 'My Heading', 'message' => 'My Message' ); $this->load->view('blogview', $data);
Тогда ваше представление будет отдельной php-страницей, в этом случае blogview.php
. Это может выглядеть так:
<html> <head><title><?= $title ?></title></head> <body> <h2><?= $heading ?></h2> <p><?= $message ?></p> </body> </html>
Часть, ответственная за передачу данных между контроллером и представлением, представляет собой механизм просмотра (или класса), внутренний для CodeIgniter. Он берет этот массив из контроллера и десериализует его для представления.
Так почему два отдельных файла? Парадигма MVC такова, что по дизайну вы хотите, чтобы ваша бизнес-логика была отделена от вашего пользовательского интерфейса. Вам не нужно включать часть модели MVC, если вы мало что делаете с базой данных. Но это там, когда вы хотите еще больше отделить части доступа к данным вашего кода от своей бизнес-логики (материал, который манипулирует данными для пользователя). В этом случае у вас есть 3 отдельных файла; модель, контроллер, вид.
Так что нет, компоненты не все находятся на одной странице, хотя они, безусловно, могут быть. Но структурируя свою программу с помощью MVC, вы четко и аккуратно отделяете операции своего приложения. Таким образом, вы можете работать в одном слое за раз, не воздействуя на другие слои. Ваш пользователь CSS может заставить сайт выглядеть красиво, пока вы выясните, почему пользователь не может войти в систему, например.
Я надеюсь, что Джонни уже давно нашел ответ, который я ищу сейчас, но я могу дать понять, как сделать это неудовлетворительно! Вы можете передать одну информацию из одного файла (например, компонент «вид», который собирает данные, вводимые пользователем сайта) в другой файл (например, «модельный» компонент, который проверяет / проверяет данные формы и отправляет его обратно в форму для пересмотра или сохраняет его в базе данных). Значения форм могут быть отправлены через массивы POST или GET, а атрибут «действие» определяет, какой файл получает данные, например
<form action = 'form-exec.php' method = 'POST'> ---some set of possible user inputs goes here <input name='submit' type='submit' value='Go'> </form>
После обработки вы можете захотеть вернуть некоторые данные в форму – например, вводимые пользователем значения, которые необходимо изменить, или сообщение об успешном завершении. Вы можете сохранить эти данные в переменных сеанса и восстановить их из этих переменных на странице просмотра. Итак, как вы вернетесь на страницу просмотра? Теперь я здесь, потому что я видел, что это использовалось и использовало его самостоятельно, но было очень ужасно читать, что, судя по всему, передача проходит через медленный интернет-запрос в интернете – даже когда передача осуществляется в файл в том же каталог на сервере! Хорошо, поэтому способ UNSATISFACTORY вернуться к вашему компоненту «view» – это пара строк PHP, подобных этому:
header("location: theinputform.php"); exit;
Он действительно работает, но должен быть лучший способ, конечно? Я видел «напыщенность» от кого-то, говорящего, что вы должны просто использовать include, но я не могу понять, как делать разумно повседневную вещь, возвращаясь к началу страницы и воссоздавая ее в соответствии с новыми условиями. Например, если я просто зарегистрировал пользователя, я не хочу показывать приглашение на этот раз. Включает в себя беспроблемное условие условного добавления чего-либо на страницу, но я не нашел лучшего способа просто вернуться к вершине, чем выше. Кто-нибудь знает об этом? Как утверждает OP, Джонни и я хотим сделать то же самое, что и MVC, но не используем MVC-структуру любого типа. Существует несколько книг и руководств, которые просто используют вышеупомянутый метод «заголовки», кстати.
Хорошо, отредактируйте: вы получаете форму (например, страницу «просмотр») в обработку формы, используя атрибут «действие» формы, как указано выше. Если на странице «model» нет html и просто «что-то», вы можете просто добавить страницу «просмотра», к которой вы хотите перейти (или вернуться к ней) при завершении. Я так думаю, во всяком случае! Как раз попробовать это …
Я сам боролся с этим вопросом. Через десять лет я вернулся к программированию php. Я столкнулся с несколькими проблемами, развертывая фреймворки PHP MVC на экспериментальном сервере, поэтому я сам создал простой вариант MVC.
В моем простом дизайне (фронт) контроллер взаимодействует с моделью, чтобы заполнить объект полезной нагрузки и передать ее в представление. Каждое представление реализовано в отдельном PHP-файле, поэтому контроллер использует, чтобы «загрузить» желаемый вид. Затем представление может получить доступ к данным через назначенное имя ($ dataId) для объекта полезной нагрузки.
class Controller { public $model; ... public function display($viewId,$dataId,$data) { $url = $this->getViewURL($viewId); $this->loadView($url,$dataId,$data); } public function getViewURL($key) { $url = 'view/list_view.php'; if($key == 'create') { $url = 'view/create_view.php'; } else if($key == 'delete') { $url = 'view/delete_view.php'; } return $url; } public function loadView($url,$variable_name, $data) { $$variable_name = $data; include $url; } }
модель, представление и контроллер не являются отдельными страницами, а одной страницей.
Поэтому нет необходимости «пропускать» что-либо
u может использовать механизм шаблонов, например smarty, для разделения представлений от контроллеров и моделей.
и передавать переменные в ваш шаблон, используя метод присваивания smarty, например.