我已经构建了一个符合PHP中mvc模式的系统。控制器和操作是我的应用程序中URL的一部分。所以我有:
www.example.com/controller/action /
所以现在我正在寻找一种传递变量的方法。对于表单我只使用post方法,但有时我只想链接到不同的页面,然后传递一些变量。
我想就如何做到这一点提出一些建议。我知道Zend Framework在控制器中的操作之后使用“/”字符作为分隔符将变量作为键/值对,如下所示:
www.example.com/controller/action/var1/value1/var2/value2
这是最好的方法吗?这实际上是我知道它完成的唯一方式。 我正在寻找一种简单但又好的方法来实现它。
欢迎任何建议。
答案 0 :(得分:5)
像CodeIgniter这样的框架允许您将变量传递给控制器,而不会公开变量名称 -
/controller/action/foo/bar/
将被处理为:
function action( $id, $value){
echo $id; // outputs 'foo'
echo $value; // outputs 'bar'
}
http://codeigniter.com/user_guide/general/controllers.html
我喜欢这个,因为它可以让你控制你的控制器会接受多少参数,如果从不使用某些变量很重要,你可以适当地进行逻辑或重定向。
答案 1 :(得分:3)
var1/value1/var2/value2
实际上不是最好的方法,它滥用MVC controller/action/id
结构。您需要重新考虑您的设计,使用POST或查询参数。很可能你可以重做设计,例如,如果你有
/search/type/movie/format/divx/year/2000
你可以重做那个
/movie/divx?year=2000
因此,您的movie
控制器会搜索divx
格式的电影,然后使用帮助器或过滤器或客户端脚本来仅显示与年份== 2000匹配的电影。
答案 2 :(得分:1)
您可以选择通过GET或POST传递变量。
GET会以变量格式
将变量附加到URL /controller/action/var1/value1/var2/value2
或传统方式
/controller/action/?var1=value1&var2=value2
在前一种情况下,您仍然需要编写一个Apache重写规则来从URL中提取变量,并使用正确的变量集作为$ _REQUEST的一部分路由到控制器/操作。
如果您正在使用POST,则可以为每个表单添加隐藏值,作为传递变量的方法。
对于您不想公开的变量,您可以使用Sessions将它们存储在服务器端。
答案 3 :(得分:1)
你也可以这样做GET查询:
www.site.com/controller/action?var1=value1&var2=value2
这些将显示在$ _GET超全球中。
答案 4 :(得分:1)
根据您的项目,您还可以尝试使用PHP会话设置和读取值。这些值不必作为GET或POST值从脚本传递到脚本。一个向下(或向上)是变量不能简单地作为URL的一部分传递(或加入书签)。
答案 5 :(得分:1)
我会避免使用之前提到的键/值Zend样式方法。问题是创建两个不同的URL
变得微不足道http://www.example.com/controller/action/var1/value1/var2/value2
http://www.example.com/controller/action/var2/value2/var1/value1
指向相同的资源。虽然这是有效的,但是Web应用程序的MVC样式框架的成功部分在于它们可以更轻松地提供干净的URL结构,并将您站点上的单个URL与每个资源相关联。 var1 / value1 / var2 / value2方法与键/值查询字符串相比几乎没有优势。
我在这里采用的方法是避开键,只使用值
http://www.example.com/example/list/value1/value2/value3
将作为数组
传递给action方法class example extends Controller{
public function list($args){
//$args[0] = 'value1';
//$args[1] = 'value2';
//$args[2] = 'value3';
}
}
通过这种方式,您可以让系统的最终用户决定他们如何处理$ GET样式变量,同时鼓励设计能够产生更清晰,更稳定的单一资源URL。
答案 6 :(得分:1)
我喜欢在CakePHP项目中使用的是“命名参数”。基本上,我的网址如下所示:
http://example.com/controller/action/param1:value1/param2:value2
您可以在Cake's manual中看到更多示例。我不知道你的框架是否支持这个(或Zend),但如果面包师做到了,那么可以完成。 : - )