Hi there.
I’m using yii 2 basic application and I’m doing a console function that will be executed by a cron.
I have the following code.
config -> console.php and web.php
'components' => [
'db' => $db,
'authManager' => [
'class' => 'yii\rbac\DbManager',
],
'user' => [
'class' => 'app\models\User',
],
..........
]
Console application
<?php
namespace app\commands;
use yii;
use app\components\MyComponent;
use app\models\Users;
use app\models\User;
use app\models\Wave;
use yii\console\Controller;
class WaveInactivityController extends Controller
{
public $connection;
public function actionCheck($client_id = null)
{
$this->connection = MyComponent::verifyConsoleConfig();
this->process();
}
public function process()
{
…
$users = Users::findOne($wave_t->ctrl_user_id);
$user = User::findIdentity($users->id);
//Yii::$app->user->setIdentity($user);
}
}
I get this error
>PHP Fatal error: Uncaught yii\base\InvalidCallException: Getting write-only property: app\models\User::identity in /var/www/html/Projects/Fabrica/vendor/yiisoft/yii2/base/Component.php:151
Stack trace:
#0 /var/www/html/Projects/Fabrica/vendor/yiisoft/yii2/db/BaseActiveRecord.php(298): yii\base\Component->__get('identity')
#1 /var/www/html/Projects/Fabrica/models/CampaignCenter.php(83): yii\db\BaseActiveRecord->__get('identity')
#2 /var/www/html/Projects/Fabrica/vendor/yiisoft/yii2/db/ActiveQuery.php(320): app\models\CampaignCenter::getDb()
#3 /var/www/html/Projects/Fabrica/vendor/yiisoft/yii2/db/Query.php(274): yii\db\ActiveQuery->createCommand(NULL)
#4 /var/www/html/Projects/Fabrica/vendor/yiisoft/yii2/db/ActiveQuery.php(300): yii\db\Query->one(NULL)
#5 /var/www/html/Projects/Fabrica/vendor/yiisoft/yii2/db/ActiveRelationTrait.php(185): yii\db\ActiveQuery->one()
#6 /var/www/html/Projects/Fabrica/vendor/yiisoft/yii2/db/BaseActiveRec in /var/www/html/Projects/Fabrica/vendor/yiisoft/yii2/base/Component.php on line 151
And if i descompose this line-> Yii::$app->user->setIdentity($user); i get this message
> PHP Fatal error: Uncaught yii\base\InvalidConfigException: yii\web\Request::cookieValidationKey must be configured with a secret key. in /var/www/html/Projects/Fabrica/vendor/yiisoft/yii2/web/Request.php:1579
Stack trace:
#0 /var/www/html/Projects/Fabrica/vendor/yiisoft/yii2/web/Request.php(1561): yii\web\Request->loadCookies()
#1 /var/www/html/Projects/Fabrica/vendor/yiisoft/yii2/base/Component.php(139): yii\web\Request->getCookies()
#2 /var/www/html/Projects/Fabrica/components/Util.php(616): yii\base\Component->__get('cookies')
#3 /var/www/html/Projects/Fabrica/models/CampaignCenter.php(84): app\components\Util::getConnection(1)
#4 /var/www/html/Projects/Fabrica/vendor/yiisoft/yii2/db/ActiveQuery.php(320): app\models\CampaignCenter::getDb()
#5 /var/www/html/Projects/Fabrica/vendor/yiisoft/yii2/db/Query.php(274): yii\db\ActiveQuery->createCommand(NULL)
#6 /var/www/html/Projects/Fabrica/vendor/yiisoft/yii2/db/ActiveQuery.php(300): in
var/www/html/Projects/Fabrica/vendor/yiisoft/yii2/web/Request.php on line 1579
Method getDb()
public static function getDb()
{
$clientId = Yii::$app->user->identity->getClientId();
return Util::getConnection($clientId);
}
Method getConnection()
public static function getConnection($clientId)
{
if (!empty($clientId)) {
$cookies = Yii::$app->request->cookies;
if ($cookies->has('statusdb')) {
if ($cookies->getValue('statusdb')) {
$aDB = $cookies->getValue('db');
try {
$aDb = $aDB['dbcliente_' . $clientId];
$services = new \yii\di\ServiceLocator();
$services->clear('dbcliente_' . $clientId);
$services->setComponents([
'dbcliente_' . $clientId => [
'class' => 'yii\db\Connection',
'dsn' => $aDb['dsn'],
'username' => $aDb['username'],
'password' => $aDb['password'],
'charset' => 'utf8',
],
]);
return $services->get('dbcliente_' . $clientId);
} catch (\PDOException $e) {
throw new \yii\web\HttpException($e->getMessage(), $e->errorInfo, (int)$e->getCode(), $e);
}
} else {
return \Yii::$app->db;
}
} else {
return \Yii::$app->db;
}
} else {
return \Yii::$app->db;
}
}
It works in this way.
In case people have their database, what they will do is look for that configuration and tell the function where they should store the information.