由于我在cakephp项目中实现了授权,因此我无法再使用JSON访问我的视图了。我是否必须在任何地方设置特定设置才能重新开始工作? 我希望将autoComplete添加到allowedActions并且isAuthorized会执行这个技巧
app \ Controller \ BrandsController.php(从不必要的代码中删除)
<?php
App::uses('Sanitize', 'Utility');
class BrandsController extends AppController {
public $helpers = array('Html', 'Form', 'Session');
public $components = array('Session', 'RequestHandler');
public function beforeFilter() {
parent::beforeFilter();
$this->Auth->allowedActions = array('autoComplete');
}
public function isAuthorized($user) {
if ($this->action === 'view' || $this->action === 'index' || $this->action === 'autoComplete') {
return true;
}
return parent::isAuthorized($user);
}
public function autoComplete($name = null)
{
if(!$name)
{
$name = @$this->params->query['name'];
}
$name = Sanitize::paranoid($name, array(' '));
if (!$name || empty($name))
{
new NotFoundException(__('Invalid searchquery'));
}
else
{
$objects = $this->Brand->find('list',
array(
'conditions' => array("Brand.name LIKE" => "%" . $name . "%")
)
);
$this->layout = 'ajax';
$this->RequestHandler->setContent('json', 'application/json' );
$this->set(compact('objects'));
$this->render('json/output_json');
}
}
}
?>
应用\视图\品牌\ JSON \ output_json.ctp
<?php
Configure::write('debug', 0);
echo json_encode($objects);
?>
致电
<?php
$brandsAutoCompleteUrl = Router::url(array('controller' => 'brands', 'action' => 'autoComplete'));
?>
<script type="text/javascript">
$(document).ready(function(){
$.getJSON('<?php echo $brandsAutoCompleteUrl; ?>', { name: 'test' }, function(data) {
// never called
});
});
</script>
在我的Chrome调试窗口中,它是sais
GET http://localhost/cakephp/brands/autoComplete?name=tes 500 (Internal Server Error)
当我直接从浏览器中调用此URL时,我得到了预期的结果
答案 0 :(得分:2)
我通过替换
解决了这个问题$this->RequestHandler->setContent('json', 'application/json' );
通过
$this->response->type(array('json' => 'application/json'));
答案 1 :(得分:1)
正确允许
$this->Auth->allow('view', 'index');
这只能在允许操作所有者的控制器中完成 - Link to documentation
此外 - 在firefox firebug或chrome中,您可以查看500 HTTP错误的响应,该错误通常是具有精确CakePHP错误的HTML代码 - 首先进行调查。
为什么要在此控制器中添加组件和帮助程序而不是AppController?这些组件对于任何控制器都是通用的 - 将它们放到AppController中是合理的 如果您没有注意到 - AppController的所有帮助程序和组件都与子控制器的帮助程序和组件合并。您无法通过替换子控制器中的组件来关闭Auth组件。
建议:
避免使用&#39; @&#39;像@$this->params->query['name'];
这样的代码。如果&#39;使用!empty($this->params->query['name'])
。条件
如果你不知道:empty($name) == !$name
,!$name
也可以触发变量$ name中的错误 - http://www.php.net/manual/ru/types.comparisons.php(第1张表)