【问题标题】:passing variables in a mvc pattern以 mvc 模式传递变量
【发布时间】:2010-10-19 05:22:09
【问题描述】:

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

www.example.com/controller/action/

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

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

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

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

欢迎提出任何建议。

【问题讨论】:

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


    【解决方案1】:

    您可以选择通过 GET 或 POST 传递变量。

    GET 将以漂亮的格式将变量附加到 URL

     /controller/action/var1/value1/var2/value2
    

    还是传统方式

     /controller/action/?var1=value1&var2=value2
    

    在前一种情况下,您仍然需要编写一个 Apache 重写规则来从 URL 中提取变量并使用正确的变量集作为 $_REQUEST 的一部分路由到控制器/操作。

    如果您使用的是 POST,则可以向每个表单添加隐藏值作为传递变量的一种方式。

    对于您不希望公开的变量,您可以使用Sessions 将它们存储在服务器端。

    【讨论】:

      【解决方案2】:

      你也可以像这样进行 GET 查询:

      www.site.com/controller/action?var1=value1&var2=value2

      这些将显示在 $_GET 超全局变量中。

      【讨论】:

        【解决方案3】:

        var1/value1/var2/value2 确实不是最好的方法,它滥用了 MVC controller/action/id 结构。您需要重新考虑您的设计,使用 POST 或查询参数。您很可能可以重做设计,例如,如果您有

        /search/type/movie/format/divx/year/2000
        

        你可以重做

        /movie/divx?year=2000
        

        因此,您的 movie 控制器将搜索 divx 格式的电影,然后可能使用帮助程序或过滤器或客户端脚本仅显示匹配年份 == 2000 的电影。

        【讨论】:

        • 我不会完全称控制器/动作/id为restful。
        【解决方案4】:

        像 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

        我喜欢这个,因为它可以让您控制控制器将接受多少参数,如果某些变量从不使用很重要,您可以适当地执行逻辑或重定向。

        【讨论】:

          【解决方案5】:

          根据您的项目,您还可以尝试使用 PHP 会话设置和读取值。这些值不必作为 GET 或 POST 值从脚本传递到脚本。一个缺点(或优点)是变量不能简单地作为 URL 的一部分传递(或添加书签)。

          【讨论】:

            【解决方案6】:

            我会避免您之前提到的键/值 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 的设计。

            【讨论】:

              【解决方案7】:

              我喜欢在我的 CakePHP 项目中使用“命名参数”。基本上,我的网址如下所示:

              http://example.com/controller/action/param1:value1/param2:value2
              

              您可以在Cake's manual 中查看更多示例。我不知道你的框架是否支持这个(或 Zend),但如果面包师做到了,它可以做到。 :-)

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2018-09-28
                • 1970-01-01
                • 2015-01-27
                • 2016-04-01
                • 2014-01-05
                • 1970-01-01
                • 2014-09-08
                • 2012-09-14
                相关资源
                最近更新 更多