|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
理解动态语言的概念,运做机制,熟悉PHP语法 利用yii框架的url途径普通形如hostname/?r=xxxx/xxxx/xxxx&sdfs=dsfdsf
咱们可以看到有时会利用protected目次下的controller,有时会利用module中controller,详细是若何处置的呢,请看以下的剖析:
以下代码摘自yii框架中心代码%Yiiroot%/framework/web/CWebApplication.php
复制代码 代码以下:
=================================================================================================
//1.runController是履行一个controller的办法,$route是$_GET['r']
public function runController($route)
{
//在这里挪用createController先去创立一个controller实例,因而可知createController是选择controller的关头
if(($ca=$this->createController($route))!==null)
{
list($controller,$actionID)=$ca;
$oldController=$this->_controller;
$this->_controller=$controller;
$controller->init();
$controller->run($actionID);
$this->_controller=$oldController;
}
else
throw new CHttpException(404,Yii::t('yii','Unable to resolve the request "{route}".',
array('{route}'=>$route===''?$this->defaultController:$route)));
}
==================================================================================================
//2.接上去咱们剖析createController,假定咱们会见的route是site/contact
public function createController($route,$owner=null)
{
//初次进入这个函数,$owner参数为空
if($owner===null)
$owner=$this;
//假如$route参数中不含/,那末利用默许的controller
if(($route=trim($route,'/'))==='')
$route=$owner->defaultController;
$caseSensitive=$this->getUrlManager()->caseSensitive;
//为了可以完全运转上面的轮回,给$route前面加一个/
$route.='/';
//将/的地位保留在$pos中
while(($pos=strpos($route,'/'))!==false)
{
//$id是前半局部,即site
$id=substr($route,0,$pos);
if(!preg_match('/^\w+$/',$id))
return null;
if(!$caseSensitive)
$id=strtolower($id);
//$route酿成后半局部,即contact
$route=(string)substr($route,$pos+1);
//controller根目次或子目次前缀
if(!isset($basePath)) // first segment
{
//初次进入,$owner为空,没有这个成员变量
//非初次进入或$owner有值,有能够设置了这个成员变量,拜见CWebModule类
if(isset($owner->controllerMap[$id]))
{
return array(
Yii::createComponent($owner->controllerMap[$id],$id,$owner===$this?null:$owner),
$this->parseActionParams($route),
);
}
//假如能经由过程getModule办法获得到一个自力模块,则再次挪用createController,合用于site是module名的情形,参考protected/config/main.php设置装备摆设文件,例如你的controller在%webroot%/protected/module/site/controller/ContactController.php
if(($module=$owner->getModule($id))!==null)
return $this->createController($route,$module);
//controller的目次:
//关于CWebApplication,对应config['basePath'](拜见设置装备摆设文件)./controller/,例如你的controller在%webroot%/protected/controller/SiteController.php
//关于CModule的子类,对应改子类地点文件夹./contoller/,例如你的controller在%webroot%/protected/module/site/controller/ContactController.php
$basePath=$owner->getControllerPath();
$controllerID='';
}
else
$controllerID.='/';
$className=ucfirst($id).'Controller';
$classFile=$basePath.DIRECTORY_SEPARATOR.$className.'.php';
//假如$classFile存在,依据下面所失掉的controller类文件途径,创立类实例
//假如不存在,则是子目次下的controller,持续轮回寻觅终究的controller,例如你的controller在%webroot%/protected/controller/somedir/SiteController
if(is_file($classFile))
{
if(!class_exists($className,false))
require($classFile);
if(class_exists($className,false) && is_subclass_of($className,'CController'))
{
$id[0]=strtolower($id[0]);
return array(
new $className($controllerID.$id,$owner===$this?null:$owner),
$this->parseActionParams($route),
);
}
return null;
}
$controllerID.=$id;
$basePath.=DIRECTORY_SEPARATOR.$id;
}
}
怎么培养啊 别光说不练啊,好 ,比如新人入门自己步是配置环境,虽然现在都有很多的集成环境,但是真实的体验下配置环境还是会有很多帮助,不论是你以后工作还是在真实的linux下开发。 |
|