我可以提出以下建议。
首先,您创建一个基本模型(例如,在components
目录中),您的其他模型将来自:
class BaseModel extends CActiveRecord
{
public static function getAdminRoute()
{
return null;
}
}
静态getAdminRoute
方法将为模型的管理页面提供 Yii 路由。你BaseModel
像这样扩展:
class Company extends BaseModel
{
public static function model($className = __CLASS__)
{
return parent::model($className);
}
public function tableName()
{
return "{{company}}";
}
public static function getAdminRoute()
{
return "admin/company";
}
}
下一步是确定应用程序中声明的所有模型:
$models = array();
$modelsDir = Yii::getPathOfAlias("application.models");
$dh = opendir($modelsDir);
if ($dh !== false)
{
$matches = array();
while (($modelFileName = readdir($dh)) !== false)
{
if (preg_match("/^([A-Za-z0-9]+)\.php$/", $modelFileName, $matches))
array_push($models, $matches[1]);
}
closedir($dh);
}
在检索到模型类列表(根据 Yii 命名约定文件的名称等于其类的名称)之后,您可以对其进行迭代并获取那些具有覆盖getAdminRoute
方法的模型的管理链接:
$adminLinks = array();
foreach($models as $model)
{
if (method_exists($model, "getAdminPage"))
{
$modelAdminRoute = $model::getAdminPage();
if ($modelAdminRoute !== null)
array_push($adminLinks, Yii::app()->createUrl($modelAdminRoute));
}
}
当然,您可以根据自己的喜好省略admin
部分并实现此方法,并添加一个额外的方法来获取链接的文本。getAdminRoute
出于性能原因,您还可以尝试使用Yii 提供的缓存功能缓存获得的管理链接列表。