- 浏览: 92927 次
- 性别:
- 来自: 武汉
最新评论
-
windscar001:
</div></pre></td ...
Yii框架应用程序整合Ucenter实现同步注册、登录和退出等 -
winsonkong05:
博主您好,我嘗試webapp "c:\wamp\ww ...
Yii Framework 整合Extjs Direct实现RPC的方法 -
yiqing:
有github账号没 可以相互交流哈
Yii Framework 整合Extjs Direct实现RPC的方法 -
xingkid:
xingkid 写道博主很厉害,要向您学习~~
博主您好。能 ...
Yii Framework 整合Extjs Direct实现RPC的方法 -
xingkid:
博主很厉害,要向您学习~~
Yii Framework 整合Extjs Direct实现RPC的方法
如今很多网站都要整合论坛程序,而康盛的Discuz系列产品往往是首选。然后就有了整合用户的需要,康盛提供了Ucenter架构,方便对不同的应用程序进行单点登录整合。
进来我尝试将ucenter整合到Yii网站中,获得了成功,虽然登录同步程序不是很妥当,基本使用没有问题了。我将继续改进。下面说说步骤:
- 下载安装ucenter和discuz,我使用的是ucenter1.6和discuz7.2,由于7.2自带的uc_client是旧版本,所以需要覆盖一下1.6版本。
- 复制一份uc_client文件夹到 protected/vendors/下,然后建立一个ucenter.php文件,内容如下:
<?php include dirname(__FILE__).'/../config/main.php'; include dirname(__FILE__).'/uc_client/client.php';
可以看到这里只是包含了两个文件。然后打开yii的主配置文件 protected/config/main.php,加入ucenter的一些全局变量的设置:<?php define('UC_CONNECT', 'mysql'); // 连接 UCenter 的方式: mysql/NULL, 默认为空时为 fscoketopen() // mysql 是直接连接的数据库, 为了效率, 建议采用 mysql //数据库相关 (mysql 连接时, 并且没有设置 UC_DBLINK 时, 需要配置以下变量) define('UC_DBHOST', 'localhost'); // UCenter 数据库主机 define('UC_DBUSER', 'root'); // UCenter 数据库用户名 define('UC_DBPW', ''); // UCenter 数据库密码 define('UC_DBNAME', '027xfbbs'); // UCenter 数据库名称 define('UC_DBCHARSET', 'utf8'); // UCenter 数据库字符集 define('UC_DBTABLEPRE', '027xfbbs.uc_'); // UCenter 数据库表前缀 //通信相关 define('UC_KEY', 'ebR4GhhpZB7e9Mhb'); // 与 UCenter 的通信密钥, 要与 UCenter 保持一致 define('UC_API', 'http://027xf.test/ucenter'); // UCenter 的 URL 地址, 在调用头像时依赖此常量 define('UC_CHARSET', 'utf8'); // UCenter 的字符集 define('UC_IP', ''); // UCenter 的 IP, 当 UC_CONNECT 为非 mysql 方式时, 并且当前应用服务器解析域名有问题时, 请设置此值 define('UC_APPID', 2); // 当前应用的 ID // uncomment the following to define a path alias // Yii::setPathOfAlias('local','path/to/local-folder'); // This is the main Web application configuration. Any writable // CWebApplication properties can be configured here. return array( 'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..', .....
请根据你的情况修改上面的数据库名等设置。 - 实现同步注册,我采用的是定义了表单RegisterForm来处理用户的注册,下面是一个典型的注册表单及其验证和业务逻辑代码:
<?php /** * LoginForm class. * LoginForm is the data structure for keeping * user login form data. It is used by the 'login' action of 'SiteController'. */ class RegisterForm extends CFormModel { public $username; public $password; public $repassword; public $email; public $verifyCode; /** * Declares the validation rules. * The rules state that username and password are required, * and password needs to be authenticated. */ public function rules() { return array( // username and password are required array('username, password, repassword, email, verifyCode', 'required'), array('username', 'length', 'max'=>20, 'min'=>5), // 用户名唯一性验证 //array('username', 'unique','caseSensitive'=>false,'className'=>'user','message'=>'用户名"{value}"已经被注册,请更换'), array('username', 'checkname'), // 密码一致性验证 array('repassword', 'compare', 'compareAttribute'=>'password','message'=>'两处输入的密码并不一致'), // 电子邮件验证 array('email', 'email'), // 电子邮件唯一性 //array('email', 'unique','caseSensitive'=>false,'className'=>'user','message'=>'电子邮件"{value}"已经被注册,请更换'), array('email', 'checkemail'), //array('birthday', 'match', 'pattern'=>'%^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$%', 'allowEmpty'=>true, 'message'=>'生日必须是年-月-日格式'), //array('mobile', 'length', 'max'=>11, 'min'=>11, 'tooLong'=>'手机号码错误','tooShort'=>'手机号码错误'), array('verifyCode', 'captcha', 'allowEmpty'=> false), ); } public function checkname($attribute,$params) { //ucenter Yii::import('application.vendors.*'); include_once 'ucenter.php'; $flag = uc_user_checkname($this->username); switch($flag) { case -1: $this->addError('username', '用户名不合法'); break; case -2: $this->addError('username','包含不允许注册的词语'); break; case -3: $this->addError('username','用户名已经存在'); break; } } public function checkemail($attribute,$params) { //ucenter Yii::import('application.vendors.*'); include_once 'ucenter.php'; $flag = uc_user_checkemail($this->email); switch($flag) { case -4: $this->addError('email', 'Email 格式有误'); break; case -5: $this->addError('email','Email 不允许注册'); break; case -6: $this->addError('email','该 Email 已经被注册'); break; } } /** * Declares attribute labels. */ public function attributeLabels() { return array( 'username'=>'设定用户名', 'password'=>'设定密码', 'repassword'=>'再次输入密码', 'email'=>'电子邮件地址', 'mobile'=>'手机号码', 'verifyCode'=>'验证码', ); } /** * 注册用户 * @return boolean whether register is successful */ public function register($uid) { //ucenter Yii::import('application.vendors.*'); include_once 'ucenter.php'; $uid = uc_user_register($this->username, $this->password, $this->email); if($uid>0) { $model = new user; $model->attributes = $_POST['RegisterForm']; $model->password = md5($_POST['RegisterForm']['password']); $model->id = $uid; return $model->save(); } } }
我们看看上面的代码,调用了uc_user_checkname和uc_user_checkemail完成了用户名和email的验证,然后调用了 uc_user_register将用户注册到ucenter,成功后,再注册到Yii应用。 - 实现用户登录,典型的Yii应用使用 CUserIdentity来实现登录,我们要做的就是继承它,实现自己的验证逻辑:
<?php /** * UserIdentity represents the data needed to identity a user. * It contains the authentication method that checks if the provided * data can identity the user. */ class UserIdentity extends CUserIdentity { public $id; /** * Authenticates a user. * The example implementation makes sure if the username and password * are both 'demo'. * In practical applications, this should be changed to authenticate * against some persistent user identity storage (e.g. database). * @return boolean whether authentication succeeds. */ public function authenticate() { //ucenter Yii::import('application.vendors.*'); include_once 'ucenter.php'; list($uid, $username, $password, $email) = uc_user_login($this->username, $this->password); if($uid > 0) { $user = user::model()->findByPk($uid); if($user == null)//说明网站数据库中没有,而ucenter中有这个用户,添加用户 { $user = new user; $user->username = $username; $user->password = md5($password); $user->email = $email; $user->id = $uid; $user->save(); $user->refresh(); } $this->username = $user->username; $this->id = $user->id; $user->last_login_time = $user->this_login_time; $user->this_login_time = time(); $user->last_login_ip = $user->this_login_ip; $user->this_login_ip = Yii::app()->getRequest()->userHostAddress; $user->save(); $this->errorCode=self::ERROR_NONE; } elseif($uid == -1) { $this->errorCode=self::ERROR_USERNAME_INVALID; } elseif($uid == -2) { $this->errorCode=self::ERROR_PASSWORD_INVALID; } return !$this->errorCode; } public function getId() { return $this->id; } }
请根据自己的应用情况进行修改即可,这里我们不需要对Yii的用户登录做任何修改。 - 然后我们修改 SiteController/actionLogin 方法,将同步登录其他应用的js输出到浏览器:
/** * Displays the login page */ public function actionLogin() { $model=new LoginForm; // if it is ajax validation request if(isset($_POST['ajax']) && $_POST['ajax']==='login-form') { echo CActiveForm::validate($model); Yii::app()->end(); } // collect user input data if(isset($_POST['LoginForm'])) { $model->attributes=$_POST['LoginForm']; // validate user input and redirect to the previous page if valid if($model->validate() && $model->login()) { //ucenter Yii::import('application.vendors.*'); include_once 'ucenter.php'; $script = uc_user_synlogin(Yii::app()->user->id); $this->render('loginsuc', array( 'script' => $script, )); Yii::app()->end(); } } // display the login form $this->render('login',array('model'=>$model)); }
简单的loginsuc.php视图文件:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <?php $this->layout = 'none'; echo $script; ?> <script type="text/javascript">setTimeout('location.href="<?php echo Yii::app()->user->returnUrl ?>"',3000);</script> 登录成功,正在返回登录前页面... </body> </html>
- 继续修改 SiteController/actionLogout方法,实现同步退出:
/** * Logs out the current user and redirect to homepage. */ public function actionLogout() { Yii::app()->user->logout(); //ucenter Yii::import('application.vendors.*'); include_once 'ucenter.php'; $script = uc_user_synlogout(); $this->render('logoutsuc', array( 'script' => $script, )); Yii::app()->end(); }
简单的logoutsuc.php视图文件:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <?php $this->layout = 'none'; echo $script; ?> <script type="text/javascript">setTimeout('location.href="<?php echo Yii::app()->homeUrl ?>"',3000);</script> 退出成功,正在返回首页... </body> </html>
- 进行到这里,我们已经实现了整合ucenter的登录和注册了,这样ucenter中有的用户,可以登录到yii应用,yii应用也可以注册用户到ucenter了。但是这还没有完成,我们需要的是在discuz中用户登录时,也同步登录yii应用,退出亦然,那么我们需要实现 Yii应用的 api/uc.php 这个接口程序。由于我们要用到Yii的框架资源,所以我没有采用硬编码的方式实现这个接口,而是创建了一个UcApplication类完成这个任务,继续往下看。
- 首先建立 api/uc.php 入口文件,代码如下:
<?php define('UC_CLIENT_VERSION', '1.6.0'); define('UC_CLIENT_RELEASE', '20110501'); define('API_DELETEUSER', 1); //note 用户删除 API 接口开关 define('API_RENAMEUSER', 1); //note 用户改名 API 接口开关 define('API_GETTAG', 1); //note 获取标签 API 接口开关 define('API_SYNLOGIN', 1); //note 同步登录 API 接口开关 define('API_SYNLOGOUT', 1); //note 同步登出 API 接口开关 define('API_UPDATEPW', 1); //note 更改用户密码 开关 define('API_UPDATEBADWORDS', 1); //note 更新关键字列表 开关 define('API_UPDATEHOSTS', 1); //note 更新域名解析缓存 开关 define('API_UPDATEAPPS', 1); //note 更新应用列表 开关 define('API_UPDATECLIENT', 1); //note 更新客户端缓存 开关 define('API_UPDATECREDIT', 1); //note 更新用户积分 开关 define('API_GETCREDITSETTINGS', 1); //note 向 UCenter 提供积分设置 开关 define('API_GETCREDIT', 1); //note 获取用户的某项积分 开关 define('API_UPDATECREDITSETTINGS', 1); //note 更新应用积分设置 开关 define('API_RETURN_SUCCEED', '1'); define('API_RETURN_FAILED', '-1'); define('API_RETURN_FORBIDDEN', '-2'); // change the following paths if necessary $yii=dirname(__FILE__).'/../protected/yii-1.1.6/framework/yii.php'; $config=dirname(__FILE__).'/../protected/config/main.php'; // remove the following lines when in production mode defined('YII_DEBUG') or define('YII_DEBUG',true); // specify how many levels of call stack should be shown in each log message defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',0); require_once($yii); require(dirname(__FILE__).'/../protected/components/UcApplication.php'); Yii::createApplication('UcApplication', $config)->run();
这里可以看到,这个脚本和标准的index.php是一样的,只是使用了不同的Application类。我们接着看这个类。 - 建立 protected/components/UcApplication.php类文件:
<?php class UcApplication extends CWebApplication { public $defaultController = 'Uc'; private $route = ''; protected function preinit() { $this->parseRequest(); } private function parseRequest() { $_DCACHE = $get = $post = array(); $code = @$_GET['code']; parse_str($this->_authcode($code, 'DECODE', UC_KEY), $get); if(MAGIC_QUOTES_GPC) { $get = $this->_stripslashes($get); } $timestamp = time(); if($timestamp - $get['time'] > 3600) { //exit('Authracation has expiried'); } if(empty($get)) { exit('Invalid Request'); } $action = $get['action']; require_once 'xml.class.php'; $post = xml_unserialize(file_get_contents('php://input')); Yii::log($get, 'debug'); Yii::log($post, 'debug'); $_GET = $get; $_POST = $post; $this->route = $this->defaultController .'/'. $action; if(!in_array($action, array('test', 'deleteuser', 'renameuser', 'gettag', 'synlogin', 'synlogout', 'updatepw', 'updatebadwords', 'updatehosts', 'updateapps', 'updateclient', 'updatecredit', 'getcreditsettings', 'updatecreditsettings'))) { exit(API_RETURN_FAILED); } } public function processRequest() { $this->runController($this->route); } private function _authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) { $ckey_length = 4; $key = md5($key ? $key : UC_KEY); $keya = md5(substr($key, 0, 16)); $keyb = md5(substr($key, 16, 16)); $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : ''; $cryptkey = $keya.md5($keya.$keyc); $key_length = strlen($cryptkey); $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string; $string_length = strlen($string); $result = ''; $box = range(0, 255); $rndkey = array(); for($i = 0; $i <= 255; $i++) { $rndkey[$i] = ord($cryptkey[$i % $key_length]); } for($j = $i = 0; $i < 256; $i++) { $j = ($j + $box[$i] + $rndkey[$i]) % 256; $tmp = $box[$i]; $box[$i] = $box[$j]; $box[$j] = $tmp; } for($a = $j = $i = 0; $i < $string_length; $i++) { $a = ($a + 1) % 256; $j = ($j + $box[$a]) % 256; $tmp = $box[$a]; $box[$a] = $box[$j]; $box[$j] = $tmp; $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); } if($operation == 'DECODE') { if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) { return substr($result, 26); } else { return ''; } } else { return $keyc.str_replace('=', '', base64_encode($result)); } } private function _stripslashes($string) { if(is_array($string)) { foreach($string as $key => $val) { $string[$key] = $this->_stripslashes($val); } } else { $string = stripslashes($string); } return $string; } }
这里可以看到,主要逻辑是processRequest方法,实现了ucenter通知的解码、调用相应的控制器和动作实现操作。 - 然后建立 protected/controller/UcController.php文件,代码如下:
<?php class UcController extends Controller { private $appdir = ''; protected function beforeAction(CAction $action) { $this->appdir = Yii::app()->basePath . '/vendors/'; return parent::beforeAction($action); } public function actionTest() { echo API_RETURN_SUCCEED; } public function actionDeleteuser() { $uids = explode(',', str_replace("'", '', $_GET['ids'])); !API_DELETEUSER && exit(API_RETURN_FORBIDDEN); $users = user::model()->findAllByPk($uids); foreach($users as $user) { $user->delete(); } echo API_RETURN_SUCCEED; } public function actionRenameuser() { $uid = $_GET['uid']; $usernameold = $_GET['oldusername']; $usernamenew = $_GET['newusername']; if(!API_RENAMEUSER) { echo API_RETURN_FORBIDDEN; } $user = user::model()->findByPk($uid); if($user !== null) { $user->username = $usernamenew; if($user->save(false)) echo API_RETURN_SUCCEED; else echo API_RETURN_FAILED; } } public function actionGettag() { $name = $_GET['id']; if(!API_GETTAG) { echo API_RETURN_FORBIDDEN; } $echo = array(); echo $this->_serialize($return, 1); } public function actionSynlogin() { $uid = $_GET['uid']; $username = $_GET['username']; if(!API_SYNLOGIN) { echo API_RETURN_FORBIDDEN; } $identity=new UcUserIdentity($username); if($identity->authenticate()) { Yii::app()->user->login($identity, 0); } header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'); //$_SESSION[Yii::app()->user->stateKeyPrefix.'__id'] = $uid; //$_SESSION[Yii::app()->user->stateKeyPrefix.'__name'] = $username; } public function actionSynlogout() { if(!API_SYNLOGOUT) { echo API_RETURN_FORBIDDEN; } //note 同步登出 API 接口 header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"'); Yii::app()->user->logout(); } public function actionUpdatepw() { if(!API_UPDATEPW) { echo API_RETURN_FORBIDDEN; } $username = $_GET['username']; $password = $_GET['password']; $user = user::model()->findByAttributes(array('username'=>$username)); if($user !== null) { $user->password = md5($password); if($user->save()) echo API_RETURN_SUCCEED; else echo API_RETURN_FAILED; } else echo API_RETURN_FAILED; } public function actionUpdatebadwords() { if(!API_UPDATEBADWORDS) { echo API_RETURN_FORBIDDEN; } $cachefile = $this->appdir.'./uc_client/data/cache/badwords.php'; $fp = fopen($cachefile, 'w'); $data = array(); if(is_array($_POST)) { foreach($_POST as $k => $v) { $data['findpattern'][$k] = $v['findpattern']; $data['replace'][$k] = $v['replacement']; } } $s = "<?php\r\n"; $s .= '$_CACHE[\'badwords\'] = '.var_export($data, TRUE).";\r\n"; fwrite($fp, $s); fclose($fp); echo API_RETURN_SUCCEED; } public function actionUpdatehosts() { if(!API_UPDATEHOSTS) { echo API_RETURN_FORBIDDEN; } $cachefile = $this->appdir.'./uc_client/data/cache/hosts.php'; $fp = fopen($cachefile, 'w'); $s = "<?php\r\n"; $s .= '$_CACHE[\'hosts\'] = '.var_export($_POST, TRUE).";\r\n"; fwrite($fp, $s); fclose($fp); echo API_RETURN_SUCCEED; } public function actionUpdateapps() { if(!API_UPDATEAPPS) { echo API_RETURN_FORBIDDEN; } $UC_API = $_POST['UC_API']; //note 写 app 缓存文件 $cachefile = $this->appdir.'./uc_client/data/cache/apps.php'; $fp = fopen($cachefile, 'w'); $s = "<?php\r\n"; $s .= '$_CACHE[\'apps\'] = '.var_export($_POST, TRUE).";\r\n"; fwrite($fp, $s); fclose($fp); //note 写配置文件 $config_file = Yii::app()->basePath.'./config/main.php'; if(is_writeable($config_file)) { $configfile = trim(file_get_contents($config_file)); $configfile = substr($configfile, -2) == '?>' ? substr($configfile, 0, -2) : $configfile; $configfile = preg_replace("/define\('UC_API',\s*'.*?'\);/i", "define('UC_API', '$UC_API');", $configfile); if($fp = @fopen($config_file, 'w')) { @fwrite($fp, trim($configfile)); @fclose($fp); } } echo API_RETURN_SUCCEED; } public function actionUpdateclient() { if(!API_UPDATECLIENT) { echo API_RETURN_FORBIDDEN; } $cachefile = $this->appdir.'./uc_client/data/cache/settings.php'; $fp = fopen($cachefile, 'w'); $s = "<?php\r\n"; $s .= '$_CACHE[\'settings\'] = '.var_export($_POST, TRUE).";\r\n"; fwrite($fp, $s); fclose($fp); echo API_RETURN_SUCCEED; } public function actionUpdatecredit() { if(!API_UPDATECREDIT) { echo API_RETURN_FORBIDDEN; } $credit = $_GET['credit']; $amount = $_GET['amount']; $uid = $_GET['uid']; echo API_RETURN_SUCCEED; } public function actionGetcredit() { if(!API_GETCREDIT) { echo API_RETURN_FORBIDDEN; } } public function actionGetcreditsettings() { if(!API_GETCREDITSETTINGS) { echo API_RETURN_FORBIDDEN; } $credits = array(); echo $this->_serialize($credits); } public function actionUpdatecreditsettings() { if(!API_UPDATECREDITSETTINGS) { echo API_RETURN_FORBIDDEN; } echo API_RETURN_SUCCEED; } private function _serialize($arr, $htmlon = 0) { if(!function_exists('xml_serialize')) { include_once 'xml.class.php'; } echo xml_serialize($arr, $htmlon); } }
上面用到了xml.class.php这个类文件,可以在uc_client/lib目录找到。
这里需要说明的是,actionSynlogin方法中,利用了我定义的特殊的UserIdentity来登录的,因为不需要提供密码。 - 再来看看最后一个类:
<?php /** * UserIdentity represents the data needed to identity a user. * It contains the authentication method that checks if the provided * data can identity the user. */ class UcUserIdentity extends CUserIdentity { public $id; /** * Constructor. * @param string $username username */ public function __construct($username) { $this->username=$username; $this->password=''; } /** * Authenticates a user. * The example implementation makes sure if the username and password * are both 'demo'. * In practical applications, this should be changed to authenticate * against some persistent user identity storage (e.g. database). * @return boolean whether authentication succeeds. */ public function authenticate() { $user = user::model()->findByAttributes(array('username'=>$this->username)); if($user == null)//说明网站数据库中没有,而ucenter中有这个用户,添加用户 { //ucenter Yii::import('application.vendors.*'); include_once 'ucenter.php'; list($uid, $username, $email) = uc_get_user($this->username); if($uid) { $user = new user; $user->username = $username; $user->password = md5(rand(10000,99999)); $user->email = $email; $user->id = $uid; $user->save(); $user->refresh(); } } $this->id = $user->id; $user->last_login_time = $user->this_login_time; $user->this_login_time = time(); $user->last_login_ip = $user->this_login_ip; $user->this_login_ip = Yii::app()->getRequest()->userHostAddress; $user->save(); $this->errorCode=self::ERROR_NONE; return !$this->errorCode; } public function getId() { return $this->id; } }
可以看到,在这个认证类中,实现了对yii应用中没有的用户的建立操作。然后不需要对yii应用做任何特殊设置,就可以实现api接口了。 - 然后我们在ucenter中添加yii应用的设置,修改main.php中的相应设置,应该就可以实现ucenter的同步登录、注册、退出、删除用户、修改用户名等等功能了!这个实现方法相对很Yii,呵呵。
有什么问题,欢迎评论,和我联系。大家一起进步吧!
PS: 需要注意的是,整合了ucenter的Yii应用在部署时,需将 protected/vendors/uc_client/data/及其子目录、文件设为可写。否则将会有些奇怪的问题。
评论
1 楼
windscar001
2014-04-23
[flash=200,200]
[/flash]
[flash=200,200][url][img][img][list] | ||||||||||
[*]||[/list][/img][/img][/url][/flash]| |
发表评论
-
系统管理员必须知道的PHP安全实践
2011-12-01 16:21 2943PHP是一种开源服务器端脚本语言,应用很广泛。Apache w ... -
Yii框架整合Ucenter更新与增强
2011-09-30 09:14 3696在我前面的博文中提出了整合ucenter到yii应用的方法 ... -
Nginx配置Yii和phpMyAdmin虚拟主机
2011-08-17 17:14 3482在我们部署项目时经常 ... -
Yii框架应用程序整合Ucenter实现同步注册、登录和退出等
2011-07-20 17:42 6957如今很多网站都要整合论坛程序,而康盛的Discuz系列产 ... -
友好HTTP错误信息逐个数
2011-06-22 15:55 1354一、友好HTTP错误信息逐个数 100 Continu ... -
Yii Framework 整合Extjs Direct实现RPC的方法
2010-12-17 22:17 5700这些天由于公司需要开发一个类似CRM的会员管理系统,我 ...
相关推荐
4. **Yii 与 UCenter 整合**:学习如何在 Yii 应用中集成 UCenter 的 SDK 或 API,实现用户认证和数据同步。这通常涉及在 Yii 的控制器中编写逻辑,调用 UCenter 的接口,并处理响应结果。 5. **安全与优化**:在...
4. RESTful API支持:Yii支持创建符合REST原则的Web服务,便于实现前后端分离和移动应用开发。 5. 命令行工具:yiic命令行工具可以帮助开发者快速生成代码、迁移数据库、执行任务等。 三、核心概念: 1. 固定的目录...
这个基本应用包括了首页、联系页、登录页三个页面,其中首页提供了应用信息和用户登录状态,联系页提供了一个表单供用户提交咨询,登录页则实现了用户认证功能。 Yii框架的目录结构清晰,主要包含以下目录和文件: ...
本书首先介绍 PHP 框架技术的概念及其应用领域,然后开始仿照 Yii 框架源代码 自定义框架,其中包括了 MVC 设计模式、单入口模式和应用(前端控制器模式)的实现。 充分了解了这部分知识后,读者对 Yii 框架也有了...
在“yii框架商城”中,用户注册、登录、权限控制等功能可以通过这些组件轻松实现。例如,Yii的` User` 组件可以用于处理用户身份验证,` AccessRule` 和` AuthManager` 可以用来定义和管理不同用户的访问权限。 ...
### YII框架应用详解 ...以上步骤详细介绍了如何使用YII框架创建一个基本的Web应用程序,包括环境配置、项目创建、项目结构解析以及路由配置等方面的内容。希望这些信息能够帮助开发者更好地理解和使用YII框架。
Yii框架以性能优化为设计核心,提供了一系列现代化的Web开发工具和技术,使得开发者可以快速、高效地编写高质量的代码。 在“yii1.1中文文档”中,包含了Yii 1.1版本的详尽教程和参考指南。这个版本是Yii框架的一个...
在IT行业中,开发高效、美观的后台管理系统是常见的需求,而`YII2`框架与`H+`后台UI框架的整合,就是一种优秀的解决方案。本文将深入探讨这两个框架的结合,以及如何进行相应的配置调整。 `YII2`是一个基于组件、高...
2. **Authentication与Authorization**:Yii提供了用户认证和授权机制,包括身份验证、角色基础访问控制(RBAC)等,确保应用的安全性。 3. **Form处理**:Yii提供了表单建模和验证功能,简化了表单数据的接收和...
首先,uniapp是一种基于Vue.js的多端开发框架,它允许开发者编写一次代码,然后在iOS、Android、H5、微信小程序、支付宝小程序等多个平台上运行。uniapp通过其强大的跨平台能力,极大地提高了开发效率,降低了开发...
在实际应用中,Yii框架可以广泛应用于各种类型的项目,例如内容管理系统(CMS)、商城系统(Shop)、办公系统(Office)和客户关系管理系统(CRM)。相比于特定领域框架,Yii更具有灵活性,可以适应多变的需求。 在...
Yii Yii框架 Yii框架快速入门,自己整理的很全的,很容易看懂
很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架很好用yii框架
【0507-03-yii框架整合用户登录模板】视频,会讲解如何在Yii中实现用户身份验证和授权。这通常涉及到创建用户模型、注册和登录表单、处理用户提交的数据以及使用Yii的安全组件来管理会话和密码加密。 在【0507-04-...
### Yii框架知识点总结 #### 一、概述与新特性 ...无论是在基础概念的理解还是实际开发过程中遇到的问题,Yii框架都有详尽的文档和技术支持,使得开发者能够更加专注于业务逻辑的实现,大大提高了开发效率。
5. **文档更新**:随着框架的更新,官方文档也会同步更新,为开发者提供关于新特性和更改的详细指南,帮助他们更好地理解和利用新版本的功能。 6. **社区支持**:Yii拥有活跃的社区,开发者可以在论坛、邮件列表或...
Yii框架是PHP领域的一款高效、灵活的Web应用开发框架,其设计模式基于MVC(Model-View-Controller),使得开发者可以快速构建复杂而稳定的Web应用。让我们深入了解一下Yii框架的执行流程及其部分源码分析。 1. **...
Yii 2.0是该框架的最新版本,经过全面重构,提供了更强大的功能和更好的性能。它遵循MVC(模型-视图-控制器)设计模式,使得开发者能够构建可维护、高效的Web应用程序。 1. **Yii框架的基本概念**: - **MVC架构**...