【问题标题】:how to pass a list of values to a method, Codeigniter style如何将值列表传递给方法,Codeigniter 风格
【发布时间】:2012-09-26 20:28:13
【问题描述】:

将项目 2-3 项目列表传递给控制器​​中的方法的好方法是什么? 我正在考虑只使用 URL.... 像这样:

   http://myserver/myapp/mycontroller/mymethod/parm1/parm2/listitem1/listitem2/listitem3

有没有更好的方法来做到这一点?这些数据不是来自表单,而是来自数据库查询,我正在用它建立一个超链接。

我想唯一困扰我的部分是我在解析这个 url 时不会提前知道我有多少项目。

我可能什么都得不到,或者全部 3 个或介于两者之间的某个值。因此,必须解析此 url 的方法将继续循环,直到 uri->segment() 返回 false,表示它已命中第一个空 uri 段。 任何建议将不胜感激。

谢谢

编辑 1:

以防万一,我的模型正在从数据库中获取数据,并且还将构建列表。 问题实际上是关于解析未确定数量的 uri 段。 只是想知道是否有更好的方法来做到这一点。 谢谢!

编辑 2

这里有更多信息可以帮助您了解我的 MVC 应用程序。我不认为我的问题是我组织代码的方式,因为谁在做什么......但以防万一它有帮助......

我的模型中有methodA,它查询数据库并传回我的控制器listitem1、listitem2 和listitem2。 然后控制器构建一个代表 URL 的字符串,例如:

  http://myserver/myapp/mycontroller/methodB/parm1/parm2/listitem1/listitem2/listitem3

然后视图使用上面的 url 显示一个超链接。 当用户点击这个超链接时,它会调用methodB。 在方法B中,由于我不知道项目的数量,我将遍历所有段,直到我遇到第一个错误。

至于我为什么需要这样做/我在做什么......这里有一些背景信息: 我正在数据库中查询交换机上被视为中继的端口列表 - 不应修改的端口。 这就是方法 A 所做的。

methodB 对交换机运行命令并返回一堆数据。显示来自方法 B 的数据的视图将允许最终用户对开关进行进一步的更改。在显示来自 methodB 的数据之前,我想过滤掉从 methodA 获得的端口列表,这样它们就不会被篡改。

希望这会有所帮助。

编辑 3

我需要 methodA 和 methodB 因为它们有两个不同的目的。 methodA 显示我的数据库中有关端口的摘要数据。将 methodA 视为显示有关开关的文档的函数。反过来,methodA 的视图提供了与实际交换机通信的“实时”链接——这是 methodB 的来源。methodB 由这些实时链接之一触发,它会获取端口列表——类似于 methodA——除了它代表实际情况,并且不包括有关端口的用户定义信息。 我想我可以让methodB与我的数据库通信并在它显示之前过滤它的数据,但是如果我想将这两个函数视为单独的API......也就是一组函数从数据库中获取数据,另一组是一种与交换机通信的工具...... - 那么我认为我不希望一个人直接与另一个人交谈。我希望 GUI 将它们联系在一起。事实上,我已经创建了两个独立的模型和控制器,我将称之为数据库接口,然后是切换接口。 到目前为止,我认为表单的想法是最优雅的解决方案。 谢谢大家,阅读。

【问题讨论】:

  • 2-3 个项目的列表是从视图(客户端)通过 http 还是什么?
  • @Esben Tind - 它来自模型。我想我提到它来自数据库查询。
  • 根据您提供给我们的信息,没有比这更好的方法了 - 如果不了解您为什么需要这么多细分市场和/或它们的用途的更多细节,就很难提供替代方案或“重新设计一切”以外的具体建议
  • @orourkek - 我更新了我的帖子。查看 Edit 2 - 在底部
  • 将超链接转换为表单并使用 _POST 将所需数据发送到控制器上的函数可能更容易,因此您根本不必处理 uri。您还可以在 onclick 事件中使用 ajax 请求来执行此操作。

标签: php codeigniter


【解决方案1】:

将列表项的数量作为参数 3

../mymethod/parm1/parm2/numberofitems/listitem1/listitem2/listitem3 

并根据需要放置 1、2 或 3。如果 0 什么都不放 - null,但是请确保控制器知道如果 null 发生了该怎么办 - 不要期望项目。

【讨论】:

  • 我刚刚在我的帖子中添加了一条关于如何解析 url 的评论。有什么想法吗?
  • 我不认为向已经很复杂的 URI 添加 more 参数是正确的方向......
【解决方案2】:

如果数据来自查询,如果您希望您的应用程序真正符合 MVC,则它应该位于 CodeIgniter 中的模型中。这可能意味着对您的应用程序进行重组,这可能很困难,但将来为您的所有数据库查询创建模型会真正使您受益。

您可以在此处阅读有关 codeigniter 模型的信息: http://codeigniter.com/user_guide/general/models.html

您可以在此处阅读数据库类:http://codeigniter.com/user_guide/database/index.html

我真的建议你这样做。

如果您的数据已经来自模型,您可以通过包含模型来调用它:

$this->load->model('model_name');
$response = $this->model_name->model_function(parameters);

编辑:这也将解决列表项数量未知的问题,因为您可以简单地解析从模型函数返回的响应,而不是试图找出 uri hack。

【讨论】:

  • 您应该从控制器调用模型函数,而不是传递参数,这就是模型在 codeigniter 中的使用方式。
  • 虽然我同意 SOC 的概念,但当您开始将模型限制为仅是一个类时,“真正符合 MVC 的”短语就完全消失了......
【解决方案3】:

在阅读完所有其他答案 + 编辑后,这绝对不是您想要的方式

除非我误解了您的 cmets,否则问题出在:端口列表是存储在您服务器上的域数据。那么,为什么要提取这些数据,将其发送到表示层,然后将其显示给将直接发送回应用程序的用户?跳过中间人,让“MethodB”获取该数据。

您的“MethodB”应该在处理它需要做的事情之前自己获取这些信息 - 域数据保留在域层中,并且视图永远不会直接看到任何这些信息(用户会看到直接到“MethodB”的链接)

或者,如果您的数据库架构有利于此类连接,您可以在一个查询中完成所有操作。

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    相关资源
    最近更新 更多