我在codeigintier中编码,但这个问题同样适用于任何MVC框架。
如何抽取逻辑来确定控制器方法的参数是否在采用某些相同参数的mutlple方法中有效?
编辑:更多细节
例如,在我正在建立的应用程序中,有多个“站点”,并且不同表中的几乎所有数据都属于某个站点,用户只能查看站点的子集。所以很多我的方法都从method($site_id,...)
开始,所以如果我能够有一个pre_controller挂钩可以查看方法的参数并检测参数中是否有$ site_id,那将是非常好的,如果有的话检查权限。
问题是这些控制器中的所有方法都没有$ site_id参数,所以我不能在我的CI_Controller扩展的构造函数中自动进行检查
答案 0 :(得分:1)
对于CodeIgniter来说,抽象逻辑的一种方法是创建一个超类:
class MY_Controller extends CI_Controller
{
public function __construct()
{
parent::__construct();
//...do stuff...
}
//...do stuff...
}
/* End of file MY_Controller.php */
/* Location: ./application/core/MY_Controller.php */
您想要共享相同逻辑的所有控制器应该扩展MY_Controller而不是CI_Controller
现在,在你的MY_Controller中你可以创建函数来处理多种方法中的错误参数"。
<强>更新强>
您的控制器功能参数来自您的路线。例如mydomain.com/mycontroller/myfunction/param1/param2/
会转到mycontroller
public function myfunction($param1, $param2)
$site_id
只是你的变量命名。你不能告诉它的名字,即使你可以怀疑,根据你如何命名你的变量建立任何逻辑都是个好主意。
一种简单的方法就是在每个需要它的控制器函数中显式调用验证函数(在基本控制器,库或助手中存储一次),从而为您提供精细的控制。
<强>更新强>
Extending the controller would only work if my parameters were the same for each method. I'd like to detect automatically the parameters and perform checks. I suppose a call to a helper might be the best I can do, but Id just like to be able to completely abstract it away from the method. I suppose one option would be to have an array of which controllers and methods have $site_id as their first parameter and have a pre_controller hook to do the checking. But this would mean keeping the array up-to-date which kind of defeats the object of my question which is to make things as DRY as possible!
通常,要获得自动化,您必须灵活放弃并遵循惯例。 所以不要去&#34;使用帮手&#34;方式和自动检测方式...创建自己的约定。
在您的基本控制器中使用$ this-&gt; uri-&gt; segment(n)来检查是否存在某个URL模式,如果您知道site_id参数是否已传入且您可以对其运行自动验证
答案 1 :(得分:0)
扩展相同的控制器并在preDispatch或init方法中进行一些验证。
或者将验证抽象为controller-helper并在两个控制器中使用它。