如何为一般 authError 消息定义 FlashHelper/Component 元素
Posted
技术标签:
【中文标题】如何为一般 authError 消息定义 FlashHelper/Component 元素【英文标题】:How to define FlashHelper/Component element for general authError message 【发布时间】:2015-08-17 01:27:58 【问题描述】:在将 Cakephp 从 2.6.2 更新到 2.7.2 后,我在创建 auth flash 消息时收到缺少密钥的错误。如何为默认的authError
定义元素模板?
由于SessionComponent::setFlash()
一直是deprecated,我在app/Controller/AppController.php
中添加了FlashComponent 并由此修改了所有Flash 消息:
// Controller
$this->Session->setFlash('Done', 'succeed');
$this->Session->setFlash('There is an error', 'failure');
$this->Session->setFlash('Please log in', 'auth');
// View (default Layout)
echo $this->Session->flash();
echo $this->Session->flash('auth');
到这里:
// Controller
$this->Flash->succeed('Done');
$this->Flash->failure('There is an error');
$this->Flash->auth('Please log in');
// View (default Layout)
echo $this->Flash->render();
echo $this->Session->flash(); // keep temporarily?
echo $this->Session->flash('auth'); // keep temporarily?
我还从
App/View/Elements/succeed.ctp
到
App/View/Elements/Flash/succeed.ctp
这是可行的——但是如果我未登录并尝试访问管理页面,我会得到app/Controller/AppController.php
中定义的默认authError消息显示没有相应的模板。使用调试模式 2,我收到以下错误:
// Undefined variable: key [CORE\Cake\View\Elements\Flash\default.ctp, line 1]
// include - CORE\Cake\View\Elements\Flash\default.ctp, line 1
// View::_evaluate() - CORE\Cake\View\View.php, line 971
// View::_render() - CORE\Cake\View\View.php, line 933
// View::_renderElement() - CORE\Cake\View\View.php, line 1227
// View::element() - CORE\Cake\View\View.php, line 418
// SessionHelper::flash() - CORE\Cake\View\Helper\SessionHelper.php, line 159
// include - APP\View\Layouts\default.ctp, line 142
// View::_evaluate() - CORE\Cake\View\View.php, line 971
// View::_render() - CORE\Cake\View\View.php, line 933
// View::renderLayout() - CORE\Cake\View\View.php, line 546
// View::render() - CORE\Cake\View\View.php, line 481
// Controller::render() - CORE\Cake\Controller\Controller.php, line 960
// Dispatcher::_invoke() - CORE\Cake\Routing\Dispatcher.php, line 200
// Dispatcher::dispatch() - CORE\Cake\Routing\Dispatcher.php, line 167
// [main] - APP\webroot\index.php, line 118
// Message" class="message">
要获得使用我自己的元素模板“auth”呈现的默认 authError,需要对 AppController.php 进行哪些更改?
这里是AppController.php的部分:
public $components = array(
'Flash',
'Session',
'Security',
'Auth' => array(
'authenticate' => array('Form' => array('passwordHasher' => 'Blowfish')),
'authError' => 'My default auth error message.', // How do I have to modify this line?
'loginAction' => array('controller' => 'users', 'action' => 'login'),
'loginRedirect' => array('controller' => 'users', 'action' => 'welcome'),
'logoutRedirect' => array('controller' => 'users', 'action' => 'goodbye'),
)
);
当将所有控制器中的所有 Flash 消息更改为 Flash 组件和帮助程序时,这两行是否仍然需要? CakePHP 还在哪里使用它们?
echo $this->Session->flash();
echo $this->Session->flash('auth');
我还查看了Authentication tutorial。但它似乎不是最新的,因为$this->Session->setFlash()
仍在大量使用中......
【问题讨论】:
我收到此错误:错误:在非对象上调用成员函数 success() @DariusVE 在我的代码示例中,我使用succeed
作为模板名称,显然你使用了success
。所以你的错误应该通过添加模板App/View/Elements/Flash/success.ctp
来解决......
昨天我解决了这个问题,您需要在 AppController.php public $components = array( 'Session', 'Flash', 'Auth');
的组件数组中添加 Flash
组件
【参考方案1】:
在您的 Auth 组件设置数组中添加类似
'Auth' = [
...
'flash' => ['element' => 'auth_error'],
...
]
然后在您的Element/Flash
目录中创建一个名为auth_error.ctp
的模板。在此文件中,您使用的唯一变量应该是 $message
,因为当 cake 从 Auth 组件调用 Flash 时不会传递任何其他变量(即 $key
变量)
也许这个答案不是 100% 正确(所以欢迎任何建议),但它对我有用。
【讨论】:
【参考方案2】:这是 Cake 本身的一个错误,它(将)在 2.7.4 中修复
见:https://github.com/cakephp/cakephp/pull/7379
【讨论】:
【参考方案3】:只需添加 Flash 组件即可。
class AppController extends Controller
public $components = array('DebugKit.Toolbar','Flash');
【讨论】:
【参考方案4】:我也遇到了同样的问题,这肯定会解决你的问题。请在app/Controller/AppController.php中添加以下代码行:
public $components = array('Flash');
【讨论】:
以上是关于如何为一般 authError 消息定义 FlashHelper/Component 元素的主要内容,如果未能解决你的问题,请参考以下文章
Android aSmack - 如何为文件发送自定义消息扩展名?
如何为 chai expect 提供 mocha 单元测试的自定义错误消息?
Django Rest Framework - 如何为所有 ModelSerializer 字段创建自定义错误消息?