我决定将 Facebook 功能处理到一个组件中,我编写了以下代码来启动我自己的 Facebook 组件:
<?php
class FacebookComponent extends Object{
var $name = 'Facebook';
// var $components = array('Auth', 'Session');
var $settings = array();
var $controller = null;
var $facebook;
var $fbUid;
function initialize(&$controller, $settings) {
Configure::load('app.conf');
App::import('Vendor', 'Facebook', array('file' => 'facebook/src/facebook.php'));
$this->facebook = new Facebook(array(
'appId' => Configure::read('FBappId'),
'secret' => Configure::read('FBsecret')
));
$this->fbUid = $this->facebook->getUser();
}
function is_user(){
if ($this->fbUid){
return true;
}
else{
return false;
}
}
function getLoginUrl(){
return $this->facebook->getLoginUrl(array( 'scope' => 'publish_stream'));
}
}
?>
如果不使用 users_controller.php 中的上述组件,有关 auth 组件和用户控制器的登录操作的所有内容都可以正常工作。但是,只是通过 var $components 在 users_controller.php 的组件列表中添加我的 Facebook 组件,我发现登录操作的行为方式很奇怪:
function login(){
if (!$this->Auth->user()){
if (empty($this->data['User']['username'])){
$this->Session->setFlash(__('You have to login', true), 'error_msg');
}
else{
$this->Session->setFlash(__('bad login', true), 'error_msg');
}
}
else{
$this->Session->setFlash(__('correct login', true), 'done_msg');
}
}
当我尝试通过 Auth 组件访问任何控制器的任何受保护操作时,我会得到带有正确登录消息的登录页面,并在再次重新登录后重定向到网站的主页。
还有另一个症状,我有导航元素,如果用户登录,它会显示注销链接,除了登录页面,它不会在网站的任何部分显示此链接
<?php if ($session->read('Auth.User.id')): ?>
<li><?php echo $html->link($html->image('close.png') . __('logout', true), array('controller' => 'users', 'action' => 'logout', 'admin' => false), array(), null, false); ?></li>
<?php endif; ?>
我正在使用来自供应商的 CakePHP 1.2.10 和 Facebook PHP SDK (v.3.0.0)。我想确认没有该组件,一切都很好。有什么问题?