2016-04-06 3 views
9

Использование шаблона «базового» приложения, каков правильный способ ввода имени модуля, который отделен от входа в основной сайт?Yii2 - вход модуля в базовый шаблон приложения

Например, у меня есть модуль «admin», для которого требуется логин. Мне также нужен логин для входа на главный сайт.

Я сделал следующее:

  1. Создан admin модуль, использующий gii инструмент
  2. Создан models папку в папке admin модуля
  3. Размещенные LoginForm.php и User.php в этой папке (также обновленные объявления пространств имен в эти файлы)
  4. Добавлено AccessControl поведение и логин/выход из системы на modules\admin\controllers\DefaultController.php
  5. Обновлено config\web.php следующим образом:

    'modules' => [ 
        'admin' => [ 
         'class' => 'app\modules\admin\Module', 
        ], 
    ], 
    
  6. Обновлено app\modules\admin\Module.php следующим образом:

    public function init() 
    { 
        parent::init(); 
    
        Yii::$app->set('user', [ 
         'class' => 'yii\web\User', 
         'identityClass' => 'app\modules\admin\models\User', 
         'enableAutoLogin' => true, 
         'loginUrl' => ['admin/default/login'], 
        ]); 
    
        Yii::$app->set('session', [ 
         'class' => 'yii\web\Session', 
         'name' => '_adminSessionId', 
        ]); 
    } 
    

Проблема, которую я имею, что если я пытаюсь получить доступ к странице администратора, когда я я не вошел в систему, он показывает форму входа (это правильно). Однако при входе в систему он просто перенаправляет меня обратно на главный сайт. Он должен перенаправить меня на страницу администратора, к которой я пытался получить доступ.

В DefaultController.php, он имеет следующее (код по умолчанию):

if ($model->load(Yii::$app->request->post()) && $model->login()) 
    return $this->goBack(); 

Что такое правильный способ сделать это, чтобы я мог иметь независимые входы для модуля администрирования и для основного сайта? Я не хочу использовать «расширенный шаблон приложения», поскольку это добавляет некоторую ненужную сложность.

+0

Переключение к расширенному применению, это было сделано для этого, и это довольно легко превратить простое приложение на продвинутый. Вы поблагодарите хороших людей в Yii позже. –

ответ

0

goBack() по умолчанию homeUrl если у пользователя returnUrl пользователя не был задан.

Почему бы не просто перенаправить?

if ($model->load(Yii::$app->request->post()) && $model->login()) 
    return $this->redirect(['myadminmodule']); 
+0

Это всегда будет перенаправляться на фиксированную страницу. Он должен перенаправляться на любую страницу, к которой пользователь пытался получить доступ (если они еще не вошли в систему). – GSTAR

+0

Если пользователь приземлился на странице входа администратора, вы можете установить возвращаемый url. 'Yii :: $ app-> user-> returnUrl = Yii :: $ app-> request-> referrer;' Я бы добавил некоторые проверки, чтобы убедиться, что реферер не перенаправляется на внешний сайт. – Alex

0

Компонент Пользователь позволяет установить ReturnUrl Поглотитель объяснил: This method reads the return URL from the session. It is usually used by the login action which may call this method to redirect the browser to where it goes after successful authentication.

Рекомендуется: Перед обработкой данных, установите ReturnUrl по телефону Yii::$app->user->setReturnUrl(Url::current()); (это будет хранить страницу пользователь был Кроме того, вы можете управлять параметрами GET с помощью Url::current(), прежде чем передавать его на сеанс), и пусть фреймворк делает свою магию.

Не рекомендуется: После обработки данных, вы можете рассчитывать на ссылающейся (который не будет работать в некоторых случаях) следующим образом return Yii::$app->request->referrer ? $this->redirect(Yii::$app->request->referrer) : $this->goHome(); или вместо GOHOME, которые в основном перенаправляет app-> homeUrl, которые могут быть установлены во время Модуль первонач, можно сказать, что $this->redirect('your/admin/index');

Я рекомендую настройки ['homeUrl' => 'your/admin/index'] во время инициализации модуля, как вы, возможно, потребуется его для других функций, а также и Yii2 использует его в качестве «запасного варианта» для некоторых переадресаций, а также.

0

перейти к конфигурации/web.php и добавить его к компонентам

'backendUrlManager'=>[ 
     'class' => 'yii\web\urlManager', 
     'enablePrettyUrl'=>true, 
     'showScriptName'=>false, 
     'baseUrl'=>'/admin', 
    ], 

В DefaultController.php, он имеет следующий код (по умолчанию):

if ($model->load(Yii::$app->request->post()) && $model->login()) 

возвращение Yii :: $ app-> GetResponse() -> редирект (Yii :: $ app-> backendUrlManager-> BaseUrl);

0

Лучший способ - создать новый контроллер в модуле администратора, который должен иметь логин, выход из системы. Потому что в будущем вы можете добавить туда дополнительную логику.

В этом действии входа вы можете использовать тот же LoginForm.

Вы можете указать URL-адрес перенаправления в этом действии для входа.

Администратор класса модуль может, выглядит следующим образом:

namespace app\modules\admin; 

class Module extends \yii\base\Module 
{ 
    public $layout = 'main'; 

    public $defaultRoute = 'main/index'; 

    public function init() 
    { 
     parent::init(); 

     Yii::$app->errorHandler->errorAction = '/admin/main/error'; 
     Yii::$app->user->loginUrl = '/admin/main/login'; 
     ..... 

    } 
} 
Смежные вопросы