在Yii2中init哪些子域设置?

时间:2016-09-21 12:07:11

标签: php model-view-controller web yii2

我有子域名的网站(news.site.com,events.site.com等)。 我被添加到配置我的自定义网址规则,谁通过DB中的请求的网址文章找到并通过动作显示调用文章控制器

例如:'news.site.com/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'
    ],
  ]
]

实现此类的解析请求:

public function parseRequest($manager, $request) {
   $articleId = Article::getArticleIdByUrl($request->pathInfo);

   if ( !empty($articleId) ) {
        return [
            'article/show',
            [
                'id' => $articleId
            ]
        ];
    }

    return false;
}

2 个答案:

答案 0 :(得分:0)

有几种方法可以做到这一点,从简单和hacky到坚硬和良好的形式。

我认为最好的方法是使用一个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]);
}

有点东西。它可以变得更加强大,一般来说,从那里开始变得更好,但我相信这是一个很好的方法。

答案 1 :(得分:0)

处理此问题的最简单方法,可能还有其他方法,从将每个子域定义为Web服务器上的站点开始。正如您所看到的,您可能有三个站点,一个主站点和两个子域名,另外两个web文件夹的副本分别命名为news and events,因此在您的Yii2项目根目录中,您将拥有{ {1}}目录,它们将成为Web服务器上三个网站的三个文档的根目录。

在每个网络目录的web, events and news中定义一个变量或一个常量来表示index.php,以便在需要时在您的应用程序中使用它:

site id