我的yii PHP项目有 UserController ,它有一个名为 actionView 的动作。我可以使用以下URL访问用户视图页面
mysite.com/user/view/id/1
我想将其更改为
mysite.com/username
我该怎么做。
我知道我可以简单地创建规则,以便更加用户友好地获取网址,例如
mysite.com/user/username
但是将数据库资源名称作为直接参数(mysite.com/username
)的url方案完全不同。
答案 0 :(得分:1)
网址规则:
array(
'<username:\w+>'=>'user/view',
)
请注意,在此类方案中,您还必须为所有控制器创建规则并在最后放置规则,因此最好将其作为用户的前缀:
array(
'user/<username:\w+>'=>'user/view',
)
生成的网址为example.com/user/username
行动中:
public function actionView($username) ...
<强>更新强> 要制定对任何输入变量做出反应的规则,请创建自定义URL规则类,这里有一些示例,根据您的需要进行修改:
class PageUrlRule extends CBaseUrlRule
{
public function createUrl($manager, $route, $params, $ampersand)
{
// Ignore this rule for creating urls
return false;
}
public function parseUrl($manager, $request, $pathInfo, $rawPathInfo)
{
// Ignore / url or any controller name - which could conflict with username
if($pathInfo == '/')
{
return true;
}
// Search for username or any resource in db
// This is for mongo so it should be tuned to your db,
// just check if username exists
$criteria = new EMongoCriteria();
$criteria->url->$lang = $url;
$criteria->select(['_id']);
$criteria->limit(1);
$model = PageItem::model();
$cursor = $model->findAll($criteria);
// Create route, instead of $url id can be used
$route = sprintf('content/page/view/url/%s', urlencode($url));
// If found return route or false if not found
return $cursor->count() ? $route : false;
}
}
然后将此规则放在urlmanager config
的开头'rules' => [
[
'class' => 'application.modules.content.components.PageUrlRule'
],
// Other rules here
重要:如果用户的用户名与控制器相同,则会匹配用户名,控制器将无法访问。您必须禁止注册与控制器同名的用户。