I am trying to run a console controller from the terminal, but i am getting this errors every time
Error: Getting unknown property: yii\console\Application::user
here is the controller
class TestController extends \yii\console\Controller {
public function actionIndex() {
echo 'this is console action';
} }
and this is the concole config
return [
'id' => 'app-console',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'controllerNamespace' => 'console\controllers',
'modules' => [],
'components' => [
'log' => [
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
],
'params' => $params];
I tried running it using these commands with no luck
php yii test/index
php yii test
php ./yii test
can anyone help please?
Console application does not have Yii->$app->user. So, you need to configure user component in config\console.php.
like as,
config\console.php
'components' => [
.........
......
'user' => [
'class' => 'yii\web\User',
'identityClass' => 'app\models\User',
//'enableAutoLogin' => true,
],
'session' => [ // for use session in console application
'class' => 'yii\web\Session'
],
.......
]
More info about your problem see this : Link
OR
Visit following link :
Yii2 isGuest giving exception in console application
Note : There's no session in console application.
Set in \console\config\main.php
return [
'id' => 'app-console',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'controllerNamespace' => 'console\controllers',
'components' => [
'log' => [
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'user' => [
'class' => 'yii\web\User',
'identityClass' => 'app\models\Credential',// class that implements IdentityInterface
//'enableAutoLogin' => true,
],
],
'params' => $params,
];
now in your \console\controller\AbcController.php add init method
public function init() {
parent::init();
Yii::$app->user->setIdentity(Credential::findOne(['id'=><cronloginid>]));
}
create a cron login and pass that login id in variable with this config your Blameable Behavior of yii2 will work
As #GAMITG said, you must config user component in config file, but unfortunately, you couldn't access session in console, that's because session is not available in console. Maybe you could solve the problem like this:
$user_id = isset(Yii::$app->user->id) ? Yii::$app->user->id : 0;
I'm trying to completely manage my page with .htaccess file and two links/button or redirect:
one from frontend to backend
one from backend to frontend
Hope that is clearly enough.
My environment is DEV as I'm working localy if that is so difference.
All I tried:
https://www.yiiframework.com/forum/index.php/topic/60118-creating-links-from-backend-to-frontend-and-frontend-to-backend/
From Backend to Frontend Yii2 Advanced App
https://github.com/yiisoft/yii2/issues/1578
https://www.youtube.com/watch?v=nvMlc1lCOOo
And I'm a bit confused with .htaccess files and urlManager so appreciate any help a lot.
Let's check the files :
DIRECTORY ROOT & COMMON
/.htacces
#prevent directory listing
Options -Indexes
IndexIgnore */*
#follow symbolic links
Options FollowSymlinks
RewriteEngine on
RewriteRule ^admin(/.+)?$ backend/web/$1 [L,PT]
RewriteRule ^(.+)?$ frontend/web
/common/config/main.php
return [
'aliases' => [
'#bower' => '#vendor/bower-asset',
'#npm' => '#vendor/npm-asset',
],
'vendorPath' => dirname(dirname(__DIR__)) . '/vendor',
'components' => [
'cache' => [
'class' => 'yii\caching\FileCache',
],
],
];
FRONTEND & FRONTEND CONTROLLER
/frontend/.htacces
RewriteEngine on
#if directory or a file exist, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#otherwise, forward to index.php
RewriteRule . index.php
/frontend/config/main.php
$params = array_merge(
require __DIR__ . '/../../common/config/params.php',
require __DIR__ . '/../../common/config/params-local.php',
require __DIR__ . '/params.php',
require __DIR__ . '/params-local.php'
);
return [
'id' => 'app-frontend',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'controllerNamespace' => 'frontend\controllers',
'components' => [
'request' => [
'csrfParam' => '_csrf-frontend',
],
// main - used to generate and parse URLs to frontend from
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/frontend/web',
'rules' => [
'/' => 'site/index',
'home' => 'site/home',
'about' => 'site/about',
'moje-prace' => 'site/moje-prace',
'umow-wizyte' => 'rezerwacje/create',
'contact' => 'site/contact',
'login' => 'site/login',
'signup' => '/site/signup',
],
],
// slave - used to generate URLs to backend from frontend app
'urlManagerBackend' => [
'class' => 'yii\web\urlManager',
'baseUrl' => '/admin',
'enablePrettyUrl' => true,
'showScriptName' => false,
]
'user' => [
'identityClass' => 'common\models\User',
'enableAutoLogin' => true,
'identityCookie' => ['name' => '_identity-frontend', 'httpOnly' => true],
],
'session' => [
// this is the name of the session cookie used for login on the frontend
'name' => 'advanced-frontend',
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'errorHandler' => [
'errorAction' => 'site/error',
],
],
'params' => $params,
];
/frontend/controllers/SiteController.php
namespace frontend\controllers;
use Yii;
use yii\base\InvalidParamException;
use yii\web\BadRequestHttpException;
use yii\web\Controller;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use common\models\LoginForm;
use frontend\models\PasswordResetRequestForm;
use frontend\models\ResetPasswordForm;
use frontend\models\SignupForm;
use frontend\models\ContactForm;
/**
* Site controller
*/
class SiteController extends Controller
{
/**
* {#inheritdoc}
*/
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['logout', 'index', 'home', 'contact', 'about'],
'rules' => [
[
'actions' => ['logout'],
'allow' => true,
'roles' => ['#'],
],
[
'actions' => ['index'],
'allow' => true,
'roles' => ['#'],
],
[
'actions' => ['home'],
'allow' => true,
'roles' => ['#'],
],
[
'actions' => ['contact'],
'allow' => true,
'roles' => ['#'],
],
[
'actions' => ['about'],
'allow' => true,
'roles' => ['#'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'],
],
],
];
}
/**
* {#inheritdoc}
*/
public function actions()
{
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
],
];
}
/**
* Displays homepage.
*
* #return mixed
*/
public function actionIndex()
{
if (!Yii::$app->user->isGuest) {
$this->layout = 'main';
return $this->render('home');
}
return $this->goHome();
}
/**
* Displays about page.
*
* #return mixed
*/
public function actionHome()
{
return $this->render('home');
}
/**
* Logs in a user.
*
* #return mixed
*/
public function actionLogin()
{
$this->layout = 'welcome';
if (!Yii::$app->user->isGuest) {
$this->layout = 'main';
return $this->render('home');
}
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
$this->layout = 'main';
return $this->render('home');
}
else {
$model->password = '';
return $this->render('login', [
'model' => $model,
]);
}
}
/**
* Logs out the current user.
*
* #return mixed
*/
public function actionLogout()
{
Yii::$app->user->logout();
return $this->goHome();
}
/**
* Displays contact page.
*
* #return mixed
*/
public function actionContact()
{
$model = new ContactForm();
if ($model->load(Yii::$app->request->post()) && $model->validate()) {
if ($model->sendEmail(Yii::$app->params['adminEmail'])) {
Yii::$app->session->setFlash('success', 'Thank you for contacting us. We will respond to you as soon as possible.');
}
else {
Yii::$app->session->setFlash('error', 'There was an error sending your message.');
}
return $this->refresh();
}
else {
return $this->render('contact', [
'model' => $model,
]);
}
}
/**
* Displays about page.
*
* #return mixed
*/
public function actionAbout()
{
return $this->render('about');
}
/**
* Signs user up.
*
* #return mixed
*/
public function actionSignup()
{
$this->layout = 'welcome';
$model = new SignupForm();
if ($model->load(Yii::$app->request->post())) {
if ($user = $model->signup()) {
if (Yii::$app->getUser()->login($user)) {
$this->layout = 'main';
return $this->actionHome();
}
}
}
return $this->render('signup', [
'model' => $model,
]);
}
BACKEND & BACKEND CONTROLLER
/backend/.htacces
RewriteEngine on
#if directory or a file exist, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#otherwise, forward to index.php
RewriteRule . index.php
/backend/config/main.php
$params = array_merge(
require __DIR__ . '/../../common/config/params.php',
require __DIR__ . '/../../common/config/params-local.php',
require __DIR__ . '/params.php',
require __DIR__ . '/params-local.php'
);
return [
'id' => 'app-backend',
'basePath' => dirname(__DIR__),
'controllerNamespace' => 'backend\controllers',
'bootstrap' => ['log'],
'homeUrl' => '/administrator',
'modules' => [],
'components' => [
'request' => [
'csrfParam' => '_csrf-backend',
'baseUrl' => '/administrator',
],
'user' => [
'identityClass' => 'common\models\User',
'enableAutoLogin' => true,
'identityCookie' => ['name' => '_identity-backend', 'httpOnly' => true],
],
'session' => [
// this is the name of the session cookie used for login on the backend
'name' => 'advanced-backend',
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'errorHandler' => [
'errorAction' => 'site/error',
],
// main - used to generate and parse URLs to backend from backend app
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/backend/web',
],
// slave - used to generate URLs to frontend from backend app
'urlManagerFrontend' => [
'class' => 'yii\web\urlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/',
'rules' => [
'/' => 'site/index',
'home' => 'site/home',
'about' => 'site/about',
'moje-prace' => 'site/moje-prace',
'umow-wizyte' => 'rezerwacje/create',
'contact' => 'site/contact',
'login' => 'site/login',
'signup' => 'site/signup',
],
],
'params' => $params,
];
/backend/controllers/SiteController.php
namespace backend\controllers;
use Yii;
use yii\web\Controller;
use yii\filters\VerbFilter;
use yii\filters\AccessControl;
use common\models\LoginForm;
/**
* Site controller
*/
class SiteController extends Controller
{
/**
* {#inheritdoc}
*/
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['login', 'error'],
'allow' => true,
],
[
'actions' => ['logout', 'index'],
'allow' => true,
'roles' => ['#'],
],
],
],
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'],
],
],
];
}
/**
* {#inheritdoc}
*/
public function actions()
{
return [
'error' => [
'class' => 'yii\web\ErrorAction',
],
];
}
/**
* Displays homepage.
*
* #return string
*/
public function actionIndex()
{
return $this->render('index');
}
/**
* Login action.
*
* #return string
*/
public function actionLogin()
{
if (!Yii::$app->user->isGuest) {
return $this->goHome();
}
$model = new LoginForm();
if ($model->load(Yii::$app->request->post()) && $model->login()) {
return $this->goBack();
} else {
$model->password = '';
return $this->render('login', [
'model' => $model,
]);
}
}
/**
* Logout action.
*
* #return string
*/
public function actionLogout()
{
Yii::$app->user->logout();
return $this->goHome();
}
}
VHOST & APACHE.CONF
apache2.conf
<Directory />
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<Directory /usr/share>
AllowOverride All
Require all granted
</Directory>
<Directory /home/user/project>
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
vhost
<VirtualHost *:80>
ServerAdmin admin#prst.app
ServerName pp.test
DocumentRoot /home/user/project/pp/
<Directory "/home/user/project/pp/">
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/pp__error.log
CustomLog ${APACHE_LOG_DIR}/pp_access.log combined
</VirtualHost>
I can not create the hyperlink in a view or redirect in controller from frontend to backend, and from backend to frontend.
I'm assuming that your frontend is at http://localhosts and your backend at http://localhosts/admin. If your rewrite rules does not work correctly, you may try use symlinks for this - at least for me it was always simpler and less problematic way of handling frontend/backend URLs on shared hosting.
You always have 2 UrlManager components: main (for current environment) and slave (for second environment, for example for backend in frontend app). So in frontend/config/main.php you will have something like:
// ...
// main - used to generate and parse URLs to frontend from frontend app
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/',
'rules' => [
'/' => 'site/index',
'home' => 'site/home',
'about' => 'site/about',
'moje-prace' => 'site/moje-prace',
'umow-wizyte' => 'rezerwacje/create',
'contact' => 'site/contact',
'login' => 'site/login',
'signup' => 'site/signup',
],
],
// slave - used to generate URLs to backend from frontend app
'urlManagerBackend' => [
'class' => 'yii\web\urlManager',
'baseUrl' => '/admin',
'enablePrettyUrl' => true,
'showScriptName' => false,
],
// ...
And in backend/config/main.php:
// ...
// main - used to generate and parse URLs to backend from backend app
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/admin',
],
// slave - used to generate URLs to frontend from backend app
'urlManagerFrontend' => [
'class' => 'yii\web\urlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/',
'rules' => [
'/' => 'site/index',
'home' => 'site/home',
'about' => 'site/about',
'moje-prace' => 'site/moje-prace',
'umow-wizyte' => 'rezerwacje/create',
'contact' => 'site/contact',
'login' => 'site/login',
'signup' => 'site/signup',
],
],
// ...
As you can see, they're swapped - main UrlManager from frontend app is slave in backend app. Depending on current and target environment, you're using different URL manager.
If you want to generate URL to frontend from backend app:
Yii::$app->urlManagerFrontend->createUrl('site/index');
// result: http://localhost
If you want to generate URL to backend from backend app:
Yii::$app->urlManager->createUrl('site/index');
// result: http://localhost/admin/site/index
If you want to generate URL to backend from frontend app:
Yii::$app->urlManagerBackend->createUrl('site/index');
// result: http://localhost/admin/site/index
If you want to generate URL to frontend from frontend app:
Yii::$app->urlManager->createUrl('site/index');
// result: http://localhost
Finally it's done ! On the fresh yii2 advanced i set up connections between frontend and backend, but still have a problem with pretty url in both "sides".
backend/.htaccess
RewriteEngine on
#if directory or a file exist, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#otherwise, forward to index.php
RewriteRule . index.php
backend/config/main.php
use \yii\web\Request;
$baseUrl = str_replace('/backend/web', '/backend/web', (new Request)->getBaseUrl());
$frontEndBaseUrl = str_replace('/backend/web', '/frontend/web', (new Request)->getBaseUrl());
$params = array_merge(
require __DIR__ . '/../../common/config/params.php',
require __DIR__ . '/../../common/config/params-local.php',
require __DIR__ . '/params.php',
require __DIR__ . '/params-local.php'
);
return [
'id' => 'app-backend',
'basePath' => dirname(__DIR__),
'controllerNamespace' => 'backend\controllers',
'bootstrap' => ['log'],
'modules' => [],
'components' => [
'request' => [
'csrfParam' => '_csrf-backend',
],
'user' => [
'identityClass' => 'common\models\User',
'enableAutoLogin' => true,
'identityCookie' => ['name' => '_identity-backend', 'httpOnly' => true],
],
'session' => [
// this is the name of the session cookie used for login on the backend
'name' => 'advanced-backend',
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'errorHandler' => [
'errorAction' => 'site/error',
],
// main - used to generate and parse URLs to backend from backend app
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/backend/web',
],
// slave - used to generate URLs to frontend from backend app
'urlManagerFrontend' => [
'class' => 'yii\web\urlManager',
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => '/',
'rules' => [
'/' => 'site/index',
'home' => 'site/home',
'about' => 'site/about',
'moje-prace' => 'site/moje-prace',
'umow-wizyte' => 'rezerwacje/create',
'contact' => 'site/contact',
'login' => 'site/login',
'signup' => 'site/signup',
],
],
],
'params' => $params,
];
backend links for frontend
simply created with:
$frontendUrl= Yii::$app->urlManagerFrontend->createUrl('//');
echo yii\helpers\Html::a('link to frontend', $frontendUrl);
frontend/.htaccess
RewriteEngine on
#if directory or a file exist, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#otherwise, forward to index.php
RewriteRule . index.php
frontend/config/main.php
use \yii\web\Request;
$baseUrl = str_replace('/frontend/web', '/frontend/web', (new Request)->getBaseUrl());
$backEndBaseUrl = str_replace('/frontend/web', '/backend/web', (new Request)->getBaseUrl());
$params = array_merge(
require __DIR__ . '/../../common/config/params.php',
require __DIR__ . '/../../common/config/params-local.php',
require __DIR__ . '/params.php',
require __DIR__ . '/params-local.php'
);
return [
'id' => 'app-frontend',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'controllerNamespace' => 'frontend\controllers',
'components' => [
'request' => [
'csrfParam' => '_csrf-frontend',
],
'user' => [
'identityClass' => 'common\models\User',
'enableAutoLogin' => true,
'identityCookie' => ['name' => '_identity-frontend', 'httpOnly' => true],
],
'session' => [
// this is the name of the session cookie used for login on the frontend
'name' => 'advanced-frontend',
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'errorHandler' => [
'errorAction' => 'site/error',
],
// main - used to generate and parse URLs to frontend from frontend app
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'baseUrl' => $baseUrl,
'rules' => [
'/' => 'site/index',
'/home' => 'site/home',
'/about' => 'site/about',
'moje-prace' => 'site/moje-prace',
'umow-wizyte' => 'rezerwacje/create',
'contact' => 'site/contact',
'login' => 'site/login',
'signup' => '/site/signup',
],
],
// slave - used to generate URLs to backend from frontend app
'urlManagerBackend' => [
'class' => 'yii\web\urlManager',
'baseUrl' => $backEndBaseUrl,
'enablePrettyUrl' => false,
'showScriptName' => false,
],
],
'params' => $params,
];
frontend links for backend
simply created with:
$backendUrl= Yii::$app->urlManagerBackend->createUrl('//');
echo yii\helpers\Html::a('link to backend', $backendUrl);
In the root directory what means http://localhost/app-name/ i created index.php file for redirecting to frontend while clicking link on backend (to frontend):
/index.php
header("Location: http://pp.test/frontend/web/", true, 301);
exit();
And by now it works so so, but i'm not able to enable pretty url in the backend as it does not works corectlly. And also i do not think that's a good way using redirecting from other file especially from root directory.
Please note, that in common/config/main.php no changes is needed and do not need .htaccess file in the root directory.
I tried to install RESTful API module from this http://budiirawan.com/setup-restful-api-yii2/ and I am getting error
Object not found!
I tried setting mod_rewrite and also AllowOverride All configuration.
I also have connected it to correct database and that database has country table in it.
I also have .htaccess file and here is my api/config/main.php file
<?php
$params = array_merge(
require(__DIR__ . '/../../common/config/params.php'),
require(__DIR__ . '/../../common/config/params-local.php'),
require(__DIR__ . '/params.php'),
require(__DIR__ . '/params-local.php')
);
return [
'id' => 'app-api',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'modules' => [
'v1' => [
'basePath' => '#app/modules/v1',
'class' => 'api\modules\v1\Module'
]
],
'components' => [
'user' => [
'identityClass' => 'common\models\User',
'enableAutoLogin' => false,
],
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
[
'class' => 'yii\rest\UrlRule',
'controller' => 'v1/country',
'tokens' => [
'{id}' => '<id:\\w+>'
]
]
],
]
],
'params' => $params,
];
Here is the model Country
<?php
namespace api\modules\v1\models;
use yii\db\ActiveRecord;
/**
* Country Model
*
* #author Budi Irawan <deerawan#gmail.com>
*/
class Country extends ActiveRecord
{
/**
* #inheritdoc
*/
public static function tableName()
{
return 'country';
}
/**
* We use the primary function because we don't use integer auto increment as a primary key.
* #inheritdoc
*/
public static function primaryKey()
{
return ['code'];
}
/**
* To let Yii know what fields exist on the table.
* Define rules for validation
*/
public function rules()
{
return [
[['code', 'name', 'population'], 'required']
];
}
}
I still get the same error while accessing it through http://localhost/yii2-api/api/v1/countries.
According to tutorial you have to use url :
http://localhost/yii2-api/api/web/v1/countries
Instead of
http://localhost/yii2-api/api/v1/countries
In my case,
the mysql table had compound primary key (made by mistake),
and only GET /v1/othertable/1 failed with this error, while other routes are working.
When I sorted that indexes through PhpMyAdmin it started to work.
I've been following a few tutorials online but I can't seem to figure out how to create a REST API for Yii2. I keep getting a 404 page not found. This is what I have so far:
Folder structure:
api
- config
-- api.php
-- bootstrap.php
- modules
-- v1
--- controllers
---- UserController.php
--- Api.php
--- Module.php
.htaccess
index.php
api/api.php
<?php
$params = require(__DIR__ . '/params.php');
$config = [
'id' => 'api',
'basePath' => dirname(__DIR__).'/..',
'bootstrap' => ['log'],
'components' => [
// URL Configuration for our API
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [
[
'class' => 'yii\rest\UrlRule',
'controller' => [
//'v1/user'
'users' => 'v1/users'
],
]
],
],
'request' => [
// Set Parser to JsonParser to accept Json in request
'parsers' => [
'application/json' => 'yii\web\JsonParser',
]
],
'cache' => [
'class' => 'yii\caching\FileCache',
],
// Set this enable authentication in our API
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => false, // Don't forget to set Auto login to false
],
// Enable logging for API in a api Directory different than web directory
'log' => [
'traceLevel' => YII_DEBUG ? 3 : 0,
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
// maintain api logs in api directory
'logFile' => '#api/runtime/logs/error.log'
],
],
],
'db' => require(__DIR__ . '/../../config/db.php'),
],
'modules' => [
'v1' => [
'basePath' => '#api/modules/v1',
'class' => 'api\modules\v1\Api',
]
],
'params' => $params,
];
return $config;
api/bootstrap.php
<?php
Yii::setAlias('api', dirname(dirname(__DIR__)) . '/api');
api/modules/v1/controllers/UserController.php
<?php
namespace app\api\modules\v1\controllers;
class UserController extends ActiveController
{
public $modelClass = 'app\models\User';
}
api/modules/v1/Api.php
<?php
namespace api\modules\v1;
use \yii\base\Module;
class Api extends Module
{
public $controllerNamespace = 'api\modules\v1\controllers';
public function init()
{
parent::init();
// custom initialization code goes here
}
}
api/modules/v1/Module.php
<?php
namespace api\modules\v1;
class Module extends \yii\base\Module
{
public $controllerNamespace = 'api\modules\v1\controllers';
public function init()
{
parent::init();
\Yii::$app->user->enableSession = false;
// custom initialization code goes here
}
}
api/.htaccess
Options +FollowSymLinks
IndexIgnore */*
RewriteEngine on
# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# otherwise forward it to index.php
RewriteRule . index.php
api/index.php
<?php
defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');
require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/config/bootstrap.php');
$config = require(__DIR__ . '/config/api.php');
$application = new yii\web\Application($config);
$application->run();
mod_rewrite is enabled
Not sure what else needs to be done from here. I also have this added to common/config/main.php
'modules' => [
'user' => [
'class' => 'dektrium\user\Module',
],
'v1' => [
'basePath' => '#api/modules/v1',
'class' => 'api\modules\v1\Api',
]
],
I use Postman to send GET requests:
http://example.com/api/v1/users
and
http://example.com/v1/users which returns Class app\api\modules\v1\Api does not exist
I made a few changes to the configuration and files, but no luck. This is the cleanest version I have.
Please try this
Your controller name is UserController
and you are accessing users in api
try to access user in api url
I am trying to run a console controller from the terminal, but i am getting this errors every time
Error: Getting unknown property: yii\console\Application::user
here is the controller
class TestController extends \yii\console\Controller {
public function actionIndex() {
echo 'this is console action';
} }
and this is the concole config
return [
'id' => 'app-console',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'controllerNamespace' => 'console\controllers',
'modules' => [],
'components' => [
'log' => [
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
],
'params' => $params];
I tried running it using these commands with no luck
php yii test/index
php yii test
php ./yii test
can anyone help please?
Console application does not have Yii->$app->user. So, you need to configure user component in config\console.php.
like as,
config\console.php
'components' => [
.........
......
'user' => [
'class' => 'yii\web\User',
'identityClass' => 'app\models\User',
//'enableAutoLogin' => true,
],
'session' => [ // for use session in console application
'class' => 'yii\web\Session'
],
.......
]
More info about your problem see this : Link
OR
Visit following link :
Yii2 isGuest giving exception in console application
Note : There's no session in console application.
Set in \console\config\main.php
return [
'id' => 'app-console',
'basePath' => dirname(__DIR__),
'bootstrap' => ['log'],
'controllerNamespace' => 'console\controllers',
'components' => [
'log' => [
'targets' => [
[
'class' => 'yii\log\FileTarget',
'levels' => ['error', 'warning'],
],
],
],
'user' => [
'class' => 'yii\web\User',
'identityClass' => 'app\models\Credential',// class that implements IdentityInterface
//'enableAutoLogin' => true,
],
],
'params' => $params,
];
now in your \console\controller\AbcController.php add init method
public function init() {
parent::init();
Yii::$app->user->setIdentity(Credential::findOne(['id'=><cronloginid>]));
}
create a cron login and pass that login id in variable with this config your Blameable Behavior of yii2 will work
As #GAMITG said, you must config user component in config file, but unfortunately, you couldn't access session in console, that's because session is not available in console. Maybe you could solve the problem like this:
$user_id = isset(Yii::$app->user->id) ? Yii::$app->user->id : 0;