Php MVC表单数据提交给控制器

Php MVC表单数据提交给控制器,php,forms,model-view-controller,Php,Forms,Model View Controller,我正在设法部署一个非常简单的实现,其中包含一个注册表单,出于演示目的,我选择使用MVC模式 我的小问题是,当我按下submit按钮时,我希望通过控制器的适当方法处理提交的数据 例如: 在视图部分中,我声明如下形式: <form action="controller/validate" method="post"/> 我假设这是一个路由相关的事情,但我很好奇是否可以建议另一种方式 -- 问候, Theo通常,您可以通过一条路径(如POST/register)访问控制器。控制器操作

我正在设法部署一个非常简单的实现,其中包含一个注册表单,出于演示目的,我选择使用MVC模式

我的小问题是,当我按下submit按钮时,我希望通过控制器的适当方法处理提交的数据

例如:

在视图部分中,我声明如下形式:

<form action="controller/validate" method="post"/>

我假设这是一个路由相关的事情,但我很好奇是否可以建议另一种方式

--

问候,


Theo

通常,您可以通过一条路径(如
POST/register
)访问控制器。控制器操作在引导文件中分配给此路由。一些伪代码:

$framework->route('GET', '/register',
                  'RegistrationController::action_form');
$framework->route('POST', '/register',
                  'RegistrationController::action_submit');
另一种方法是将路由直接映射到控制器(有些框架会这样做,我相信Kohana就是其中之一),如下所示:

  • 路线:
    /注册/提交
  • 解析为:
    RegisterContoller::action\u submit()
  • 在操作方法中管理请求方法(
    GET
    POST
    PUT
    DELETE

对于小型站点,路由器可以像交换机语句一样简单,而不是完整的路由器:

switch($_SERVER['REQUEST_URI']) {
    case 'controller/validate':
        $view = new \Views\User\Registration();
        $controller = new \Controllers\UserRegistration($view);
        $method = 'validate';
        break;

    default:
        $view = new \Views\Error\NotFound();
        $controller = new \Controllers\Error($view);
        $method = 'notFound';
        break;
}

echo $controller->$method();
还要注意的是,与基于当前路径执行相对URL不同,您通常真正希望执行文档根的相对URL:

<form action="/controller/validate" method="post"/>

注意前面的斜杠


以上只是半伪代码的一个简单(未经测试)示例

谢谢你,卢卡斯。我目前正在寻找的是,是否有一种较短的路由选择方法。@thitami,它将最接近我提到的第二种方法。路由只是某事物的一个名称;您始终必须以某种方式为请求分配控制器。我的建议是自动映射如下请求:
/
映射到
Controller::action()
。注意名称的
控制器
后缀和
操作
前缀。这避免了公共调用其他类或方法(如
InternalClass::do\u something\u internal()
)。长时间使用框架的用户(比如我)在考虑裸PHP时似乎倾向于使事情过于复杂。是的,它不会是一个复杂的构建,因此您的回复非常接近我的要求。您是否建议将其创建为一个单独的文件(就不是控制器而言),将其集成到index.php中,或者采用另一种方式?@thitami每当我使用上述内容时,我都会在引导文件中执行此操作(在大多数应用程序中基本上是index.php文件)。引导文件完成了应用程序运行所需的所有初始化。我可能会将其放入类似于
bootstrap.php
的文件中,并将其包含在
index.php
中。不过,我还是会考虑将来的扩展(比如多个前端控制器——可能是
debug.php
)。在您的情况下,
index.php
可能就足够了。谢谢大家。非常感谢你的帮助。我接受佩哈的回答。