Jump to content
Larry Ullman's Book Forums

Createcontroller() Method In Cwebapplication


Edward
 Share

Recommended Posts

I found the code below interesting from class CWebApplication which extends CApplication this is the method in Yii that will create a controllerId from the URL and actionId if there is one. Its worth taking a look at.

 

createController() method

public array createController(string $route, CWebModule $owner=NULL) $route string the route of the request. $owner CWebModule the module that the new controller will belong to. Defaults to null, meaning the application instance is the owner. {return} array the controller instance and the action ID. Null if the controller class does not exist or the route is invalid.

 

public function createController($route,$owner=null)
{
if($owner===null)
$owner=$this;
if(($route=trim($route,'/'))==='')
$route=$owner->defaultController;
$caseSensitive=$this->getUrlManager()->caseSensitive;
$route.='/';
while(($pos=strpos($route,'/'))!==false)
{
$id=substr($route,0,$pos);
if(!preg_match('/^\w+$/',$id))
return null;
if(!$caseSensitive)
$id=strtolower($id);
$route=(string)substr($route,$pos+1);
if(!isset($basePath)) // first segment
{
if(isset($owner->controllerMap[$id]))
{
 return array(
 Yii::createComponent($owner->controllerMap[$id],$id,$owner===$this?null:$owner),
 $this->parseActionParams($route),
 );
}
if(($module=$owner->getModule($id))!==null)
 return $this->createController($route,$module);
$basePath=$owner->getControllerPath();
$controllerID='';
}
else
$controllerID.='/';
$className=ucfirst($id).'Controller';
$classFile=$basePath.DIRECTORY_SEPARATOR.$className.'.php';
if($owner->controllerNamespace!==null)
$className=$owner->controllerNamespace.'\\'.$className;
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;
}
}

Link to comment
Share on other sites

 Share

×
×
  • Create New...