2016-09-21 4 views
1

У меня есть сайт с субдоменами (news.site.com, events.site.com и т. Д.). Я добавил в конфиг моих пользовательских правил URL-адреса, которые находят по запрошенному URL-адрес статьи в БД и вызвать контроллер статьи с действием шоуГде в Yii2 инициализировать некоторые настройки поддомена?

, например: 'news.site.com/some-article-with-custom-url' Я хочу найти в дб статье с url = 'some-article-with-custom-url' и вызвать actionShow() в ArticleController ,

Но news.site.com и events.site.com я хочу найти статьи с различными Site_ID (столбец в дБ)

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; 
} 

ответ

0

Самый простой способ справиться с этим, возможно, есть другие способы, начинается с определения каждого поддомена в качестве сайта на вашем веб-сервере. Как вы считали, у вас могут быть три сайта, один основной и два поддомена, сделать две дополнительные копии папки web, называя их news and events соответственно, поэтому в вашем корневом каталоге проекта Yii2 у вас будут web, events and news каталогов, в которых они будут три документы для трех веб-сайтов на вашем веб-сервере.

В 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'); 
... 
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]); 
} 

Сортировать вещи. Его можно сделать более надежным и, в целом, лучше оттуда, но я считаю, что это хороший способ сделать это.

+0

<контроллер: [\ w-] +>/ '=>' /view 'неподходящий, потому что у меня есть статьи в db с URL-адресами URL-с-custom-url', и я хочу рендерить эту статью по URL-адресу 'http://news.site. com/some-article-with-custom-url ', а не' news.site.com/article/12345 ' – CapitanSlow

+0

Ну, для одного это псевдокод, это не то, что нужно копировать и вставлять, а во-вторых, это простой пример, чтобы изменить его, будет '' / '=>' /view ', ' – Sammaye

+0

Нет, этот' переключатель' правильный. Вы устанавливаете '$ site' var и используется для ограничения запроса. – Sammaye