Yii app user: User, yii\web\User | API Documentation for Yii 2.0

Содержание

Просмотр и редактирование профиля пользователя

В прошлой части мы исправляли и переводили интерфейс нашего приложения. Сегодня мы, как анонсировалось ранее, добавим страницу просмотра профиля пользователя и выведем формы для редактирования информации о пользователе и для смены пароля.

Часть 1: Установка и настройка приложения
Часть 2: Настройка IDE и модульная структура
Часть 3: Перенос пользователей в БД
Часть 4: Доработка шаблона и локализация

Для удобства изучения сходники проекта теперь доступны на GitHub.

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

Итак, приступим. В модуле user на данный момент имеется только контроллер DefaultController.

Дадим пользователю возможность просматривать и редактировать свой профиль. Для этого добавим новый контроллер ProfileController, доступный только для авторизованных пользователей. Сделаем его пока с единственным действием index. В этом действии мы получаем модель текущего пользователя и передаём в представление:

namespace app\modules\user\controllers;
 
use app\modules\user\models\User;
use yii\filters\AccessControl;
use yii\web\Controller;
use Yii;
 
class ProfileController extends Controller
{
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
        ];
    }
 
    public function actionIndex()
    {
        return $this->render('index', [
            'model' => $this->findModel(),
        ]);
    }
 
     @return 
    private function findModel()
    {
        return User::findOne(Yii::$app->user->identity->getId());
    }
}

Вспомним, что наша модель User

реализовывает интерфейс IdentityInterface и её класс указан в качестве identityClass для компонента Yii::$app->user:

$config = [
    . ..
    'components' => [
        'user' => [
            'identityClass' => 'app\modules\user\models\User',
            'enableAutoLogin' => true,
        ],
        ...
    ],
];

и при авторизации в качестве Yii::$app->user->identity используется именно экземпляр модели User текущего пользователя. Это значит, что в качестве $model мы могли бы использовать прямо этот экземпляр Yii::$app->user->identity. Но безопаснее в ходе выполнения действия контроллера не давать доступа к самому экземпляру Yii::$app->user->identity. Поэтому мы ещё раз загрузили экземпляр пользователя из базы данных:

return User::findOne(Yii::$app->user->identity->getId());

При этом не возникнет проблем с пустым identity, так как с помощью поведения AccessControl мы разрешаем доступ ко всем действиям этого контроллера только авторизованным пользователям.

В представлении modules/user/views/profile/index.php будем просто выводить информацию о пользователе с помощью виджета DetailView:

<?php
 
use yii\helpers\Html;
use yii\widgets\DetailView;
 
 @var 
 @var 
 
$this->title = Yii::t('app', 'TITLE_PROFILE');
$this->params['breadcrumbs'][] = $this->title;
?>
<div>
 
    <h2><?= Html::encode($this->title) ?></h2>
 
    <?= DetailView::widget([
        'model' => $model,
        'attributes' => [
            'username',
            'email',
        ],
    ]) ?>
 
</div>

Теперь мы можем попробовать отобразить профиль. Для удобства добавим в меню пункт Профиль:

echo Nav::widget([
    'options' => ['class' => 'navbar-nav navbar-right'],
    'items' => array_filter([
        ['label' => Yii::t('app', 'NAV_HOME'), 'url' => ['/main/default/index']],
        ['label' => Yii::t('app', 'NAW_CONTACT'), 'url' => ['/main/contact/index']],
        Yii::$app->user->isGuest ?
            ['label' => Yii::t('app', 'NAV_SIGNUP'), 'url' => ['/user/default/signup']] :
            false,
        Yii::$app->user->isGuest ?
            ['label' => Yii::t('app', 'NAV_LOGIN'), 'url' => ['/user/default/login']] :
            false,
        !Yii::$app->user->isGuest ?
            ['label' => Yii::t('app', 'NAV_PROFILE'), 'url' => ['/user/profile/index']] :
            false,
        !Yii::$app->user->isGuest ?
            ['label' => Yii::t('app', 'NAV_LOGOUT'),
                'url' => ['/user/default/logout'],
                'linkOptions' => ['data-method' => 'post']] :
            false,
    ]),
]);

и не забудем добавлять переводы по мере необходимости в файлы в созданных на прошлом уроке папках messages/en и messages/ru. [\w_-]+$#i’], [‘username’, ‘unique’, ‘targetClass’ => self::className(), ‘message’ => Yii::t(‘app’, ‘ERROR_USERNAME_EXISTS’)], [‘username’, ‘string’, ‘min’ => 2, ‘max’ => 255], [’email’, ‘required’], [’email’, ’email’], [’email’, ‘unique’, ‘targetClass’ => self::className(), ‘message’ => Yii::t(‘app’, ‘ERROR_EMAIL_EXISTS’)], [’email’, ‘string’, ‘max’ => 255], [‘status’, ‘integer’], [‘status’, ‘default’, ‘value’ => self::STATUS_ACTIVE], [‘status’, ‘in’, ‘range’ => array_keys(self::getStatusesArray())], ]; } … }

Нашу модель можно выводить в форму редактирования с любыми полями из этих. Например, мы могли бы вывести форму с полем для адреса электронной почты, создав действие редактирования в контроллере ProfileController:

class ProfileController extends Controller
{
    ...
 
    public function actionUpdate()
    {
        $model = $this->findModel();
 
        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['index']);
        } else {
            return $this->render('update', [
                'model' => $model,
            ]);
        }
    }
 
    ...
}

и сделав для него представление с формой:

...
 
<?php $form = ActiveForm::begin([]); ?>
 
<?= $form->field($model, 'email')->input('email', ['maxlength' => true]) ?>
 
<div>
    <?= Html::submitButton(Yii::t('app', 'BUTTON_SAVE'), ['class' => 'btn btn-primary']) ?>
</div>
 
<?php ActiveForm::end(); ?>
 
...

Но есть нюанс:

Из формы будут приниматься все перечисленные в rules() поля. И если пользователь с помощью инструментов разработчика в браузере добавит в форму поле User[status] или User[username], то может изменить недоступные ему поля. Но нам нужно сохранить эти поля для редактирования в панели администратора.

Для решения этой проблемы можно пойти двумя путями. Их мы и рассмотрим.

Сценарии модели

Любая модель в Yii2 позволяет задавать ей несколько сценариев использования, для которых можно задавать разные правила валидации и для смены поведения.

Нам нужно ввести два сценария: один для администратора (со всеми правилами) и второй для пользователя в его профиле. По умолчанию в модели все правила рассматриваются для сценария default, хранящегося в константе Model::SCENARIO_DEFAULT. Так что нам остаётся добавить один сценарий profile. Обозначим его также константой User::SCENARIO_PROFILE:

class User extends ActiveRecord implements IdentityInterface
{
    const SCENARIO_PROFILE = 'profile';
 
    ...
}

Теперь нам нужно определить, какие правила будут работать у администратора, а какие на странице профиля пользователя. Можно пойти путём

Yii1, введя в специфические правила указания применимости on к сценарию либо исключения except:

class User extends ActiveRecord implements IdentityInterface
{
    const SCENARIO_PROFILE = 'profile';
 
    ...
 
    public function rules()
    {
        return [
            ...
 
            ['email', 'required', 'except' => self::SCENARIO_PROFILE],
            ['email', 'email', 'except' => self::SCENARIO_PROFILE],
            ['email', 'unique', 'targetClass' => self::className(), 'except' => self::SCENARIO_PROFILE, 'message' => Yii::t('app', 'ERROR_EMAIL_EXISTS')],
            ['email', 'string', 'max' => 255, 'except' => self::SCENARIO_PROFILE],
 
            ...
        ];
    }
}

И фреймворк для сканирования атрибутов запустит метод scenarios()

модели, который обойдёт все правила и построит список сценариев и полей для них.

Но это не очень удобно с большим количеством правил. Намного удобнее оставить правила как есть и самому переопределить метод scenarios(), где вручную перечислить нужные для каждого сценария поля:

class User extends ActiveRecord implements IdentityInterface
{
    const SCENARIO_PROFILE = 'profile';
 
    ...
 
    public function scenarios()
    {
        return [
            self::SCENARIO_DEFAULT => ['username', 'email', 'status'],
            self::SCENARIO_PROFILE => ['email'],
        ];
    }
}

или аналогично:

class User extends ActiveRecord implements IdentityInterface
{
    const SCENARIO_PROFILE = 'profile';
 
    ...
 
    public function scenarios()
    {
        return ArrayHelper::merge(parent::scenarios(), [
            self::SCENARIO_PROFILE => ['email'],
        ]);
    }
}

Этими строками мы разрешим пользователю редактировать только адрес электронной почты. А все остальные поля разрешим менять в будущем только администратору.

Теперь в действии редактирования профиля не забудем указать модели нужный нам сценарий:

namespace app\modules\user\controllers;
 
use app\modules\user\models\User;
use yii\filters\AccessControl;
use yii\web\Controller;
use Yii;
use yii\widgets\ActiveForm;
 
class ProfileController extends Controller
{
    ...
 
    public function actionUpdate()
    {
        $model = $this->findModel();
        $model->scenario = User::SCENARIO_PROFILE;
 
        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['index']);
        } else {
            return $this->render('update', [
                'model' => $model,
            ]);
        }
    }
 
    ...
}

И добавим само представление modules/user/views/profile/update.php с формой:

<?php
use yii\bootstrap\ActiveForm;
use yii\helpers\Html;
 
 @var 
 @var 
 
$this->title = Yii::t('app', 'TITLE_UPDATE');
$this->params['breadcrumbs'][] = ['label' => Yii::t('app', 'TITLE_PROFILE'), 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div>
 
    <h2><?= Html::encode($this->title) ?></h2>
 
    <div>
 
        <?php $form = ActiveForm::begin(); ?>
 
        <?= $form->field($model, 'email')->textInput(['maxlength' => true]) ?>
 
        <div>
            <?= Html::submitButton(Yii::t('app', 'BUTTON_SAVE'), ['class' => 'btn btn-primary']) ?>
        </div>
 
        <?php ActiveForm::end(); ?>
 
    </div>
 
</div>

Пока у нас здесь всего одно поле:

Но в будущем можем реализовать и другие настройки профиля.

Теперь рассмотрим другой подход.

Модели форм

Использовать сценарии удобно, но это немного захламляет модель. Если мы вспомним наши страницы логина, регистрации, восстановления пароля, то для них почему-то добавлены отдельные модели LoginForm, SignupForm и PasswordResetForm.

Но ведь, по сути, это относится к модели пользователя. Их бы можно было реализовать с помощью единственной модели User со сценариями SCENARIO_LOGIN, SCENARIO_SIGNUP и подобными. Но кроме различия правил валидации в этих моделях есть свои специфические методы login(), signup() и прочие, которые нужны только для одного действия.

Если бы мы собрали все эти сценарии использования в одной модели User, то там оказалось бы слишком много вспомогательного кода для реализации всех случаев жизни. И, в итоге, наша модель из простой записи ActiveRecord превратилась бы в большой комбайн с десятками и сотнями методов и вспомогательных полей.

Именно поэтому ради упрощения кода для реализации специфичных форм желательно создавать отдельные модели.

Это, во первых, позволяет получить несколько простых и «чистых» классов.

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

И, в третьих, внутри такой отдельной модели удобно добавлять любой код, любые public поля, оперировать любыми другими сущностями. Например, подписать пользователя на рассылку, если он поставил галочку в поле subscribe. Помещать это всё в одну модель User было бы слишком громоздко.

Так что добавим новую форму для редактирования данных пользователя с полем $email:

namespace app\modules\user\models;
 
use yii\base\Model;
use yii\db\ActiveQuery;
use Yii;
 
class ProfileUpdateForm extends Model
{
    public $email;
 
     @var 
    private $_user;
 
    public function __construct(User $user, $config = [])
    {
        $this->_user = $user;
        $this->email = $user->email;
        parent::__construct($config);
    }
 
    public function rules()
    {
        return [
            ['email', 'required'],
            ['email', 'email'],
            [
                'email',
                'unique',
                'targetClass' => User::className(),
                'message' => Yii::t('app', 'ERROR_EMAIL_EXISTS'),
                'filter' => ['<>', 'id', $this->_user->id],
            ],
            ['email', 'string', 'max' => 255],
        ];
    }
 
    public function update()
    {
        if ($this->validate()) {
            $user = $this->_user;
            $user->email = $this->email;
            return $user->save();
        } else {
            return false;
        }
    }
}

У нас нет в базе отдельной таблицы profile, так что мы будем использовать только модель User. Мы переопределили конструктор так, чтобы получать эту модель. Поменяем теперь контроллер:

public function actionUpdate()
{
    $user = $this->findModel();
    $model = new ProfileUpdateForm($user);
 
    if ($model->load(Yii::$app->request->post()) && $model->update()) {
        return $this->redirect(['index']);
    } else {
        return $this->render('update', [
            'model' => $model,
        ]);
    }
}

Всё. Сценарий SCENARIO_PROFILE нам здесь больше не нужен.

Страница редактирования профиля готова.

Страница смены пароля

Чтобы не загромождать модель User, сделаем смену пароля отдельной от редактирования профиля формой.

Для формы ввода создадим модель PasswordChangeForm и добавим три поля для нового и текущего паролей и правила валидации для них. В эту модель через конструктор мы будем передавать модель пользователя, чей пароль нужно будет изменить. Для валидации текущего пароля создадим отдельный метод-валидатор currentPassword, который будет проверять правильность пароля, вызывая метод validatePassword переданной ему модели пользователя:

namespace app\modules\user\models;
 
use yii\base\Model;
use Yii;
 

class PasswordChangeForm extends Model
{
    public $currentPassword;
    public $newPassword;
    public $newPasswordRepeat;
 
     @var 
    private $_user;
 
     @param  @param 
    public function __construct(User $user, $config = [])
    {
        $this->_user = $user;
        parent::__construct($config);
    }
 
    public function rules()
    {
        return [
            [['currentPassword', 'newPassword', 'newPasswordRepeat'], 'required'],
            ['currentPassword', 'currentPassword'],
            ['newPassword', 'string', 'min' => 6],
            ['newPasswordRepeat', 'compare', 'compareAttribute' => 'newPassword'],
        ];
    }
 
    public function attributeLabels()
    {
        return [
            'newPassword' => Yii::t('app', 'USER_NEW_PASSWORD'),
            'newPasswordRepeat' => Yii::t('app', 'USER_REPEAT_PASSWORD'),
            'currentPassword' => Yii::t('app', 'USER_CURRENT_PASSWORD'),
        ];
    }
 
     @param  @param 
    public function currentPassword($attribute, $params)
    {
        if (!$this->hasErrors()) {
            if (!$this->_user->validatePassword($this->$attribute)) {
                $this->addError($attribute, Yii::t('app', 'ERROR_WRONG_CURRENT_PASSWORD'));
            }
        }
    }
 
     @return 
    public function changePassword()
    {
        if ($this->validate()) {
            $user = $this->_user;
            $user->setPassword($this->newPassword);
            return $user->save();
        } else {
            return false;
        }
    }
}

Добавим действие смены пароля в наш контроллер:

namespace app\modules\user\controllers;
 
use app\modules\user\models\PasswordChangeForm;
use app\modules\user\models\User;
use yii\filters\AccessControl;
use yii\web\Controller;
use Yii;
 
class ProfileController extends Controller
{
    . ..
 
    public function actionPasswordChange()
    {
        $user = $this->findModel();
        $model = new PasswordChangeForm($user);
 
        if ($model->load(Yii::$app->request->post()) && $model->changePassword()) {
            return $this->redirect(['index']);
        } else {
            return $this->render('passwordChange', [
                'model' => $model,
            ]);
        }
    }
 
    ...
}

и добавим представление modules/user/views/profile/passwordChange.php:

<?php
 
use yii\bootstrap\ActiveForm;
use yii\helpers\Html;
 
 @var 
 @var 
 
$this->title = Yii::t('app', 'TITLE_PASSWORD_CHANGE');
$this->params['breadcrumbs'][] = ['label' => Yii::t('app', 'TITLE_PROFILE'), 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div>
 
    <h2><?= Html::encode($this->title) ?></h2>
 
    <div>
 
        <?php $form = ActiveForm::begin(); ?>
 
        <?= $form->field($model, 'currentPassword')->passwordInput(['maxlength' => true]) ?>
        <?= $form->field($model, 'newPassword')->passwordInput(['maxlength' => true]) ?>
        <?= $form->field($model, 'newPasswordRepeat')->passwordInput(['maxlength' => true]) ?>
 
        <div>
            <?= Html::submitButton(Yii::t('app', 'BUTTON_SAVE'), ['class' => 'btn btn-primary']) ?>
        </div>
 
        <?php ActiveForm::end(); ?>
 
    </div>
 
</div>

Страница смены пароля готова:

Теперь в соседнее представление просмотра профиля index.php добавим ссылки на эти действия:

<?php
use yii\helpers\Html;
use yii\widgets\DetailView;
 
 @var 
 @var 
 
$this->title = Yii::t('app', 'TITLE_PROFILE');
$this->params['breadcrumbs'][] = $this->title;
?>
<div>
 
    <h2><?= Html::encode($this->title) ?></h2>
 
    <p>
        <?= Html::a(Yii::t('app', 'BUTTON_UPDATE'), ['update'], ['class' => 'btn btn-primary']) ?>
        <?= Html::a(Yii::t('app', 'LINK_PASSWORD_CHANGE'), ['password-change'], ['class' => 'btn btn-primary']) ?>
    </p>
 
    <?= DetailView::widget([
        'model' => $model,
        'attributes' => [
            'username',
            'email',
        ],
    ]) ?>
 
</div>

В приложении теперь появилась страница просмотра профиля:

страница редактирования данных (пока у нас всего одно поле):

и страница смены пароля:

Вот и всё. А дальше:

Часть 6: Модуль администрирования и GridView

Подписывайтесь на рассылку (форма в сайдбаре), чтобы не пропустить продолжение и получать полезные фишки, и оставляйте свои предложения или замечания в комментариях. И оставляйте предложения по темам будущих вебинаров здесь. Спасибо!

Yii: аутентификация и авторизация

Основные моменты аутентификации и авторизации в Yii.

Аутентификация — идентификация, установление личности (идентичности, identity) пользователя, ввод логина и пароля.

Авторизация — проверка прав уже идентифицированного пользователя (или анонимного) на доступ к данным.

Identity — индивидуальность, идентичность, подлинность, тождественность, личность.

Для аутентификации в Yii используются:

  • компонент user (yii\web\User)
  • интерфейс yii\web\IdentityInterface

В настройках компонента user (в конфигурации) нужно указать identityClass — класс, который будет содержать логику аутентификации. Как правило это класс модели, представляющий пользователя. Этот класс должен реализовывать интерфейс yii\web\IdentityInterface.

Интерфейс yii\web\IdentityInterface включает следующие методы:

  • findIdentity() — поиск пользователя (личности, identity) по Id, а точнее поиск  экземпляра класса, реализующего интерфейс IdentityInterface. Метод используется для сохранения статуса идетнификации пользователя в сессию
  • findIdentityByAccessToken() — тоже самое, но по знаку доступа. Применяется для аутентификации в RESTfull приложениях
  • getId() — возвращает Id пользователя (личности, identity)
  • getAuthKey() — возвращает ключ аутентификации сохраненный на сервере для валидации ключа, сохраненного в куку при логине (в процессе аутентификации). Ключи сравниваются для установления валидности ключа из куки
  • validateAuthKey() — валидация ключа аутентификации, сохраненного в куку

Реализовывать все методы не обязательно, не нужные можно оставить с пустым телом.  В простых MVC приложениях используются методы findIdentity(), getAuthKey(), validateAuthKey() и getId(), в REST приложениях — findIdentityByAccessToken() и getId().

Класс, реализующий интерфейс yii\web\IdentityInterface, может одновременно наследоваться от ActiveRecord.

В контроллерах можно использовать статические методы и свойства компонента user (yii\web\User) для идентификации пользователя:

  • Yii::$app->user->identity — возвращает экземпляр класса представляющий залогиненного пользователя или null если пользователь не аутентифицирован
  • Yii::$app->user->id — возвращает id залогиненного пользователя (null для не аутентифицорованных)
  • Yii::$app->user->isGuest — true если пользователь не аутентифицирован
  • Yii::$app->user->login($identity) — залогинивает пользователя
  • Yii::$app->user->logout() — разлогинивает пользователя

Yii Авторизация. Использование модуля Yii-user

Первое, с чего начинается разработка проекта, это конечно авторизация. Само собой ряд проектов также включает и настройки профиля, или личный кабинет. Под эти требования вполне подойдёт модуль yii-user. Возможности расширения:

  • Авторизация с помощью имени пользователя или email

  • Регистрация

  • Активация аккаунтов (c проверочным email)

  • Восстановление пароля (отправка ключа восстановления на электронную почту пользователя)

  • Профиль пользователя

  • Управление пользователями

  • Управление полями профиля  

  • Виджет для просмотра, добавление и удаление полей и сохранения данных  на основе CRUD

  • Виджет даты с использованием jQueryUI DatePicker

  • Виджет загрузки файлов

  • Виджет связи профиля

  • API модуля

Настройка модуля. Для начала нужно скачать дистрибутив yii-user. Скаченный модуль установить в папку modules, если её нет, создать. Путь должен быть такой /protected/modules/user/ Подключение модуля. Настраиваем /protected/config/main.php:

'import'=>array(
    # Добавить в autoloading model and component classes'application.modules.user.*',
    'application.modules.user.models.*',
    'application.modules.user.components.*',
    'application.modules.rights.*',
    'application.modules.rights.models.*',
    'application.modules.rights.components.*',
    #...
),
'modules'=>array(
    # Добавить в список модулей'user' => array(
        // названия таблиц взяты по умолчанию, их можно изменить, для удобства используйте свой префикс и названия'tableUsers' => 'tbl_users',
        'tableProfiles' => 'tbl_profiles',
        'tableProfileFields' => 'tbl_profiles_fields',
    ),
  
),
'components'=>array(
    # Описать в компонентах класс'user'=>array(
        'class' => 'RWebUser',
        'allowAutoLogin'=>true,
    ),
    'authManager'=>array(
        'class'=>'RDbAuthManager',
        'defaultRoles' => array('Guest') //  роль пользователя по умолчанию 
    ),
    
),

Следующим шагом импортируем дапм бд, который прилагается в модуле /protected/modules/user/data/schema.mysql.sql

Теперь можно логиниться, в бд появилось 2 пользователя аdmin и demo соответственно с паролями, аdmin и demo. Но сначала выведем в меню кнопку авторизации. Для этого отредактируем виджет zii.widgets.CMenu. В файле protected\views\layouts\main.php отвечающим за вывод страницы добавим в массив следующие строки:

array('url'=>Yii::app()->getModule('user')->loginUrl, 'label'=>Yii::app()->getModule('user')->t("Login"), 'visible'=>Yii::app()->user->isGuest),
array('url'=>Yii::app()->getModule('user')->registrationUrl, 'label'=>Yii::app()->getModule('user')->t("Register"), 'visible'=>Yii::app()->user->isGuest),
array('url'=>Yii::app()->getModule('user')->profileUrl, 'label'=>Yii::app()->getModule('user')->t("Profile"), 'visible'=>!Yii::app()->user->isGuest),
array('url'=>Yii::app()->getModule('user')->logoutUrl, 'label'=>Yii::app()->getModule('user')->t("Logout"). ' ('.Yii::app()->user->name.')', 'visible'=>!Yii::app()->user->isGuest),

 Теперь в появившемся меню можно логиниться.

 Справа видна панель управление пользователями в стиле CRUD. На изображении у меня русифицированный модуль, он имеет поддержку русского. Для русификации я добавил в protected\config\main.php следующие строки:

return array(
  //...  
  'language' => 'ru',
  //...
)

 Вот и всё, модуль вполне расширяемый и хорошо работает с модулем настройки прав. rights

Yii2-как получить текущее имя пользователя из Yii::$app — >user?

В то время как другие темы здесь, на SO, предлагают решение chincy hack, или просто принести его через Yii::$app->user->identity, я собираюсь показать вам, как это сделать правильно. Вы можете подчинить Yii2 своей воле, фактически расширяя все!

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

Аварийный курс пространства имен: в basic, у вас есть namespace app\path\to. Именно здесь находится файл. Например, у вас есть контактная форма.php находится в корневом каталоге приложения models, поэтому его пространство имен — app\models. В advanced у вас есть несколько приложений (frontend & backend), поэтому корень приложения отличается, поэтому у вас есть frontend в качестве одного корня приложения и backend в качестве другого. Каталог models в расширенном приложении находится в «frontend / models», а его пространство имен — frontend\models. — Таким образом, где бы вы ни увидели «приложение» в пространстве имен, вы можете заменить его на frontend или backend для «продвинутый» шаблон.


Решение

Во-первых, нам нужно изменить конфигурационный файл нашего приложения, чтобы переопределить класс пользовательского компонента по умолчанию. Я опущу все, что не связано, поэтому вы держите свое identityClass определенным, я просто не показываю его. Мы просто добавляем, а не заменяем конфигурацию. Кроме того, там, где я показываю frontend/something, то же самое можно сделать для backend/something. Я просто не собираюсь повторять это снова и снова…

Basic (config/web.php) — или-Advanced (frontend/config/main.php)

'components' => [
    'user' => [
        'class' => 'app\components\User', // extend User component
    ],
],

помните: если вы используете расширенный шаблон, замените app на frontend или backend!

Я также хочу отметить, что вам нужно будет создать каталог «компоненты», если вы этого не сделали. Именно здесь многие люди добавляют свои пользовательские классы. Будь то ваш собственный вспомогательный класс или расширение базового компонента Yii (например, расширение yii\web\Controller).

Создайте новый файл в вашем каталоге components с именем User.php. В этом файле поместите следующий код:

<?php
namespace app\components;

use Yii;

/**
 * Extended yii\web\User
 *
 * This allows us to do "Yii::$app->user->something" by adding getters
 * like "public function getSomething()"
 *
 * So we can use variables and functions directly in `Yii::$app->user`
 */
class User extends \yii\web\User
{
    public function getUsername()
    {
        return \Yii::$app->user->identity->username;
    }

    public function getName()
    {
        return \Yii::$app->user->identity->name;
    }
}

Примечание: username и name должны быть допустимыми именами столбцов в пользовательской таблице базы данных!

Так что теперь мы можем использовать это в нашем контроллере, представлении, где угодно. . Давайте проверим это. В views/site/index.php добавьте это в нижнюю часть страницы:
<?= \Yii::$app->user->name ?>
<?= \Yii::$app->user->username ?>

Если все хорошо, и у вас есть значения в таблице user для name и username, они должны быть напечатаны на странице:)

пользователей | Документация HumHub

Пользовательский компонент №

Компонент \ humhub \ modules \ user \ components \ User доступен для Yii :: $ app-> user и, кроме других, предоставляет следующее функции:

  • Доступ к идентификатору пользователя, вошедшего в систему в данный момент:
  • Проверить активацию гостевого или гостевого режима:
Скопировать

if (Yii :: $ app-> user-> isGuest) {

}

используйте humhub \ modules \ user \ helpers \ AuthHelper;

if (AuthHelper :: isGuestAccessEnabled ()) {

}

Копировать

Yii :: $ app-> user-> isAdmin ()

User Identity #

Доступ к идентификатору текущего зарегистрированного пользователя от Yii :: $ app-> user-> identity и в случае не гостя пользователи вернут экземпляр \ humhub \ modules \ user \ models \ User .

Профиль пользователя доступен для Yii :: $ app-> user-> identity-> profile см. \ humhub \ modules \ user \ models \ Profile

Примечание: Yii :: $ app- > user-> identity может возвращать null в случае гостевых пользователей. Помните об этом для частей, доступных для гостей вашего кода.

Удаление пользователей #

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

Мягкое удаление #

Типичные варианты использования для вариант мягкого удаления:

  • Удалить статусы участия (например,грамм. назначения задач)
  • Удалить личную информацию и изображения

Вы можете управлять опцией мягкого удаления, перехватывая событие \ humhub \ modules \ user \ models \ User :: EVENT_BEFORE_SOFT_DELETE .

Пример config.php :

Скопируйте

use humhub \ modules \ user \ models \ User;

return [

‘events’ => [

[Пользователь :: класс, Пользователь :: EVENT_BEFORE_SOFT_DELETE, [События :: класс, ‘onUserSoftDelete’]],

],

];

?>

Пример обратного вызова в ваших модулях События class:

Скопируйте публичную статическую функцию

onUserSoftDelete (UserEvent $ event)

{

$ user = $ event-> user;

MyParticipations :: deleteAll ([‘user_id’ => $ user-> id]);

}

Жесткое удаление #

Параметр жесткого удаления стирает все данные, относящиеся к удаленному пользователю.Объекты HumHub, созданные пользователем, такие как комментарии, файлы, сообщения, уведомления или действия, будут автоматически удалены вместе с профилем пользователя.

Пример ‘ config.php ‘:

Скопируйте

use humhub \ modules \ user \ models \ User;

return [

‘events’ => [

[Пользователь :: класс, Пользователь :: EVENT_BEFORE_DELETE, [События :: класс, ‘onUserDelete’]],

],

];

?>

Пример обратного вызова в ваших модулях События class:

Скопируйте публичную статическую функцию

onUserDelete (событие $ event)

{

$ user = $ event-> sender;

MyRecord :: deleteAll ([‘user_id’ => $ user-> id]);

}

craft \ web \ Пользователь | Ссылка на класс Craft 3

Тип
Класс
Пространство имен
craft \ web
Наследует
craft \ web \ User » yii \ web \ Пользователь » yii \ base \ Component » yii \ base \ BaseObject
Реализует
yii \ base \ Configurable
Начиная с
3. 0,0

Компонент «Пользователь» предоставляет API-интерфейсы для управления статусом аутентификации пользователя.

Экземпляр компонента User доступен глобально в Craft через Craft :: $ app-> user .

Просмотреть исходный код

Public Properties

elevatedSessionTimeout
Тип
целое число, логическое значение
Значение по умолчанию
null
Доступ
Текущее количество секунд только для чтения
осталось только для чтения повышенная пользовательская сессия или false, если он был отключен.

Просмотреть исходный код

elevatedSessionTimeoutParam
Тип
строка
Значение по умолчанию
'__elevated_timeout'

Имя сеанса, используемое для хранения значения переменной состояния сеанса с повышенным сроком действия метки времени окончания сеанса.

Просмотреть исходный код

hasElevatedSession
Тип
логическое
Значение по умолчанию
null
Доступ
Только для чтения

04 Доступ

к исходному файлу

isAdmin

Тип
логическое
Значение по умолчанию
null
Доступ
Только чтение

Является ли текущий пользователь администратором.

Просмотреть исходный код

isGuest
Тип
логическое
Значение по умолчанию
null
Доступ
Только чтение

Является ли текущий пользователь гостем.

Просмотреть исходный код

Оставшееся время сеанса
Тип
целое число
Значение по умолчанию
null
Доступ
Только чтение

Если в сеансе осталось -1, или истекает при завершении их HTTP-сеанса.

Просмотреть исходный код

запомнено Имя пользователя
Тип
строка, пустое значение
Значение по умолчанию
null
Доступ
Только для чтения
14
4
4
4
строка
Значение по умолчанию
null

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

Просмотреть исходный код

tokenParam
Тип
строка
Значение по умолчанию
'__token'

Имя переменной сеанса, используемое для хранения токена сеанса пользователя.

Просмотреть исходный код

usernameCookie
Тип
массив
Значение по умолчанию
null

Конфигурация файла cookie имени пользователя.

См. Также yii \ web \ Cookie

Просмотреть исходный код

Публичные методы

checkPermission ()

Возвращает, имеет ли текущий пользователь данное разрешение.

Просмотреть исходный код

Аргументы
  • $ permissionName (строка) — Имя разрешения.
Возвращает

логическое значение — имеет ли текущий пользователь разрешение.

destroyDebugPreferencesInSession ()

УСТАРЕЛО

Устарело в 3.5.0

Удаляет настройки отладки из сеанса.

Просмотреть исходный код

generateToken ()
Начиная с
3.1.1

Создает новый токен сеанса пользователя.

Просмотреть исходный код

Аргументы

getElevatedSessionTimeout ()

Возвращает, сколько секунд осталось в текущем сеансе пользователя с повышенными привилегиями.

Просмотреть исходный код

Возвращает

целое число, логическое — количество секунд, оставшихся в текущем сеансе пользователя с повышенными привилегиями или false, если он был отключен.

getHasElevatedSession ()

Возвращает, есть ли у пользователя сеанс с повышенными правами.

Просмотреть исходный код

Возвращает

логическое значение — имеет ли пользователь в настоящий момент сеанс с повышенными привилегиями

getIsAdmin ()

Возвращает, является ли текущий пользователь администратором.

Просмотреть исходный код

Возвращает

логическое значение — является ли текущий пользователь администратором.

getIsGuest ()

Возвращает значение, указывающее, является ли пользователь гостем (не аутентифицирован).

Просмотреть исходный код

Возвращает

логическое значение — является ли текущий пользователь гостем.

getRemainingSessionTime ()

Возвращает, сколько секунд осталось в текущем сеансе пользователя.

Просмотреть исходный код

Возвращает

целое число — секунды, оставшиеся в сеансе, или -1, если их сеанс истекает, когда их HTTP-сеанс завершается.

getRememberedUsername ()

Возвращает имя пользователя учетной записи, под которой браузер последний раз входил в систему.

Просмотреть исходный код

Возвращает

string, null

getReturnUrl ()

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

Этот метод считывает URL-адрес возврата из сеанса. Обычно он используется действием входа в систему, которое может вызывать этот метод для перенаправления браузера туда, куда он переходит после успешной аутентификации.

Просмотреть исходный код

Аргументы
Возвращает

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

guestRequired ()
Начиная с
3.4.0

Перенаправляет браузер пользователя с гостевой страницы.

Просмотреть исходный код

Возвращает

craft \ web \ Response — Ответ перенаправления

Выдает

loginByUserId ()

Вход пользователя в систему по его идентификатору.

Просмотреть исходный код

Аргументы
  • $ userId (целое число) — идентификатор пользователя
  • $ duration (целое число) — количество секунд, в течение которых пользователь может оставаться в состоянии входа в систему. По умолчанию 0, что означает вход в систему до тех пор, пока пользователь не закроет браузер или сеанс не будет уничтожен вручную. Если больше 0 и enableAutoLogin истинно, будет поддерживаться вход на основе файлов cookie. Обратите внимание, что если enableSession имеет значение false, этот параметр будет проигнорирован.
Возвращает

логическое значение — вошел ли пользователь в систему.

removeReturnUrl ()

Удаляет сохраненный URL-адрес возврата, если он есть.

См. Также getReturnUrl () Просмотреть исходный код

saveDebugPreferencesToSession ()

УСТАРЕЛО

Устаревшее в 3.5.0

Сохраняет настройки панели инструментов Debug для авторизованного пользователя в сеансе.

Просмотреть исходный код

sendUsernameCookie ()

Отправляет файл cookie имени пользователя.

Этот метод используется после входа пользователя в систему. Он сохраняет имя пользователя вошедшего в систему в файле cookie, чтобы формы входа могли запоминать начальное значение имени пользователя в формах входа.

См. Также afterLogin () Просмотреть исходный код

Аргументы

startElevatedSession ()

Запускает пользовательский сеанс с повышенными привилегиями для текущего пользователя.

Просмотреть исходный код

Аргументы
  • $ пароль (строка) — текущий пароль пользователя
Возвращает

логическое значение — был ли пароль действителен, а сеанс пользователя был повышен

Выдает

switchIdentity ()

Переключает на новый идентификатор для текущего пользователя.

Когда enableSession имеет значение true, этот метод может использовать сеанс и / или cookie для хранения идентификационной информации пользователя, по стоимости $ дюрация . Пожалуйста, обратитесь к login () для получения более подробной информации.

Этот метод в основном вызывается функциями login (), logout () и loginByCookie () когда текущего пользователя необходимо связать с соответствующей идентификационной информацией.

Просмотреть исходный код

Аргументы
  • $ identity (yii \ web \ IdentityInterface, null) — идентификационная информация, которая будет связана с текущим пользователем.Если null, это означает переключение текущего пользователя на гостя.
  • $ duration (целое число) — количество секунд, в течение которых пользователь может оставаться в состоянии авторизации. Этот параметр используется, только если $ identity не равно нулю.

Защищенные методы

afterLogin ()

Этот метод вызывается после успешного входа пользователя в систему.

Реализация по умолчанию запускает событие EVENT_AFTER_LOGIN. Если вы переопределите этот метод, убедитесь, что вы вызываете родительскую реализацию так что событие запускается.

Просмотреть исходный код

Аргументы
  • $ identity (yii \ web \ IdentityInterface) — Идентификационная информация пользователя
  • $ cookieBased (логическое значение) — Используется ли логин на основе файлов cookie
  • $ duration ( целое число) — количество секунд, в течение которых пользователь может оставаться в состоянии авторизации. Если 0, это означает вход в систему, пока пользователь не закроет браузер или сеанс не будет уничтожен вручную.

afterLogout ()

Этот метод вызывается сразу после выхода пользователя из системы через logout ().

Реализация по умолчанию вызовет событие EVENT_AFTER_LOGOUT. Если вы переопределите этот метод, убедитесь, что вы вызываете родительскую реализацию так что событие запускается.

Просмотреть исходный код

Аргументы

beforeLogin ()

Этот метод вызывается перед входом пользователя в систему.

Реализация по умолчанию вызовет событие EVENT_BEFORE_LOGIN. Если вы переопределите этот метод, убедитесь, что вы вызываете родительскую реализацию так что событие запускается.

Просмотреть исходный код

Аргументы
  • $ identity (yii \ web \ IdentityInterface) — Идентификационная информация пользователя
  • $ cookieBased (логическое значение) — Используется ли логин на основе файлов cookie
  • $ duration ( целое число) — количество секунд, в течение которых пользователь может оставаться в состоянии авторизации. Если 0, это означает вход в систему, пока пользователь не закроет браузер или сеанс не будет уничтожен вручную.
Возвращает

логическое значение — должен ли пользователь продолжать вход в систему.

beforeLogout ()

Этот метод вызывается при вызове logout () для выхода пользователя из системы.

Реализация по умолчанию вызовет событие EVENT_BEFORE_LOGOUT. Если вы переопределите этот метод, убедитесь, что вы вызываете родительскую реализацию так что событие запускается.

Просмотреть источник

Аргументы
Возвращает

логическое значение — должен ли пользователь продолжать выход из системы

RenewAuthStatus ()

Обновляет статус аутентификации с использованием информации из сеанса и cookie.

Этот метод попытается определить личность пользователя с помощью переменной сеанса idParam.

Если установлен authTimeout, этот метод обновит таймер.

Если идентификация пользователя не может быть определена в сеансе, этот метод попытается войти в систему с помощью файла cookie. если enableAutoLogin истинно.

Просмотр исходного кода

Константы

Константа Описание
EVENT_AFTER_LOGIN
EVENT_AFTER_LOGOUT
EVENT_BEFORE_LOGIN
EVENT_BEFORE_LOGOUT

Yii 2 — Отображение flash-сообщений (пользователей) на сайте

Как отображать простые пользовательские сообщения на сайте с помощью фреймворка Yii 2.

Немного теории

Флэш-сообщения в данном случае — это уведомления, отображаемые пользователю при любых событиях.

Yii 2 уже имеет встроенный механизм для работы с флеш-сообщениями. Он работает по следующему принципу:

  1. Используйте метод \ Yii :: $ app-> session-> addFlash () , чтобы добавить сообщение в сеанс.
  2. Сообщение в сеансе сохраняется до тех пор, пока оно не будет извлечено оттуда методом Yii :: $ app-> session-> getAllFlashes () .
  3. Как только сообщение извлечено, оно удаляется из сеанса.

Реализация флэш-сообщений

Далее в качестве базы кода будет использоваться базовый шаблон приложения, предоставленный Yii 2. О том, как установить базовый шаблон приложения, рассказывается в этой статье.

Теперь реализуем flash сообщения на практике. В этом примере рассматриваются простейшие уведомления пользователей без какой-либо анимации и т. Д. Эти уведомления будут отображаться в верхней части сайта перед отображением остальной части содержимого.

  1. Сначала создайте сценарий вспомогательного представления, в который мы поместим код, выводящий флэш-сообщение. Для этого создайте файл \ views \ layouts \ main \ flashes.php со следующим содержимым:

       session-> getAllFlashes () as $ type => $ messages):?>
    
        
  2. Затем вам нужно отобразить только что созданный сценарий представления мигает. php в макете \ views \ layouts \ main.php :

  1. Теперь вы можете проверить, как работают флеш-сообщения, для этого в контроллере \ controllers \ SiteController.php добавляем следующее строки кода:

  1. Обновите страницу в веб-браузере и посмотрите результат:

Заключение

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

Структура Yii для контроля доступа с фильтрацией доступа пользователей, Yii :: app () Пояснение к рабочему запросу, SQL и времени выполнения скрипта, контроллеру доступа и методу

【Контроль доступа пользователей】

Предпосылки системы: вход пользователя, обратная сторона, список продуктов, добавление элементов, редактирование товаров

Получено несколько страниц у пользователей Нет системы входа в систему Когда доступ запрещен, например, Список товаров 、 Добавление товаров 、 Редактировать магазин

Существуют некоторые страницы независимо от того, доступна ли система входа пользователя, например, Вход пользователя








примечание:

Некоторые методы запрещают доступ к контроллеру (даже если пользователи входят в систему) При доступе он будет первым, если пользователя просят войти в систему Если пользователь вошел в систему, это напрямую 403 Нет доступа.

Объяснение ключевых слов:

Определение прав пользователя:

* Все пользователи (независимо от того, вошли ли они в систему)

? Анонимный пользователь

имя пользователя Конкретный пользователь

@ Система входа в систему




Контроль доступа пользователей два символа: + —

+ Фильтры специально указывают, какой метод работает для

— В дополнение к представлениюЭтот метод будут отфильтрованы другие методы

Перейти к экрану входа по умолчанию:

Приемная:

За кулисами:

【Yii :: app () Понимание】

Yii :: app () Это экземпляр объекта, мы можем напрямую управлять объектом, находящимся внутри текущего кадра,

Мы можем понять этот объект в первом приложении запроса объекта.

YiiFramework — это чисто объектно-ориентированный фреймворк, который вызывается с использованием атрибутов класса объекта, методов, полного запроса приложения.

На основе анализа мы знаем, что Yii :: app () Первый объект — это система, это босс, мы можем использовать систему для вызова объекта внутри других соответствующих методов, свойств, объектов.

Yii :: app () YesCwebApplicationClass экземпляры объектов

CwebApplication (framework / web / CwebApplication.php)

, следовательно, Yii :: app () Вы можете вызвать свойства или методы класса CwebApplication или parentCApplicationRelated внутри.

Примечание. Не посещайте метод корреляции WebApplication или его родительский класс, это повлияет на стабильность системы.

Может функционировать get_class (Objects) Для получения соответствующего класса в соответствии с объектом.

Компоненты системы

Мы можемYii :: app () Компоненты системного вызова

БД журнала запросов сеанса пользователя и т. Д.

Доступ к любой части системы прямо над компонентами

Yii :: app () -> user (Создать экземпляр объекта ‘CWebUser’ => ‘/web/auth/CWebUser.php’,)

Yii :: app () -> сеанс (Instantiation’CHttpSession)

Yii :: app () -> запрос

Yii :: приложение () -> db


Yii :: app () При входе в instantiateindex.php

[MessageFlash ()】

setFlash () Сообщение о настройке

getFlash () Извлечь сообщение

hasFlash () Определяет, соответствует ли сообщение

Например: setFlash («успех», «Добавить успешный продукт»)

Будет присутствоватьВнутренние хранилищаинформация о доступе

HasFlash («успех»); Он определит текущую сессию Внутри нет имени успех Эта переменная

getFlash («успех») будет gosession Внутри названия экстракта dsuccessThis variable,

После того, как willsuccess Эта переменная дает нам удалить (Обновите страницу это сообщение исчезнет)

вышеупомянутая вспышка Информация — это пользовательские компоненты пользователь Для установки


Просмотр дисплея

【время отображения】

отображает время выполнения qlStatementmain. php



Написать собственный код времени выполнения сценария


[Удалить пользователей из системы с помощью cookie】

Yii :: app () -> пользователь-> выйти из системы ();

[Как получить текущий контроллер и метод]

Контроллер : $ this -> id;

метод : $ this-> action-> id;

итого:

1. Фильтр контроля доступа пользователей

* @? имя пользователя + —

Фильтры

Контроль доступа

правила доступа

2. Примеры прямого управления Yii :: app ()

3. Показать сообщение setFlash () getFlash () hasFlash ()

4. sql Время выполнения оператора или кода скрипта displayYii :: beginProfile () endProfile ()

5. Удалить пользователя выходит из системного cookie с сеансом

6. Как получить контроллер и метод $ this -> id; $ это -> действие-> идентификатор;

Yii-2: автоматическое развертывание на Heroku | by Waqqas Jabbar

Heroku — отличная платформа для развертывания вашего следующего приложения Yii2. Yii-2 поставляется с множеством шаблонов приложений, но, по сути, есть базовый шаблон, который ближе к приложению Yii-1, а также есть «расширенный» шаблон. Есть несколько особенностей расширенного шаблона Yii, которые требуют особого внимания.

Мы рассмотрим следующие темы

  • Автоматическое развертывание в нескольких средах (этап / производство)
  • Доступ к веб-интерфейсу / бэкэнду
  • Бонус: настройка DNS с использованием доменов Google

Есть несколько концепций, которые необходимо понять прежде чем мы перейдем к практическим деталям.

  1. Расширенный шаблон Yii-2 имеет отдельные каталоги внешнего и внутреннего интерфейса. По сути, это два приложения, которые используют одну и ту же базу данных. Оба этих приложения должны быть доступны по одному и тому же URL-адресу.
  2. Yii-2 имеет встроенный механизм для поддержки нескольких сред. Он предоставляет имя сценария « init ». Он используется для настройки конкретной среды.
  3. Heroku имеет встроенный контроль версий Git для приложений. Когда код загружается в Git, он автоматически запускает команду « composer install » (для приложений PHP). Мы будем использовать post-install-cmd в composer для запуска сценария оболочки. Этот сценарий оболочки будет запускать сценарий init и другие задачи.
  4. Мы будем использовать переменные конфигурации Heroku для передачи соответствующих параметров в сценарий init .
  5. Мы будем использовать два приложения Heroku, одно для постановки, а другое для производства.

Допустим, у вас есть веб-приложение Yii-2, и вы хотите развернуть его на Heroku. (или вы можете запустить новое приложение Yii-2 здесь). Вот список шагов для выполнения

brew install heroku

  • Создайте бесплатную учетную запись Heroku и войдите в интерфейс командной строки.

heroku login

  • Создание приложений Heroku: мы создаем два приложения, одно для постановки, а другое для производства.Обратите внимание на URL-адрес Git, указанный в ответе.

приложения heroku: создать demo-stage

heroku apps: создать demo-prod

  • Добавить удаленные репозитории Git

git remote add stage https://git.heroku.com/demo-stage. git

git remote add prod https://git.heroku.com/demo-prod.git

heroku config: set ENV = Staging -r stage

heroku config: set ENV = Production -r prod

дополнений heroku: создать cleardb: ignite -r stage

дополнений heroku: создать cleardb: ignite -r prod

Вы можете подключиться к серверу Heroku по SSH с помощью

heroku run bash -r stage

heroku run bash — r prod

Следующие изменения необходимо внести в проект Yii

«composer. json ». (Корневой каталог) Добавить тег сценариев для запуска post-install-cmd.sh
  • composer.json: (Корневой каталог) Добавить тег сценариев для запуска post-install-cmd.sh
  • nginx.conf: Настроить на позволяет доступ к бэкэнду через URL-адрес «/ backend» (пример ниже)
  • Procfile: Добавьте файл Procfile с веб-сервером nginx и передайте файл nginx.conf и frontend / web в качестве корневого каталога (пример ниже)
  • post-install-cmd.sh: Добавьте скрипт, запускающий команду init на Heroku (пример ниже).
  • Каталог окружений: Создайте каталоги для промежуточного (этап) и рабочего (продакшн).
  • Добавьте composer.json, composer.lock, nginx.conf, Procfile, post-install-cmd.sh и каталоги среды в git
  • Используйте переменную среды для настройки компонента «db» в «environment / stage / common / config. /main-local.php »и« environment / prod / common / config / main-local.php »

Для развертывания просто нажмите на соответствующее репо (этап или производство) с помощью командной строки или IDE

git push stage master

git push prod master

Предположим, у вас есть доменное имя из Google Domains и вы хотите развернуть

доменов heroku: добавьте stage. .com -r stage

heroku domains: wait ‘stage. .com’ -r stage

Следуя инструкциям в этих ссылках для настройки домена Google

Link-1

Link -2

Развертывание, упомянутое в этой статье, позволяет одним щелчком мыши (или командой — git push) развернуть PHP-приложение на основе Yii-2. Кроме того, весь процесс можно написать с помощью Heroku CLI.

Тайм-аут команды в строке подключения web.config

4 июля 2020 г. · Строка подключения к SQL Server в Интернете.Файл конфигурации. Следующий пример относится к базе данных SQL Server, использующей безопасность SQL Server (войдите на сервер, используя учетные данные пользователя в строке подключения). В этом примере предполагается, что вы подключаетесь к экземпляру SQL Server по умолчанию на сервере.

Почему мой звук приглушен windows 10

Если файл web.config отсутствует в проекте, файл может быть создан с правильным путем и аргументами для настройки модуля ASP.NET Core и перемещен в VS 2017 , вы можете создать веб.config с настройками по умолчанию, добавив мастер добавления новых элементов, а затем раскомментируйте необходимые настройки.

Увеличить время ожидания соединения SSH. На сервере перейдите в файл конфигурации / etc / ssh / sshd_config. Параметр ClientAliveInterval указывает время в секундах, в течение которого сервер будет ожидать перед отправкой нулевого пакета в клиентскую систему, чтобы поддерживать соединение.

Проблемы со словом перехвата наклона с ответами

Эта строка подключения (установка тайм-аута команды с помощью NpgsqlConnection) может использоваться для подключений к PostgreSQL.Объяснение строк подключения. Сохраните строку подключения в Web.config. 22 сентября 2010 г. · Резюме: я написал веб-сайт в Visual Studio 10 Express и не видел, как его опубликовать. Затем я переписал его в WebMatrix 2.0, он публиковался нормально, пока я не изменил свой web.config, включив ссылку на сервер sql. Теперь я не могу публиковать с помощью веб-развертывания. Мой хостер мне совершенно не помог.

Конфигурация тайм-аута веб-соединения. Обработчики Web Connection .NET и ISAPI имеют тайм-ауты запроса, связанные с каждой реализацией, которая возвращается, когда запрос превышает определенное значение. Этот тайм-аут определяет, как долго запрос должен ждать, прежде чем он завершится.web.config.

Diosna dierks and sohne gmbh

Добавьте строку подключения в файл web.config, а затем используйте эту строку подключения для доступа к базе данных.

В поле ODBC Timeout введите новое значение. Вы можете использовать свойство ODBCTimeout, чтобы указать количество секунд, в течение которых Microsoft Access ожидает перед возникновением ошибки тайм-аута при выполнении запроса в базе данных Open Database Connectivity (ODBC). Если установить это свойство в ноль (0), тайм-аут не произойдет.

Cow creek oregon fishing

Изменение строк подключения набора данных C # (XSD) Одна вещь, которую я часто обнаруживал при программировании, — это изменить свойства строки подключения адаптера таблицы набора данных или адаптера таблицы запросов.

25 мая 2012 г. · Как настроить строку подключения Global.asa. Напоминаем, что строка подключения для подключения к базе данных была установлена ​​в файле с именем global.asa. Наиболее часто используемый метод заключался в установке переменной уровня приложения, содержащей необходимую информацию о соединении, к которой могла получить доступ каждая отдельная страница ASP. Вот пример …

Как открыть капот lexus с разряженной батареей

Вы можете настроить это ограничение через redis.conf или просто используя CONFIG SET timeout .Обратите внимание, что тайм-аут применяется только к обычным клиентам и не применяется к клиентам Pub / Sub, так как соединение Pub / Sub является подключением в стиле push, поэтому простаивающий клиент является нормой. Почему значение тайм-аута подключения в строке подключения не влияет на мое консольное приложение? Вместо изменения моего app.config мне пришлось бы указать свойство CommandTimeout как Sudipta Maiti Не удается прочитать строку подключения из конфигурации веб-API при отладке в Visual Studio 2010 I …

Вы можете использовать пары имя-значение для установки битов данных , Свойства объектов Parity, StopBits, FlowControl, ByteOrder и Timeout.См. В разделе Свойства их типы данных и допустимые значения. Пример: «Тайм-аут», 30

Anypoint Platform. Подключайте любое приложение, данные или устройство — в облаке, локально или гибридно. См. Обзор продукта Как это работает Разработка API-интерфейсов проектирования и создания интеграций Развертывание Запуск в нашем облаке или в вашем Управлении Централизованный мониторинг и контроль Безопасность Защитите свои системы и данные Повторное использование Совместное использование и обнаружение API-интерфейсов и коннекторов Начало работы Зарегистрироваться на Anypoint Platform Попробуйте бесплатно в течение 30 дней . ..

Dollar07e8 ford code

В этой конфигурации Redis будет отклонять любую команду, выполняемую только что подключенными клиентами, если только соединение не будет аутентифицировано через AUTH.Если пароль, предоставленный через AUTH, совпадает с паролем в файле конфигурации, сервер отвечает кодом состояния OK и начинает принимать команды.

1 марта 2019 г. · Перейдите к файлу Web.config, как показано ниже: Вам необходимо использовать тег connectionStrings, чтобы указать строку подключения в файле web.config, как показано на следующем рисунке. Запишите эту разметку XML в файл веб-конфигурации для объявления соединения. Вы можете добавить множество тегов для каждого подключения к базе данных.

Dir iyo hawiye

Чтобы начать сеанс FTP из командной строки Windows, выполните следующие действия: Установите подключение к Интернету, как обычно.Щелкните Пуск, а затем щелкните Выполнить. В Windows 7, Vista, NT, 2000 или XP введите cmd и нажмите OK. В Windows 95, 98 или ME введите команду и нажмите кнопку ОК. Командная строка появится в новом окне.

25 июля 2005 г. · После того как вы развернете узел «Строки подключения», вы увидите строку подключения по умолчанию. Щелкните узел Sql Connection String, и в правом окне у вас будет возможность переименовать строку подключения. Чтобы настроить строку подключения, разверните узел Sql Connection String, и вы увидите, что есть три параметра:

Авария на шоссе 60 сегодня, долина jurupa

23 января 2013 г. · Вы можете установить время ожидания подключения. время ожидания с помощью ключевых слов ConnectTimeout или Connection Timeout в строке подключения.Значение 0 указывает на отсутствие ограничения, и его следует избегать в ConnectionString, поскольку попытка подключения ждет неопределенно долго.

Стойки Go rhino

obj.Timeout = -1; // -1 для бесконечности или + любое положительное значение в миллисекундах B. Для увеличения Увеличьте значение тайм-аута в теге httpruntime в web / app. config ASP.NET Как повторно открыть заявку на пособие по безработице az

Я знаю, что время ожидания подключения и время ожидания команды — это разные сущности.Можно ли изменить значение тайм-аута команды по умолчанию, изменив строку подключения? Мне нужно увеличить тайм-аут команды и я хочу знать, смогу ли я сделать это, не меняя код и не перестраивая свое веб-приложение ASP.NET 1.1. Заранее спасибо. — ZLA

Я использую параметры подключения к серверу, чтобы использовать sftp для подключения к машине A, и он говорит: время ожидания при входе в систему. Кто-нибудь знает, как увеличить время ожидания подключения при использовании параметра подключения к серверу в ubuntu 15.04? РЕДАКТИРОВАТЬ: это графический интерфейс, о котором я говорю…

Cessna 150 fuel stick

inactivityTimeout — Тайм-аут неактивного соединения в секундах. Выдает: java.sql.SQLException. Это команда SQL, используемая вместе со свойством ValidateConnectionOnBorrow. Устанавливает строку конфигурации, используемую для удаленной подписки ONS. Строка параметра очень похожа на … Иногда, однако, вы также можете включить задачу, для которой требуется больше времени, чем время ожидания команды по умолчанию (30 секунд в SQL Server) до версии 2.0 EF Core, ваши возможности были ограничены изменением времени ожидания команды для DbContext, запуском миграции, а затем … Я знаю, что время ожидания подключения и время ожидания команды — это отдельные сущности. Можно ли изменить значение тайм-аута команды по умолчанию, изменив строку подключения? Мне нужно увеличить тайм-аут команды и я хочу знать, смогу ли я сделать это, не меняя код и не перестраивая свое веб-приложение ASP.NET 1.1. Заранее спасибо. — ZLA

Тем не менее, для веб-приложения отдельные команды БД, которые занимают более 30 секунд, немного чрезмерны; Возможно, вам будет лучше переосмыслить, как вы это не работает при добавлении строки подключения к поставщику SqlClient, я получаю: ArgumentException: ключевое слово не поддерживается: ‘время ожидания команды’. ..

Ark argentavis как поднять с помощью клюва

—connect-timeout Максимальное время в секундах, в течение которого вы разрешаете подключению curl. Это ограничивает только фазу подключения, поэтому, если curl подключается в течение заданного периода, он будет продолжаться, а если нет, он выйдет. Начиная с версии 7.32.0, этот параметр принимает десятичные значения. Если этот вариант используется несколько раз, будет использован последний. Конфигурация 1.1 Команды для базовой конфигурации 1.1.1 Команда аутентификации line Switch (config) # authentication line vty login local radius Относительная команда: aaa enable Команда no exec-timeout восстанавливает значение по умолчанию.Параметры: <минута> — значение времени, показанное в …

17 ноября 2020 г. · Обратите внимание, что команда dbxquery является генерирующей командой и должна быть первой командой в поиске. См. Раздел Запросы между базами данных на этой странице, где приведены примеры синтаксиса, необходимого для передачи параметров в dbxquery. Синтаксис: procedure = Описание: вызов хранимой процедуры. В этой таблице перечислены форматы синтаксиса процедур для различных типов …

Zoom room cli

Атрибут тайм-аута элемента sessionState (в файле web.config) можно использовать для изменения продолжительности тайм-аута сеанса для приложения ASP.NET. указано значение тайм-аута. ADO.NET будет ждать в течение времени, указанного в SqlCommand.CommandTimeout, прежде чем отменить запрос. using (var connection = new …

web-config timeout connection-string connection-timeout. @Jason недостатком использования OpenConnectionString является то, что он игнорирует тот, который вы настроили в своем файле web.config — если расположение вашей базы данных / версия / параметры подключения меняются, значит, вам нужно перекомпилировать…

Webroot secureanywhere complete 2020 keycode

Изменение строки подключения на включение «Timeout = 300» или «Connect Timeout = 300» не имеет никакого значения, а «Command Timeout» вызывает другую ошибку, так что она даже не будет пытаться запустить запрос (в отличие от сворачивания через 30 секунд). Любые настройки атрибутов, эквивалентные строке подключения, отменяют все. Приложение или файл веб-конфигурации могут быть полезны, а иногда и необходимы в сценариях, когда несколько приложений на компьютере используют одну и ту же версию ODP.NET, но для каждого приложения требуется своя конфигурация ODP.NET.

Blog.elmah.io В этом примере я добавил время ожидания подключения = 60, чтобы разрешить соединению SQL 60 секунд для подключения к SQL Server (значение по умолчанию — 15 секунд). Обратите внимание, что этот параметр не управляет таймаутом команды, который является временем, разрешенным для запроса одной или нескольких таблиц. Тайм-аут команды недоступен через web.config. Имя пользователя / пароль

Стоимость тубэктомии

21 мая 2019 г. · В этом примере я добавил таймаут подключения = 60, чтобы разрешить соединению SQL 60 секунд для подключения к SQL Server (значение по умолчанию — 15 секунд).Обратите внимание, что этот параметр не управляет таймаутом команды, который является временем, разрешенным для запроса одной или нескольких таблиц. Тайм-аут команды недоступен через web.config. Имя пользователя / пароль 29 января 2007 г. · Единственное свойство соединения, которое может использоваться перед запуском любого кода, — это свойство в файле Web.config, которое имеет следующую строку соединения: Это моя строка соединения в файле web.config на моем сайте: prity много стандартного connectionString = «Источник данных =. \ SQLEXPRESS; AttachDbFilename = | DataDirectory | \ ASPNETDB.MDF; Integrated Security = True; User … Вы также можете указать параметры драйвера в строке подключения как параметры в строке запроса. Вы можете настроить тайм-аут с помощью параметра serverSelectionTimeoutMS для mongoose.connect () В Linux и OSX сервер MongoDB использует вывод команды hostname, чтобы вычислить …

connect_timeout — количество секунд, в течение которых сервер mysql ожидает пакета подключения, прежде чем разорвать соединение. В реальном времени вы можете изменить, выполнив запрос SQL (после перезапуска MySQL он будет сброшен до стандартного или указанного в файле конфигурации)

Apkshub gta v

11 февраля 2011 г.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *