Ссылки из frontend и backend yii2
  • 1282

Ссылки между frontend и backend в yii2

Автор: admin | 02 мая (Ср.) 2018г. в 22ч.55м.

В advensed шаблоне yii2 приложение разделено на три части - это frontend, common, backend.
И когда появляется необходимость сделать ссылку из админки, которая расположена в backend в часть
frontend или наоборот, то возникают вопросы, как лучше эту задачу решить. Я хочу поделиться рабочим
вариантом как сделать настройку приложения, чтобы такие url были доступны.

Вот так выглядит ссылка в админку из шапки сайта во frontend -
<?php if (!\Yii::$app->user->isGuest): ?> 
<?= \Yii::$app->user->identity->username; ?>
   <?php if (\Yii::$app->user->can(Rbac::PERMISSION_ADMIN_PANEL)): ?>
<!--url в админку-->
   <a title="Вход" href="<?= Yii::$app->urlManagerBackend->createUrl(['admin/index']); ?>">Админ часть</a>
<?php endif; ?>
<?php endif; ?>​

Теперь сделаем эту ссылку рабочей. В общем конфиге commom\config\main.php добавляем в секцию
components пути к urlmanager.php во frontend и backend -

<?php
//создаем $baseUrl
use \yii\web\Request;
$baseUrl = str_replace('/frontend/web', '', (new Request)->getBaseUrl());
$baseUrl = str_replace('/backend/web', '', $baseUrl);

return [
    
    ...
    'components' => [
        ...
        //для ссылок в админки во фронт и на оборот
        'urlManagerFrontend' => require(dirname(dirname (__DIR__ )).'/frontend/config/urlmanager.php'),
        'urlManagerBackend' =>  require(dirname(dirname (__DIR__ )).'/backend/config/urlmanager.php'),

В frontend\config\main.php:
Добавляем $baseUrl в массив request:
'request' => [
            'csrfParam' => '_csrf-user',
            'baseUrl' => $baseUrl,//добавляем $baseUrl
            'cookieValidationKey' => 'sdifdbfshbsnstyrfedwety,mnbvcdsfe',
        ],    
    
'urlManager' => [
            'class' => 'yii\web\UrlManager',
            'baseUrl' => $baseUrl,
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'enableStrictParsing' => true,

            'rules' => [

                'admin/index' => 'admin/index',
                ...
                
            ],
        ]​
В backend\config\main.php:
Добавляем $baseUrl в массив request
'request' => [
            'csrfParam' => '_csrf-user',
            'baseUrl' => $baseUrl.'/backend/web',//добавляем $baseUrl
            'cookieValidationKey' => 'sdifdbfshbsnstyrfedwety,mnbvcdsfe',
        ],      
    
'urlManager' => [
            'class' => 'yii\web\UrlManager',
            'baseUrl' => $baseUrl.'/backend/web',
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'enableStrictParsing' => true,
            'rules' => [
              ...
                
            ],
        ]​
В конфигурации все.

Конечно должен быть .htaccess в корне:
# Mod_Autoindex
<IfModule mod_autoindex.c>
    # Disable Indexes
    Options -Indexes
</IfModule>

# Mod_Rewrite
<IfModule mod_rewrite.c>
    # Enable symlinks
    Options +FollowSymlinks
    # Enable mod_rewrite
    RewriteEngine On

    #no end slesh
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} ^(.+)/$
    RewriteRule ^(.+)/$ /$1 [R=301,L]

    # Backend redirect
    RewriteCond %{REQUEST_URI} ^/backend
    RewriteRule ^backend(.*) /backend/web/$1 [L]

    # Statics redirect
    RewriteCond %{REQUEST_URI} ^/phpm
    RewriteRule ^phpm/(.*)$ phpm/$1 [L]

    # Frontend redirect
    RewriteCond %{REQUEST_URI} ^(.*)$
    RewriteRule ^(.*)$ frontend/web/$1
</IfModule> 
.htaccess в frontend и backend:
AddDefaultCharset UTF-8
RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule . index.php​

Теперь из админки можно формировать url так:
\Yii::$app->urlManagerFrontend->createUrl(["/"]);
\Yii::$app->urlManagerFrontend->createUrl(["/blog/article/{$model->alias}"]);​
А в админку из фронта:
\Yii::$app->urlManagerBackend->createUrl(["admin/index"]); 
\Yii::$app->urlManagerBackend->createUrl(["admin/view/{$id}"]);​

Приветствую!

Меня зовут Сергей. Я - автор этого блога.

Если Вам был полезен материал на моем сайте, поддержите пожалуйста мой проект, чтобы о нем узнали другие люди - кликните plizz :) на иконку в соц. сети, чтобы поделиться материалом с другими.