我有网站的子域(news.site.com,events.site.com等)。我被添加到配置我的自定义url规则中,他们通过DB中被请求的url文章找到并调用了具有动作显示的项目控制器。
例如:我想用url = 'some-article-with-custom-url'在db文章中找到url = 'some-article-with-custom-url',并在ArticleController中调用actionShow()。
但是在news.site.com和events.site.com上,我想找到不同site_id的文章(列在db中)
news.site.com - select * from article where site_id = 1 ...
events.site.com - select * from article where site_id = 2 ...
,我可以在其中插入一些子域设置,如果在UrlManager级别上,我必须已经有了这个设置?
'urlManager' => [
'rules' = [
...
[
'class' => 'common\components\ArticleUrlRule'
],
]
]这个类的解析req的实现:
public function parseRequest($manager, $request) {
$articleId = Article::getArticleIdByUrl($request->pathInfo);
if ( !empty($articleId) ) {
return [
'article/show',
[
'id' => $articleId
]
];
}
return false;
}发布于 2016-09-21 12:30:49
处理这个问题的最简单的方法,可能还有其他方法,从将每个子域定义为您的web服务器上的站点开始。正如您所注意到的,您可能有三个站点,一个主域和两个子域,另外两个web文件夹的副本分别命名为news and events,因此在Yii2项目根目录中,您将拥有web, events and news目录,它们将是web服务器上三个网站的三个文档根目录。
在每个web目录的index.php中,定义一个变量或常量来表示site id,以便在需要时在应用程序中使用它:
<?php
defined('SITE_ID') or define('SITE_ID', x); // where x is an integer
// comment out the following two lines when deployed to production
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'prod');
...发布于 2016-09-21 12:16:16
有几种方法可以做到这一点,从容易和无趣到硬和良好的结构。
我认为最好的方法是有一个URL配置:
'urlManager' => [
'rules' = [
[
'<controller:[\w-]+>/<id:\d+>'=>'<controller>/view',
]
]
]然后在你的ArticleController
public function actionShow($id)
{
// This might be better as a definition list stored in config or something
$site = null;
$sub = Yii::$app->request->hostInfo; // Put some logic here to split out subdomain
switch($sub){
case 'site1':
$site = 1;
}
$articleId = Article::find()->where(['id' => $id, 'site' => $site]);
}差不多吧。它可以变得更强大,而且,总体来说,从那里开始更好,但我相信这是一个很好的方法。
https://stackoverflow.com/questions/39616153
复制相似问题