将参数传递给控制器​​的构造函数

时间:2009-12-18 12:55:57

标签: php codeigniter codeigniter-routing

我有一个控制器,它有几个方法都应该共享共同的信息。假设我的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 个答案:

答案 0 :(得分: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会话中。 Codeigniter可以将这些数据存储在cookie中(如果总数小于4kb),否则您可以在数据库中存储更大的数据blob(请参阅有关如何执行此操作的文档)。

请参阅:http://codeigniter.com/user_guide/libraries/sessions.html

子部分:将会话数据保存到数据库

这是一些会话练习:

$this->session->set_userdata('mydata', $mydata);
....
$mydata = $this->session->userdata('mydata');

答案 1 :(得分:0)

如果无法从CodeIgniters Hook mechanism解决此问题,您可以覆盖控制器中的构造函数方法并调用自己的方法。从their SVN repository来看,你可能会做类似

的事情
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的调用必须在调用parent之前。试试吧,看看它是否有效。我不知道他们仍然使用PHP4语法。呃:(

答案 2 :(得分:-2)

基于你的url结构,以及codeignitor使用MVC模式的事实,我假设你正在使用mod_rewrite将url路径格式化为index.php的查询字符串。如果是这种情况,那么在执行脚本的任何时候都应该在$ _REQUEST ['id']中提供“id”的值......

相关问题