Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在面向对象的PHP中使用MVC时的控制器问题_Php_Model View Controller_Search_Get - Fatal编程技术网

在面向对象的PHP中使用MVC时的控制器问题

在面向对象的PHP中使用MVC时的控制器问题,php,model-view-controller,search,get,Php,Model View Controller,Search,Get,我目前正在用面向对象的PHP编写一个使用MVC的书店,我很难弄清楚控制器在处理请求时应该如何工作,尤其是在处理表单时 例如,我有一个在用户访问index.php?action=search时显示的搜索表单,但是我不确定应该如何处理表单中的搜索字符串,因为我无法发送$_GET['action']=再次搜索,以便将index.php?action?search=searchstring发送到浏览器,以便显示搜索结果,而不使用隐藏字段发送搜索操作,这当然是非常不安全的 我觉得这对它的价值来说是太多的努

我目前正在用面向对象的PHP编写一个使用MVC的书店,我很难弄清楚控制器在处理请求时应该如何工作,尤其是在处理表单时

例如,我有一个在用户访问index.php?action=search时显示的搜索表单,但是我不确定应该如何处理表单中的搜索字符串,因为我无法发送$_GET['action']=再次搜索,以便将index.php?action?search=searchstring发送到浏览器,以便显示搜索结果,而不使用隐藏字段发送搜索操作,这当然是非常不安全的

我觉得这对它的价值来说是太多的努力了,到目前为止,proceedural似乎是一种更好的尝试方式!!除非你能说服我,否则

谢谢


Dan.

在您的情况下,实际上应该使用额外的参数重定向。例如,使用index.php?action=search&q=searchstring。这将保留仅基于动作参数调用正确控制器的能力


至于MVC部分,你是对的。这是对网络应用的支持。但是您可以阅读Model View Presenter,它更像是每个人都在做的事情。

index.php没有问题吗?action=search&q=WHATEVER,使用以下HTML完成:

<form method="GET" action="index.php">
<input type="hidden" name="action" value="search" />
Search: <input type="text" name="q" />
<!-- ... -->
搜索引擎大致就是这样做的,只是它们使用URL重写来使URL更漂亮。例如,Bing对测试的搜索是


当您第一次学习MVC时,它可能看起来很麻烦,但它确实是一种高效、方便的web开发模式,远远优于过程式web开发。

您应该了解,PHP中的MVC模式通常是这样设置的:

您有两个关键变量:

班 方法 他们总是默认:

类别=索引 方法=索引 因此,当参数类被传递到URI中时,它会覆盖默认值,因此使用index.php?class=view时,上述内容将变为:

类=视图 方法=索引 在这里,您可以运行class view.php并将view类初始化为一个对象,然后执行如下方法:

class View/*_Controller extends Controller*/
{
     public function index(){}
}
传递的任何其他变量都可以通过GET请求或POST获得

您还应该注意,这通常是通过URL语法中的URI来处理的,因此下面的index.php?action=view&method=download变为/view/download/

在类/方法之后,URI中的任何内容都将被发送到该方法,如下例

/view/download/id/browser
这将执行以下方法并在上下文中传递变量的值

class View/*_Controller extends Controller*/
{
     public function download($id,$direction)
     {
     }
}
现在我知道这不是你的问题的具体内容,但我认为你在事情上走错了方向,这应该有助于你开始将你的框架设计成一个可管理的结构

使现代化 由GET/POST使用路由器初始化的控制器,路由器是一个类,它从URI检测类/方法,然后找到正确的控制器并与其方法一起执行

路由器的示例如下所示:

class Router
{
    //Params
    public $route;

    public static function CreateRoute($route = false)
    {
        return new Router($route);
    }

    public function __construct($route = false)
    {
         if($route !== false)
         {
              $this->route = $route;
         }else
         {
             $this->route = $_SERVER['REQUEST_URI'];
         }

         /*
             * The route would be parsed so that the following are matched
             * {/class}{/method}{/param1}{/param1}
             * /view/download/12/direct | as example
         */
    }


    public function run()
    {
        /*
            * Here you would do the following:
            * Validate the class to make sure no one is triggering an LFI
            * Make sure the class file exists within the directory
            * Include the class file and create an instance of it
            * Execute the method  sending in the params.
        */
    }
}
这样的用法:

$Route = Router::CreateRoute(); //AutoDetect
$Route->run();
请看下图,这可能有助于您理解。

重定向是什么意思??我不能将其添加到html表单中的action参数中,因为它不允许我这样做,我也看不到任何其他方法…@DanielWest:我们可以使用隐藏的表单字段。我看不出有什么问题,也不知道是什么给你的印象这是非常不安全的。有人告诉我这是不安全的,因为它容易受到JavaScript注入的攻击,还有人保存页面并对其进行篡改…@DanielWest:这是错误的建议。可以篡改所有$\u GET参数以及所有$\u POST参数。用户可以修改URL或表单字段,没有区别。应用程序应该做的只是尊重允许的值。使用一些处理方案,如if$_GET[action]==搜索或对象/函数的简单调用映射,就像FrontController logic@Robert所描述的那样。为了防止Javascript注入XSS只需使用htmlspecialchars…,转义所有用户输入,utf-8应该再次输出它。谢谢,我认为这是一种方法,尽管有人告诉我这是不安全的,不是最好的方法…@DanielWest:你需要注意的一件事是,如果用户在URL中键入垃圾作为动作参数值。也许这就是那个人所说的不安全感。即使如此,这也是一个延伸,因为大多数MVC框架自动提供某种形式的保护。谢谢,这更有意义。我模模糊糊地记得RubyonRails是如何工作的,我想这在另一种语言中是相同的概念。虽然,我仍然不完全理解控制器是如何处理$\u POST和$\u GET请求的,但这都是使用mod\u rewrite完成的吗??