以mvc模式传递变量

时间:2009-04-13 20:51:28

标签: php model-view-controller design-patterns zend-framework variables

我已经构建了一个符合PHP中mvc模式的系统。控制器和操作是我的应用程序中URL的一部分。所以我有:

www.example.com/controller/action /

所以现在我正在寻找一种传递变量的方法。对于表单我只使用post方法,但有时我只想链接到不同的页面,然后传递一些变量。

我想就如何做到这一点提出一些建议。我知道Zend Framework在控制器中的操作之后使用“/”字符作为分隔符将变量作为键/值对,如下所示:

www.example.com/controller/action/var1/value1/var2/value2

这是最好的方法吗?这实际上是我知道它完成的唯一方式。 我正在寻找一种简单但又好的方法来实现它。

欢迎任何建议。

7 个答案:

答案 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),但如果面包师做到了,那么可以完成。 : - )