2013-04-29 3 views
2

Мне нравится MVC (много), и я пытаюсь научить себя структуре MVC-архитектуры на всех основных веб-языках сегодняшнего дня.Функции GET и POST в PHP/CodeIgniter

Я в настоящее время на CodeIgniter и PHP. Я искал в Интернете способ, чтобы одна и та же функция отличалась для POST и GET, но ничего не могла найти. Имеет ли CodeIgniter эту функцию?

Если вы использовали Ruby On Rails или ASP.NET MVC вы будете знать, что я говорю о том, в их каркасов мы можем сделать это:

[GET] 
public ActionResult Edit(int Id) 
{ 
    // logic here for GET 
} 

[POST] 
public ActionResult Edit(EntityX EX) 
{ 
    // logic here for POST 
} 

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

Я что-то упустил? Как я могу добиться того же в CodeIgniter?

Благодаря

+0

означает, что вы хотите проверить, получить и отправить с помощью codeignitor? –

+0

Нет, я знаю, что он может проверить GET и POST, как это делает обычная программа PHP. Но я специально задавал вопрос о наличии двух функций с тем же именем в одном контроллере. Один будет выполняться, когда запрос имеет тип GET, а другой, когда запрос имеет тип POST. – Ciwan

+2

Вы не можете. Это ограничение в соглашении именования для действий контроллера «CI». –

ответ

4

Я что-то упустил? Как я могу добиться того же в CodeIgniter?

если вы хотите узнать, как по-настоящему приблизиться к MVC в PHP, вы можете узнать его от Тома Батлера articles

CodeIgniter реализует Model-View-Presenter шаблон, а не MVC (даже если это так). Если вы хотите реализовать действительно MVC-подобное приложение, вы ошибетесь.

В MVP:

  • View может быть классом или шаблон HTML. В представлении никогда не должно быть известно о модели.
  • Вид не должен содержать бизнес-логику
  • Презентатор - это всего лишь клей между представлением и моделью. Он также отвечает за производство продукции.

Примечание: Модель никогда не должна быть сингулярного класса. Его несколько классов. Я назову его «Модель» только для демонстрации.

Так это выглядит следующим образом:

class Presenter 
{ 
    public function __construct(Model $model, View $view) 
    { 
     $this->model = $model; 
     $this->view = $view; 
    } 

    public function indexAction() 
    { 
     $data = $this->model->fetchSomeData(); 

     $this->view->setSomeData($data); 

     echo $this->view->render(); 
    } 
} 

В MVC:

  • просмотров не являются шаблонами HTML, но классы, которые отвечают за логику представления
  • взгляд имеет прямой доступ к модели
  • Контроллер не должен генерировать повторно sponse, но изменение модели переменных (то есть назначить ВАР из $_GET или $_POST
  • Контроллер не должен знать о целях

Например,

class View 
{ 
    public function __construct(Model $model) 
    { 
     $this->model = $model; 
    } 

    public function render() 
    { 
     ob_start(); 

     $vars = $this->model->fetchSomeStuff(); 

     extract($vars); 

     require('/template.phtml'); 

     return ob_get_clean(); 
    } 
} 

class Controller 
{ 
    public function __construct(Model $model) 
    { 
     $this->model = $model; 
    } 

    public function indexAction() 
    { 
     $this->model->setVars($_POST); // or something like that 
    } 
} 

$model = new Model(); 
$view = new View($model); 

$controller = new Controller($model); 

$controller->indexAction(); 

echo $view->render(); 
+0

Я не знаю, кто Том Батлер, хотя я нашел его блог, и я оказался здесь, но он говорит, что наоборот? Хотелось бы, чтобы он мог «обсудить» об этом. Где бы он этого не сделал, я не знаю. – johnny

+1

johnny: напишите мне. bad_boy прав, хотя в его примере есть состояние приложения (например, «какой идентификатор редактируемой записи или какой поисковый термин для отображаемых результатов), хранящийся в модели, и имеет представление, затем получая свои данные из а не подавать его контроллером. Поток данных в приведенном выше примере верен. –

2

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

$this->input->post('data'); 

Таким образом, в вашем случае, это было бы:

public function edit($id = -1) 
{ 
    if($id >= 0 && is_numeric($id)) 
    { 
     // logic here for GET using $id 
    } 
    else if($id === -1 && $this->input->post('id') !== false) 
    { 
     // logic here for POST using $this->input->post('id') 
    } 
} 

Обратите внимание, что вам можно также использовать эту библиотеку, чтобы получить GET, COOKIE и SERVER переменные:

$this->input->get('data'); 
$this->input->server('data'); 
$this->input->cookie('data');