如何做MVC表单url格式化?

问题描述 投票:3回答:10

我正在使用PHP。我想从头开始创建一个MVC设置,以了解有关MVC如何工作的更多信息。我想使用带有斜杠的干净网址作为参数的分隔符。在GET方法表单中,人们如何做到这一点?或者人们一起避免GET方法形式?

截至目前,我可以想象的方式是:

  1. 不要使用GET方法表单(尽管这使得用户在某些情况下更难以书签/链接)。
  2. 使用AJAX而不是表单提交(虽然你为SEO和JS禁用者做了什么?)。
  3. 让页面使用post方法提交给自己,然后将post vars改为url,然后使用header重新注入该url(似乎浪费了资源)。

任何建议或建议阅读欢迎。

php model-view-controller forms rest url-routing
10个回答
3
投票

获取变量和干净的URL不会相互矛盾。你总是可以拥有像这样的URL

http://example.com/controller/action?value1=foo&value2=bar

另一种URL样式也可能是这样的

http://example.com/controller/action/value1/foo/value2/barhttp://example.com/controller/action/foo/bar

在这两种情况下,如果您想通过表单GET提交创建这些URL,则必须使用JavaScript来组合正确的URL,因此第一个解决方案可能更容易实现。

另一个问题是POST和GET表单提交之间的决定。 POST更安全,但正如您所说,用户无法为其添加书签。


0
投票

嘿dqhendricks,我正在做你正在做的事情 - 通过研究其他框架并从头开始创建一个来学习MVC。

首先,您不应该使用GET来处理任何表单数据。请改用POST或PUT。 POST仅用于从Web服务检索信息。您可以在GET中使用操作来操纵要检索的信息(例如排序顺序,页面等)。

关于你的观点:

1)不要使用GET方法表格

正确。首先听起来不正确,为了得到某个视图你必须使用一个表格。

2)使用AJAX而不是表单提交

究竟。您的表单和URL应该在有和没有JS的情况下工作。

3)使用post方法将页面提交给自己,然后将post vars改为url,然后使用header重新注入该url(似乎浪费了资源)。

我不会说这是浪费资源。您的应用只需几毫秒。事实上,这正是我最终要做的事情。当前端控制器检测到POST的使用时,它会将其发送给Controller,后者对提交的数据执行必要的操作。根据结果​​,应用程序重定向客户端,或呈现请求的页面(无重定向)。是的,对于任何URL,它的工作方式相同。

同时,如果在URL中找到某个参数,则前端控制器将分派给各自的控制器。但这绝不会用于以任何方式处理数据。例如,当您在移动浏览器中浏览时要使用www时,这用于记住首选域(www或移动设备)。

此外,IMO你可以说浪费的资源将是APP决定重定向的位置(或在HTTP查询或PHP会话中传递重定向URL)。无论如何,它需要开发时间和服务器资源来实现替代方法。

因此,在我看来,#3是要走的路。


6
投票

你可以使用像这样的.htaccess文件

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
</IfModule>

所以...如果网址是

http://example.com/controller/action/param1/

你可以路径控制器和动作,index.php接收var url [string] 你可以拆分它们来加载控制器...就像

$params = explode('/', $_GET['url']);
$controller = new $params[0];//load the controller
$controller->$params[1]($params[2]);//ejecute the method, and pass the param

3
投票

根据我的理解和我的个人经验,你的3点都不适用于如何处理MVC模式:

  1. 这是一个关于主题http://www.w3.org/2001/tag/doc/whenToUseGet.html的好的和优雅的,基本上,如果结果URL与内容相对应,get是要走的路,例如,不要使用GET传递你想要保存的信息,不要使用POST做传输您要向用户显示的内容ID。它的所有关于Url模式,并重写,你可以从zend框架路由器http://framework.zend.com/manual/en/zend.controller.router.html得到一些灵感基本上不是/?id=123/weird-article-slug-123相同,当你知道你的URL模式是^[\w\d-]+([\d]+)$
  2. 不,抱歉,AJAX是最常用的一种使用JS的方式,所以你的AJAX函数只能利用你的MVC后端应用程序,就像你的“普通”HTML交互一样。
  3. 那确实是“浪费的资源”

2
投票

Cfreak回答这个问题的最佳方法是让你深入了解各种PHP框架源代码,看看他们是如何实现MVC方法的。我使用的PHP框架通常排除GET数据并依赖于POST数据。但是,可以通过查询字符串传递信息,请参阅下面的示例。

通常,PHP MVC框架中的URL看起来像这样:example.com/index.php/controller/action/arguments。通常使用.htaccess文件删除index.php部分。您的控制器是一个类,很可能继承自某种父控制器类。你的控制器有你喜欢的动作/方法,接下来叫做。您可以通过将这些参数添加到URL上来传递这些方法参数,通常是一些无限制的参数。我希望这有助于您了解结构的基本概念。一切都从index.php开始,它将包括你需要的所有配置文件,以及你可能需要的加载和必需的类:)


2
投票

你所指的URL实际上与MVC没什么关系。它是REST架构的一种实现。 (Wiki Article

基本上,不是使用会话,每个URL应包含服务器创建请求所需的所有信息。

有几种方法可以做到这一点:

您可以使用Apache的mod_rewrite将PATH重写为正确的GET参数。例如,假设您有一个通常通过以下方式访问的用户管理模块:

http://your.domain/users.php?request=edit&id=<some id>

你可以放入Apache:

RewriteRule ^users\/edit\/(\d+) /users.php?request=edit&id=$1

然后,这将允许您使用以下内容处理相同的请求:

http://your.domain/users/edit/<some id>

(假设ID是一个数字)

如果您希望发出的所有请求都非常简单,那么这很容易。如果它们更具动态性,那么设置它就变得更加困难。另一个缺点是,如果您想要发布新框架,则需要您的用户至少具有通过.htaccess文件修改Apache配置的能力。情况可能并非总是如此。

另一种方法是在代码中编写逻辑来解析URL。在这种情况下,您通常需要一个适用于整个站点的控制脚本。 URL将类似于:

http://your.domain/users.php/edit/<some_id>

<?php

// get the part that appears after the script name
$parts = explode("/", $_SERVER['PATH_INFO'] );

$request = $parts[1];
$id = $parts[2];

// do somethign with the $request and the $id 

?>

正如您所看到的,我的示例是简单的,但使用选项2,更容易将更复杂的逻辑用于执行各种操作。

希望有所帮助。


1
投票

如果您有兴趣了解MVC框架/原理如何工作,有时最好的方法是首先了解如何实现它们(比如CodeIgniter),然后您可以深入研究源代码/文档并了解它是如何工作的。

如果您想深入了解MOD_REWRITE,请阅读以解决您的URL问题。 GET是可用的 - 您只需重写URL组件即可。


0
投票

答案取决于结果页面的页面类型。如果您要为用户提供一个包含单个项目的页面,我会将它们重定向到该页面,并使用漂亮的URL。这对系统来说并不是一个巨大的需求。

如果我要显示搜索查询的结果列表,我可能会选择无格式的GET查询。毕竟,这可能是一个有用的URL,人们可能会传递它:

http://www.example.com/search?name=lonesomeday&site=stackoverflow

另一方面,如果只有一个字段,我可能会重定向到一个更简单的形式:

http://www.example.com/search/lonesomeday

YMMV,当然。


0
投票

忘记第二种方法 - 这是一个可怕的想法。

  1. 通常,您可以在“GET表单”中使用标准QueryString(...?a=b&c=d),因为它们的URL并不重要。
  2. 但是,如果你真的想要有一个很好的URL,你必须发送一个表格(GET / POST - 无关紧要)并重定向用户: if (/* form has been submitted */) { $data = array_map("urlencode", $_GET); $url = sprintf('/%s/%s/%s', $data['a'], $data['b'], $data['c']); header("Location: $url"); echo "Redirection: <a href='$url'>$url</a>"; exit; }
  3. 最终,如果您担心服务器资源,可以使用JavaScript来执行此操作: formReference.addEventListener("submit", function() { /* do exactly the same as above PHP code */ return false; }, false); 当然,如果有人禁用了JS,应该保留服务器端重定向。

0
投票

您基本上要问的问题是如何以“www.site.com/controller/action/params”格式实现SEO友好(搜索引擎优化友好)URL。这是通过在几个密钥文件夹中编辑.htaccess文件来实现的,以使用MOD_REWRITE将服务器重定向到指定的文件夹以获得Web应用程序的公共访问点。我会看看这个tutorial。前几段解释了如何实现您正在寻找的URL。

© www.soinside.com 2019 - 2024. All rights reserved.