2

我正在尝试使用 ajax 在我的应用程序中调用一个函数。问题是我不希望该函数在 cakephp 的 beforeFilter 函数中调用。

$.ajax({
    dataType: 'json',
    url: '/users/add/'+id,
    success: function(data){

    }
});

public function add($id = NULL)
{
   echo "test";
   die;
}

每当我使用 ajax 调用时,cakephp 都会加载 beforeFilter 函数。

有没有办法绕过 beforeFilter 功能?

谢谢。

4

3 回答 3

2

实现您正在尝试做的事情的更好方法是:

function beforeFilter() {
  if (in_array($this->action, array('list', 'protected', 'actions',
'here')) {
    // Do your authentication
  }
}
于 2013-05-11T11:10:37.010 回答
2

CakePHP 的“请求生命周期回调”是一件非常方便的事情。它们在那里,因此您不必为每个控制器实现这样的逻辑,并且它们也是CakePHP 的 MVC 范例的一个集成部分。在这里查看有关 Cake 的模型、视图和控制器包装器的更多信息。

您可以通过控制器的implementedEvents()函数完全删除此(或任何)回调,但我强烈建议不要这样做。

@thaJeztah 的解决方案是两种可能的解决方案之一。

但是为什么需要绕过beforeFilter()呢?有什么非常强烈的事情促使你这样做吗?

您还可以使用以下内容跳过所有 ajax 请求beforeFilter()

public function beforeFilter()
{
     if ( !$this->request->is('ajax')) {
         //Do whatever
     }
}

但你真的需要这个吗?是什么阻碍了你?也许你错误地使用了这个回调方法?还要记住,beforeFilter()如果在子节点中显式调用,hte 父控制器也将被调用parent::beforeFilter(),如果那里有东西,请求也将通过那里。

于 2013-05-13T09:03:02.123 回答
0

只需检查当前请求是否是通过 beforeFilter 中的 AJAX 发出的;

public function beforeFilter()
{
     if ($this->request->is('ajax')) {
         return;
     }

     // rest of your code
}

笔记

不会禁用附加到控制器的组件的 beforeFilter()

于 2013-05-11T12:08:24.733 回答