Передача переменных в шаблоне MVC - PullRequest
5 голосов
/ 14 апреля 2009

Я построил систему, которая соответствует шаблону mvc в PHP. Контроллеры и действия являются частью URL в моем приложении. Итак, у меня есть:

www.example.com / контроллер / действие /

Так что теперь я ищу способ передачи переменных. Для форм я просто использую метод post, но иногда мне просто хочется сослаться на другую страницу и затем передать некоторые переменные.

Мне бы хотелось несколько советов о том, как это сделать. Я знаю, что Zend Framework имеет переменные в виде пар ключ / значение после действия в контроллере с использованием символа «/» в качестве разделителя, например:

www.example.com / controller / action / var1 / value1 / var2 / value2

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

Любые предложения приветствуются.

Ответы [ 7 ]

5 голосов
/ 14 апреля 2009

Такие фреймворки, как CodeIgniter, позволяют передавать переменные в контроллер, не раскрывая имя переменной -

/controller/action/foo/bar/

будет обработано как:

function action( $id, $value){
  echo $id; // outputs 'foo'
  echo $value; // outputs 'bar'
}

http://codeigniter.com/user_guide/general/controllers.html

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

3 голосов
/ 14 апреля 2009

var1/value1/var2/value2 на самом деле не лучший подход, и он использует структуру MVC controller/action/id. Либо вам нужно переосмыслить свой дизайн, использовать POST или параметры запроса. Скорее всего, вы можете переделать дизайн, например, если у вас есть

/search/type/movie/format/divx/year/2000

Вы можете повторить это как

/movie/divx?year=2000

Таким образом, ваш movie контроллер будет искать фильмы формата divx, а затем, возможно, использовать вспомогательный или фильтр, или скрипт на стороне клиента, чтобы показывать только фильмы, которые соответствуют году == 2000.

1 голос
/ 14 апреля 2009

То, что мне нравится использовать в моих проектах CakePHP, это «именованные параметры». По сути, мои URL выглядят так:

http://example.com/controller/action/param1:value1/param2:value2

Вы можете увидеть еще несколько примеров в руководстве Cake . Я не знаю, поддерживает ли ваш фреймворк это (или Zend), но если пекари сделали это, то можно сделать. : -)

1 голос
/ 14 апреля 2009

Я бы избегал подхода «ключ / значение» в стиле Zend, который вы упомянули ранее. Проблема в том, что создание двух разных URL становится тривиальным

http://www.example.com/controller/action/var1/value1/var2/value2 
http://www.example.com/controller/action/var2/value2/var1/value1

, которые указывают на тот же ресурс. Хотя это работает, часть успеха сред стилей MVC для веб-приложений заключается в том, что они упрощают предоставление чистой структуры URL-адресов и привязывают один URL-адрес на вашем сайте к каждому ресурсу. Подход var1 / value1 / var2 / value2 предлагает небольшое преимущество по сравнению со строками запроса ключ / значение.

Подход, который я выбрал бы здесь, состоит в том, чтобы отказаться от ключей и просто использовать значения

http://www.example.com/example/list/value1/value2/value3

, который будет передан в метод действия в виде массива

class example extends Controller{ 
    public function list($args){
        //$args[0] = 'value1';
        //$args[1] = 'value2';      
        //$args[2] = 'value3';              
    }
}

Делая это таким образом, вы предоставляете конечным пользователям вашей системы право решать, как они хотят обрабатывать переменные в стиле $ GET, и в то же время поощряете дизайн, который ведет к более чистым, более стабильным URL-адресам из одного ресурса.

1 голос
/ 14 апреля 2009

В зависимости от вашего проекта, вы также можете попробовать установить и прочитать значения, используя сеансы PHP. Эти значения не должны передаваться от сценария к сценарию как значения GET или POST. Недостатком (или положительной стороной) является то, что переменные нельзя просто передать как часть URL (или добавить в закладки).

1 голос
/ 14 апреля 2009

Вы также можете выполнять запросы GET следующим образом:

www.site.com / контроллер / действие? Var1 = значение1 & var2 = значение2

Они появятся в суперглобальном символе $ _GET.

1 голос
/ 14 апреля 2009

У вас есть возможность передавать переменные через GET или POST.

GET будет добавлять переменные к URL, либо в симпатичном формате

 /controller/action/var1/value1/var2/value2

или традиционным способом

 /controller/action/?var1=value1&var2=value2

В первом случае вам все равно нужно будет написать правило перезаписи Apache для извлечения переменных из URL-адреса и маршрутизации к контроллеру / действию с правильным набором переменных как часть вашего $ _REQUEST.

Если вы используете POST, вы можете добавить скрытые значения в каждую форму для передачи переменных.

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

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