总是在cakePhp中调用一个函数

时间:2012-12-11 17:10:13

标签: cakephp

我想知道如何在cakePHP中使用一个在加载页面时始终可以调用的函数?

使用此示例更精确:

我有我的主页:index.ctp 我有另一页:profil.ctp

我想要的是,当我尝试访问profil.ctp时,如果我没有登录,它会自动将我重定向到index.ctp页面。

我已经做了什么:

UsersController:

function index() {
    if (!empty($this->data))
        $this->Session->write(array('User' => array('connected' => true)));
}

ProfilsController:

function index() {
  if (!$this->Session->read('connected'))
    $this->redirect(array('controller' => 'users', 'action' => 'index'));
}

问题是我不想将这个代码添加到每个页面,以及我所有控制器的每个功能。

有什么想法吗?

问候。

2 个答案:

答案 0 :(得分:9)

将代码放在AppController.php s beforeFilter()

如果您在其他控制器中使用beforeFilter,请确保在其他代码之前调用parent

public function beforeFilter() {
    parent::beforeFilter();
    // your other code
}

在每个控制器中,调用beforeFilter(),然后触发AppController(父)beforeFilter()

答案 1 :(得分:2)

将代码放入AppController beforeFilter()

AppController的:

public function beforeFilter()
{
  //call your code here
}

在控制器中,只有在需要运行每次调用特定控制器中的操作时必须执行的特定代码时,才覆盖beforeFilter()函数。

一些例子:

UsersController:

UsersController extends AppController
{
  public function beforeFilter()
  {
    parent::beforeFilter();

    //add some code here that must be run before each UsersController's action
  }

  ...

}

LogsController:

如果在使用LogsController的操作之前不需要调用任何特定代码,请不要添加任何beforeFilter()函数。由于对象继承,将使用AppController beforeFilter()

LogsController extends AppController
{
  //no need for a beforeFilter() here ! 
  //AppController's beforeFilter() will be used automatically

  ...

}