Как вы передаете значения между страницами PHP для MVC? - PullRequest
3 голосов
/ 30 сентября 2010

Как программы PHP передают значения между страницами модели, представления и контроллера? Например, если у контроллера есть массив, как он передает его в представление?

EDIT:

Спасибо за ваши ответы. Я вижу, что некоторые из них заявляют, что компоненты находятся на одной странице, но когда я смотрю на что-то вроде CodeIgniter, я вижу три отдельные страницы PHP для модели, представления и контроллера.

Ответы [ 6 ]

6 голосов
/ 30 сентября 2010

Обычно ваш контроллер создает объект представления, и когда он создает этот объект представления, он передает информацию.

<?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');
    }
}


?>
2 голосов
/ 30 сентября 2010

CodeIgniter, как и большинство сред PHP MVC, поставляется с «движком» View. Другими словами, в платформе есть класс, отвечающий за загрузку и передачу данных из вашего контроллера в представление.

Специфично для 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 может сделать сайт красивым, пока вы выясните, почему пользователь не может войти, например.

1 голос
/ 03 июня 2015

Я боролся с этим вопросом сам. Я вернулся к программированию php спустя почти десятилетие. Я столкнулся с несколькими проблемами, связанными с развертыванием PHP MVC-фреймворков на экспериментальном сервере, и в итоге сам создал простой вариант MVC.

В моем простом (переднем) дизайне контроллер взаимодействует с моделью для заполнения объекта полезной нагрузки и передает его в представление. Каждое представление реализовано в отдельном файле PHP, поэтому контроллер использует include , чтобы «загрузить» желаемое представление. Затем представление может получить доступ к данным через назначенное имя ($ 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;
        }
}
1 голос
/ 09 сентября 2012

Я надеюсь, что Джонни давно нашел ответ, который я ищу сейчас, но я могу дать представление о том, как сделать это неудовлетворительно! Вы можете передать одну информацию из одного файла (скажем, компонент «просмотр», который собирает данные, вводимые пользователем сайта) в другой файл (скажем, компонент «модель», который проверяет / проверяет данные формы и отправляет их обратно в форму). для проверки или сохраняет его в базе данных). Значения формы могут быть отправлены через массивы POST или GET, а атрибут 'action' определяет, какой файл получает данные, например,

<form action = 'form-exec.php' method = 'POST'>
---some set of  possible user inputs goes here
<input name='submit' type='submit' value='Go'>
</form>

После обработки вы, возможно, захотите вернуть некоторые данные в форму, например, пользовательские вводимые значения, которые необходимо изменить, или сообщение об успешном завершении. Вы можете сохранить эти данные в переменных сеанса и восстановить их из этих переменных на странице просмотра. Итак, как вы вернетесь на страницу просмотра? Теперь я здесь, потому что я видел это использованным и использовал его сам, но был довольно испуган, чтобы прочитать, что, по-видимому, передача происходит через медленный запрос http в Интернете - даже если передача в файл в том же самом каталог на сервере! Итак, неудовлетворительный способ вернуться к вашему компоненту 'view' - это пара строк PHP вроде этого:

header("location: theinputform.php");
    exit;

Это работает, но должен быть лучший способ, конечно? Я видел «напыщенную речь» от кого-то, говорящего, что вы должны просто использовать включение, но я не могу понять, как сделать достаточно повседневную вещь - вернуться наверх страницы и воссоздать ее в соответствии с новыми условиями. Например, если я только что вошел в систему как пользователь, я не хочу показывать приглашение войти в этот раз. Включения - легкая задача для условного ДОБАВЛЕНИЯ чего-либо к странице, но я не нашел лучшего способа просто возвратиться к вершине, чем выше. У кого-нибудь есть понимание или знания по этому поводу? Как утверждает ОП, мы с Джонни хотим сделать то же самое, что и MVC, но не используем какую-либо инфраструктуру MVC. Есть несколько книг и учебных пособий, которые просто используют вышеупомянутый метод «заголовков», кстати.

Хорошо, отредактируйте: вы переходите от формы (то есть страницы просмотра) к обработке формы, используя атрибут формы действия, как описано выше. Если страница «model» не выводит html и просто «делает что-то», вы можете просто включить страницу «view», на которую вы хотите перейти (или вернуться) по завершении. Во всяком случае, я так думаю! Просто собираюсь попробовать это ...

0 голосов
/ 30 сентября 2010

вы можете использовать шаблонизатор, такой как smarty , для отделения представлений от контроллеров и моделей.

и передачи переменных в шаблон с использованием, например, метода назначения smarty.

0 голосов
/ 30 сентября 2010

модель, представление и контроллер - это не отдельные страницы, а одна страница.
Таким образом, не нужно ничего «пропускать»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...