【问题标题】:GET and POST functions in PHP / CodeIgniterPHP / CodeIgniter 中的 GET 和 POST 函数
【发布时间】:2013-04-29 08:53:01
【问题描述】:

我(非常)喜欢 MVC,我正在尝试用当今所有主要的 Web 语言自学一个 MVC 架构框架。

我目前正在使用 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 中实现相同的功能?

谢谢

【问题讨论】:

  • 意思是你想用codeignitor检查get和post?
  • 不,我知道它可以像普通的 PHP 程序一样检查 GET 和 POST。但我特别问的是在同一个控制器中有两个同名的函数。一个将在请求类型为 GET 时运行,另一个在请求类型为 POST 时运行。
  • 你不能。这是 CI“控制器”操作的命名约定的限制。

标签: php codeigniter http-method


【解决方案1】:

我错过了什么吗?我怎样才能达到同样的目的 CodeIgniter?

如果你想学习如何在 PHP 中真正实现 MVC,可以向 Tom Butler articles学习。

CodeIgniter 实现了 Model-View-Presenter 模式,而不是 MVC(即使它这么说)。如果你想实现一个真正类似于 MVC 的应用程序,那你就走错了路。

在 MVP 中:

  • 视图可以是类或 html 模板。视图永远不应该知道模型。
  • 视图不应包含业务逻辑
  • Presenter 只是视图和模型之间的粘合剂。它还负责生成输出。

注意:模型永远不应该是单一类。它有许多类。我将它称为“模型”只是为了演示。

所以它看起来像:

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 模板,而是负责表示逻辑的类
  • 视图可以直接访问模型
  • 控制器不应生成响应,而是更改模型变量(即从 $_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();

【讨论】:

  • 我不知道汤姆巴特勒是谁,虽然我找到了他的博客并最终来到了这里,但他说的恰恰相反,不是吗?我希望他能够/会对此进行“辩论”。我不知道他会在哪里做。
  • 约翰尼:给我发电子邮件。 bad_boy 是对的,他的示例将应用程序状态(例如“正在编辑的记录的 id 是什么,或者正在显示的结果的搜索词是什么)存储在模型中,然后视图从模型而不是由控制器提供。上例中的数据流是正确的。
【解决方案2】:

这些参数只允许您检索GET 变量。如果要获取POST变量,需要使用CodeIgniter自动加载的Input库:

$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')
    }
}

注意,你也可以使用这个库来获取GETCOOKIESERVER变量:

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

【讨论】:

    猜你喜欢
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2011-05-07
    • 2016-10-18
    相关资源
    最近更新 更多