向控制器的构造函数传递参数

6

我有一个控制器,其中有几个方法都应该共享一些公共信息。假设我的URI格式如下:

http://server/users/id/admin/index
http://server/users/id/admin/new
http://server/users/id/admin/list
http://server/users/id/admin/delete

我需要从数据库检索一些关于id的信息,并使它们在所有方法中都可用,而不是在每个方法中写一行代码来调用模型。我该怎么做?

3个回答

4
class users extends Controller {

 private $mydata = array();

 function users()
 {   
     parent::Controller();
     ....

     $this->mydata = $this->model->get_stuff($this->uri->segment(2));
 }

 function index()
 { 
     $this->mydata; //hello data!
 }

我这里只是简单地硬编码了数组(这可能是一个非常糟糕的想法)。不过,如果需要的话,你可以将数据存储在CodeIgniter会话中。如果它的总大小小于4kb,则CodeIgniter可以将此数据存储在cookie中;否则,你可以将更大的数据块存储在数据库中(请参阅文档以了解如何执行此操作)。
请参见:http://codeigniter.com/user_guide/libraries/sessions.html 子节:将会话数据保存到数据库
以下是一些会话练习:
$this->session->set_userdata('mydata', $mydata);
....
$mydata = $this->session->userdata('mydata');

0
如果从CodeIgniters Hook机制无法解决此问题,您可以覆盖控制器中的构造函数并调用自己的构造函数。从他们的SVN存储库来看,您可能会做类似的事情。
class YourController extends Controller
{
    function YourController()
    {
        parent::Controller();
        $this->_preDispatch();
    }

    function _preDispatch()
    {
         // any code you want to run before the controller action is called
    }

可能需要在调用父类之前调用preDispatch。尝试一下,看看是否有效。我不知道他们仍然使用PHP4语法。唉 :(


问题在于如何使用 id:我知道如何在方法中使用它,但不知道如何在构造函数中使用。顺便说一下,您也可以在 CodeIgniter 中使用 PHP5 语法。 - Matteo Riva
如果CI在构造函数中获取ID的方法尚不可用,则仍然可以从$_SERVER超全局变量中的Request-URI解析它。 - Gordon
是的,我想我可以这样做,但我正在寻找比手动解析 $_SERVER['REQUEST_URI'] 更清晰的解决方案。毕竟,这就是框架应该做的事情。 - Matteo Riva

-2

根据您的URL结构以及CodeIgnitor使用MVC模式的事实,我假设您正在使用mod_rewrite将URL路径格式化为index.php的查询字符串。如果是这种情况,则在脚本执行的任何时候,"id"的值应该在$_REQUEST['id']中可用...


抱歉,不熟悉CodeIgniter,只是基于所有的结构假设它会使用mod_rewrite。但你知道人们对假设的看法…… - eCaroth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接