比较合理的做法其实是分成两个框架来布署;然而这样说法也太绝对。
事实上是针对不同系统,应采用不同的方法。如为CMS系统,则不需很复杂的权限管理,但如果有管理员与会员之分,系统又有很多设置操作,则需要前后台分离,并设置相应的权限管理。
大型的系统或是为安全因素考虑,则是布署成两个目录。
但一般的小型应用则不需要这样。
按照官方的cookebook有两种方法可选:一是modules,二是两个config。
modules的方法可参照boylee的教程,google yiigo即可。
这里是参照第二种方法来做的。
论坛上有人建议做一个主config.php然后使用CMap::mergeArray()将两个配置文件合并,好处是省事,配置方便。
但通常,前后台各有其配置。我这里采用了官方的方法,即前后台各使一个config,并不合并。便宜之处是前后台皆可使用gii(gii是yii的一大特色,工欲善其事,必先利其器,如果丢掉这么好的工具不用,有些可惜),另外便于操作,即便是新手也很容易配置。
现在将实现方法向大家汇报如下:
具体实现步骤:
一,建立入口
首先使用yiic 建立项目;其次,修改webroot 下的index-test.php,将其命名为admin.php(根据项目改名,此处只举例而已,不要认真,认真你就输了)。
修改admin.php
/** * This is the bootstrap file for test application. * This file should be removed when the application is deployed for production. */ // change the following paths if necessary $yii=dirname(__FILE__).'/../yii/framework/yii.php'; $config=dirname(__FILE__).'/protected/admin/config/main.php'; // remove the following line when in production mode defined('YII_DEBUG') or define('YII_DEBUG',true); require_once($yii); Yii::createWebApplication($config)->run();
ps:因为我将yii移到了项目之外,所以配置请以具体环境为准,此例仅做参照。
二、建立配置文件
在protected目录下建立admin目录,然后将protected下的config里的main.pphp拷贝过来;在admin目录依次建立controllers,models,views目录;然后将protected下的site相关目录考贝过来,放在相应层次。参考主目录结构建立如下:
admin |-- config | `-- main.php |-- controllers | `-- SiteController.php |-- models | |-- ContactForm.php | |-- LoginForm.php | `-- Operator.php |-- runtime | |-- `-- views |-- layouts | |-- column1.php | |-- column2.php | `-- main.php `-- site |-- contact.php |-- error.php |-- index.php |-- login.php `-- pages `-- about.php
ps:对于类linux系统请不要忘记修改相应的目录、文件权限。
三、修改配置admin/config/main.php参考如下:
<?php // 这里使用了一个扩展,故定义了一个别名 Yii::setPathOfAlias('ext', dirname(__FILE__).'/../extensions'); // 下面是分离前后台需要增加的 $backend=dirname(dirname(__FILE__)); $frontend=dirname($backend); Yii::setPathOfAlias('backend', $backend); // 下面是通用配置 return array( // 着重注意修改的地方 'basePath' => $frontend, 'controllerPath' => $backend.'/controllers', 'viewPath' => $backend.'/views', 'runtimePath' => $backend.'/runtime',; 'name'=>'后台管理程序', // preloading 'log' component 'preload'=>array('log'), // autoloading model and component classes 'import'=>array( 'application.models.*', 'application.components.*', // 着重注意修改的地方 'backend.models.*', 'backend.components.*',; 'ext.*',ext ), 'modules'=>array( // Gii tool 'gii'=>array( 'class'=>'system.gii.GiiModule', 'password'=>'password', 'generatorPaths'=>array( 'ext.dwz.gii.module.templates.dwz.module', ), // If removed, Gii defaults to localhost only. Edit carefully to taste. 'ipFilters'=>array('127.0.0.1','::1'), ), ), // application components 'components'=>array( 'user'=>array( // enable cookie-based authentication 'allowAutoLogin'=>true, ), // uncomment the following to enable URLs in path-format /* 'urlManager'=>array( 'urlFormat'=>'path', 'rules'=>array( '<controller:\w+>/<id:\d+>'=>'<controller>/view', '<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>', '<controller:\w+>/<action:\w+>'=>'<controller>/<action>', ), ), */ // MySQL database 'db'=>array( 'connectionString' => 'mysql:host=localhost;dbname=dbname', 'emulatePrepare' => true, 'username' => 'root', 'password' => '', 'charset' => 'utf8', ), 'errorHandler'=>array( // use 'site/error' action to display errors 'errorAction'=>'site/error', ), 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute', 'levels'=>'error, warning', ), // uncomment the following to show log messages on web pages array( 'class'=>'CWebLogRoute', ), ), ), ), // application-level parameters that can be accessed // using Yii::app()->params['paramName'] 'params'=>array( // this is used in contact page 'adminEmail'=>'webmaster@example.com', 'loginType'=>'', ), );
ps:请不要照抄,跟据实际情况调整,另注意web页面的转义。另,注意着重修改的地方。
四、生成后台model
因为import里导入了前后台的models因此,在后台可以使用前后台所有models。
下面利用yii神器GII,http://domain/admin.php?r=gii/model
请注意下图:
这里可以选择要生成的models的位置,默认的是applications.models。其实,一个gii也可以生成前后台models但用起来稍闲麻烦。
五、实现前后台登陆
验证部分不说了,修改UserIdentity.php和用户模型。具体可参考这里
主要的是在config/main.php里的params里增加了‘logintype’参数,用于标识登陆用户类型。这里是急中生智的办法,希望大侠们提出更好的方法。