我正在使用PHP。我想从头开始创建一个MVC设置,以了解有关MVC如何工作的更多信息。我想使用带有斜杠的干净网址作为参数的分隔符。在GET方法表单中,人们如何做到这一点?或者人们一起避免GET方法形式?
截至目前,我可以想象的方式是:
任何建议或建议阅读欢迎。
获取变量和干净的URL不会相互矛盾。你总是可以拥有像这样的URL
另一种URL样式也可能是这样的
http://example.com/controller/action/value1/foo/value2/bar或http://example.com/controller/action/foo/bar
在这两种情况下,如果您想通过表单GET提交创建这些URL,则必须使用JavaScript来组合正确的URL,因此第一个解决方案可能更容易实现。
另一个问题是POST和GET表单提交之间的决定。 POST更安全,但正如您所说,用户无法为其添加书签。
嘿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是要走的路。
你可以使用像这样的.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点都不适用于如何处理MVC模式:
/?id=123
与/weird-article-slug-123
相同,当你知道你的URL模式是^[\w\d-]+([\d]+)$
?Cfreak回答这个问题的最佳方法是让你深入了解各种PHP框架源代码,看看他们是如何实现MVC方法的。我使用的PHP框架通常排除GET数据并依赖于POST数据。但是,可以通过查询字符串传递信息,请参阅下面的示例。
通常,PHP MVC框架中的URL看起来像这样:example.com/index.php/controller/action/arguments。通常使用.htaccess文件删除index.php部分。您的控制器是一个类,很可能继承自某种父控制器类。你的控制器有你喜欢的动作/方法,接下来叫做。您可以通过将这些参数添加到URL上来传递这些方法参数,通常是一些无限制的参数。我希望这有助于您了解结构的基本概念。一切都从index.php开始,它将包括你需要的所有配置文件,以及你可能需要的加载和必需的类:)
你所指的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,更容易将更复杂的逻辑用于执行各种操作。
希望有所帮助。
如果您有兴趣了解MVC框架/原理如何工作,有时最好的方法是首先了解如何实现它们(比如CodeIgniter),然后您可以深入研究源代码/文档并了解它是如何工作的。
如果您想深入了解MOD_REWRITE,请阅读以解决您的URL问题。 GET是可用的 - 您只需重写URL组件即可。
答案取决于结果页面的页面类型。如果您要为用户提供一个包含单个项目的页面,我会将它们重定向到该页面,并使用漂亮的URL。这对系统来说并不是一个巨大的需求。
如果我要显示搜索查询的结果列表,我可能会选择无格式的GET查询。毕竟,这可能是一个有用的URL,人们可能会传递它:
http://www.example.com/search?name=lonesomeday&site=stackoverflow
另一方面,如果只有一个字段,我可能会重定向到一个更简单的形式:
http://www.example.com/search/lonesomeday
YMMV,当然。
忘记第二种方法 - 这是一个可怕的想法。
...?a=b&c=d
),因为它们的URL并不重要。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;
}
formReference.addEventListener("submit", function() {
/* do exactly the same as above PHP code */
return false;
}, false);
当然,如果有人禁用了JS,应该保留服务器端重定向。您基本上要问的问题是如何以“www.site.com/controller/action/params”格式实现SEO友好(搜索引擎优化友好)URL。这是通过在几个密钥文件夹中编辑.htaccess文件来实现的,以使用MOD_REWRITE将服务器重定向到指定的文件夹以获得Web应用程序的公共访问点。我会看看这个tutorial。前几段解释了如何实现您正在寻找的URL。