2010-09-30 4 views
3

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

EDIT:

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

ответ

6

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

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


?> 
+0

Почему они обычно находятся на разных страницах с каркасами mvc? – johnny

+0

Когда вы делаете «include_once» выше, и вы запускаете php выше, я исправлю, что включает .html на текущей странице php выше? Почему не просто все это на одной странице? – johnny

+0

PHP не похож на C++ или C#, поскольку вы не включаете или не используете пространства имен (PHP 5.3 фактически имеет пространства имен). Когда вы используете include_once(), вы фактически добавляете этот скрипт на страницу. Основная причина, по которой вы нарушаете свои сценарии, - это логика программирования. – cdnicoll

0

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

+1

Почему они кажутся отдельными страницами? Например, CodeIgniter, у меня в аренду, явно имеет три php-страницы. – johnny

+0

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

+0

@simuri Я говорю, что полковник сказал, что они не отдельные страницы, и я говорю, что это потому, что я вижу три отдельные страницы и фактически редактирую три страницы. Я не уверен, что вы понимаете, что я имел в виду. – johnny

-2

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

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

+0

почему вы получили голос? – johnny

+0

@johnny, я не знаю себя! ;) –

+0

Downvote: 1. Smarty - один из самых дерзких шаблонов, когда-либо созданных. 2. Smarty не имеет ничего общего с View from MVC, потому что это всего лишь механизм шаблонов. – Crozin

2

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

+0

«Часть, ответственная за передачу данных между контроллером и представлением, является внутренним средством просмотра (или классом) для CodeIgniter. Он берет этот массив из контроллера и десериализует его для представления». Но как это делается? Как бы я сделал то же самое на самом базовом уровне с нуля? – johnny

+0

Используйте функцию php 'extract'. Это превратит ключи массива в отдельные переменные. См. Http://php.net/manual/en/function.extract.php. – villecoder

1

Надеюсь, что Джонни давно нашел ответ, который я ищу сейчас, но я могу дать представление о том, как сделать это неудовлетворительно! Вы можете передать одну информацию из одного файла (например, компонент «вид», который собирает данные, вводимые пользователем сайта) в другой файл (например, «модельный» компонент, который проверяет/проверяет данные формы и отправляет его обратно в форму для пересмотра или сохраняет его в базе данных). Значения форм могут быть отправлены через массивы 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> 

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

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

Это работа, но должно быть лучше, конечно? Я видел «напыщенность» от кого-то, говорящего, что вы должны просто использовать include, но я не могу понять, как делать разумно повседневную вещь, возвращаясь к началу страницы и воссоздавая ее в соответствии с новыми условиями. Например, если я просто зарегистрировал пользователя, я не хочу показывать приглашение на этот раз. Включает в себя беспроблемное условие условного добавления чего-либо на страницу, но я не нашел лучшего способа просто вернуться к вершине, чем выше. Кто-нибудь знает об этом? Как утверждает OP, Джонни и я хотим сделать то же самое, что и MVC, но не используем MVC-структуру любого типа. Существует несколько книг и руководств, которые просто используют вышеупомянутый метод «заголовки», кстати.

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

+0

может быть, вы найдете что-то хорошее. Благодарю. – johnny

1

Я сам боролся с этим вопросом. Через десять лет я вернулся к программированию 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; 
     } 
} 
+0

Спасибо. В итоге я тоже перевернулся. Слишком много волшебства во всем остальном. – johnny

Смежные вопросы