yiisoft / yii2

Yii 2: The Fast, Secure and Professional PHP Framework
http://www.yiiframework.com
BSD 3-Clause "New" or "Revised" License
14.23k stars 6.91k forks source link

PHP Recoverable Error 'yii\base\ErrorException' with message 'Argument 1 passed to yii\di\Container::invoke() must be callable, array given #13669

Closed RGTimothy closed 7 years ago

RGTimothy commented 7 years ago

I developed a yii2 web, and have some cronjobs running well. But suddenly all of it produce error (I always receive the cron email notification) as details below:

Status: 500 Internal Server Error
X-Powered-By: PHP/5.6.30
Content-type: text/html; charset=UTF-8

PHP Recoverable Error 'yii\base\ErrorException' with message 'Argument 1 passed to yii\di\Container::invoke() must be callable, array given, called in /home/mywebsite/public_html/vendor/yiisoft/yii2/BaseYii.php on line 346 and defined'

in /home/mywebsite/public_html/vendor/yiisoft/yii2/di/Container.php:491

Stack trace:
#0 /home/mywebsite/public_html/vendor/yiisoft/yii2/di/Container.php(491): yii\base\ErrorHandler->handleError(4096, 'Argument 1 pass...', '/home/mywebsite/...', 491, Array)
#1 /home/mywebsite/public_html/vendor/yiisoft/yii2/BaseYii.php(346): yii\di\Container->invoke(Array, Array)
#2 /home/mywebsite/public_html/vendor/yiisoft/yii2/base/Module.php(353): yii\BaseYii::createObject(Array, Array)
#3 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/controllers/HelpController.php(140): yii\base\Module->getModule('allowedIPs')
#4 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/controllers/HelpController.php(77): yii\console\controllers\HelpController->getModuleCommands(Object(yii\console\Application))
#5 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/controllers/HelpController.php(89): yii\console\controllers\HelpController->getCommands()
#6 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/controllers/HelpController.php(184): yii\console\controllers\HelpController->getCommandDescriptions()
#7 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/controllers/HelpController.php(67): yii\console\controllers\HelpController->getDefaultHelp()
#8 [internal function]: yii\console\controllers\HelpController->actionIndex(NULL)
#9 /home/mywebsite/public_html/vendor/yiisoft/yii2/base/InlineAction.php(55): call_user_func_array(Array, Array)
#10 /home/mywebsite/public_html/vendor/yiisoft/yii2/base/Controller.php(154): yii\base\InlineAction->runWithParams(Array)
#11 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/Controller.php(119): yii\base\Controller->runAction('', Array)
#12 /home/mywebsite/public_html/vendor/yiisoft/yii2/base/Module.php(454): yii\console\Controller->runAction('', Array)
#13 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/Application.php(180): yii\base\Module->runAction('', Array)
#14 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/Application.php(147): yii\console\Application->runAction('', Array)
#15 /home/mywebsite/public_html/vendor/yiisoft/yii2/base/Application.php(375): yii\console\Application->handleRequest(Object(yii\console\Request))
#16 /home/mywebsite/public_html/yii(22): yii\base\Application->run()
#17 {main}
Q A
Yii version 2.0.9
PHP version 5.6

Any idea regarding this issue?

yii-bot commented 7 years ago

Thanks for posting in our issue tracker. In order to properly assist you, we need additional information:

Thanks!

This is an automated comment, triggered by adding the label status:need more info.

RGTimothy commented 7 years ago

When does the issue occur?

Right now

What do you see?

The error

What was the expected result?

No error

Can you supply us with a stacktrace?

Sure, please see the stacktrace as below:

Stack trace:
#0 /home/mywebsite/public_html/vendor/yiisoft/yii2/di/Container.php(491): yii\base\ErrorHandler->handleError(4096, 'Argument 1 pass...', '/home/mywebsite/...', 491, Array)
#1 /home/mywebsite/public_html/vendor/yiisoft/yii2/BaseYii.php(346): yii\di\Container->invoke(Array, Array)
#2 /home/mywebsite/public_html/vendor/yiisoft/yii2/base/Module.php(353): yii\BaseYii::createObject(Array, Array)
#3 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/controllers/HelpController.php(140): yii\base\Module->getModule('allowedIPs')
#4 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/controllers/HelpController.php(77): yii\console\controllers\HelpController->getModuleCommands(Object(yii\console\Application))
#5 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/controllers/HelpController.php(89): yii\console\controllers\HelpController->getCommands()
#6 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/controllers/HelpController.php(184): yii\console\controllers\HelpController->getCommandDescriptions()
#7 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/controllers/HelpController.php(67): yii\console\controllers\HelpController->getDefaultHelp()
#8 [internal function]: yii\console\controllers\HelpController->actionIndex(NULL)
#9 /home/mywebsite/public_html/vendor/yiisoft/yii2/base/InlineAction.php(55): call_user_func_array(Array, Array)
#10 /home/mywebsite/public_html/vendor/yiisoft/yii2/base/Controller.php(154): yii\base\InlineAction->runWithParams(Array)
#11 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/Controller.php(119): yii\base\Controller->runAction('', Array)
#12 /home/mywebsite/public_html/vendor/yiisoft/yii2/base/Module.php(454): yii\console\Controller->runAction('', Array)
#13 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/Application.php(180): yii\base\Module->runAction('', Array)
#14 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/Application.php(147): yii\console\Application->runAction('', Array)
#15 /home/mywebsite/public_html/vendor/yiisoft/yii2/base/Application.php(375): yii\console\Application->handleRequest(Object(yii\console\Request))
#16 /home/mywebsite/public_html/yii(22): yii\base\Application->run()
#17 {main}

Do you have exact code to reproduce it? Maybe a PHPUnit tests that fails?

Yes I have. Please check my cron code as below (mywebsite/commands/SysnetCronController.php). I am using basic template of yii 2:

namespace app\commands;

use yii\console\Controller;
use Yii;

Class SysnetCronController extends Controller
{
    public function actionIndex($message = 'hello world')
    {
        echo $message . "\n";
    }

    public function actionTest()
    {
        echo 'test';
    }
}

Thanks!

samdark commented 7 years ago

3 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/controllers/HelpController.php(140): yii\base\Module->getModule('allowedIPs')

Looks wrong. Check if you've nested arrays correctly in your config file.

RGTimothy commented 7 years ago

@samdark which config file I need to check? Is it console/db/params/web? So I can paste it here and share it.

SilverFire commented 7 years ago

Yes, share it with us, please. Ensure you've removed all sensitive data before publishing.

RGTimothy commented 7 years ago

@SilverFire ok sure. Thanks.

web.php


use \kartik\datecontrol\Module;

$params = require(__DIR__ . '/params.php');

$config = [
    'id' => 'basic',
    'name'=>'My Website',
    'timeZone' => 'Asia/Jakarta',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log', function(){
        Yii::$app->attachBehavior('access',[
            'class' => 'mdm\admin\components\AccessControl',
            'allowActions' => [
                //'admin/*', // add or remove allowed actions to this list
                //'site/*',
                //'user/*',
            ]
        ]);
    }, 'devicedetect'],
    'modules' => [
        'datecontrol' => [
            'class' => 'kartik\datecontrol\Module',

            // format settings for displaying each date attribute (ICU format example)
            'displaySettings' => [
                Module::FORMAT_DATE => 'dd-MM-yyyy',
                Module::FORMAT_TIME => 'HH:mm:ss a',
                Module::FORMAT_DATETIME => 'dd-MM-yyyy HH:mm:ss',
                //Module::FORMAT_DATETIME => 'php:d-m-Y H:i:s',
            ],
            // format settings for saving each date attribute (PHP format example)
            'saveSettings' => [
                //Module::FORMAT_DATE => 'php:U', // saves as unix timestamp
                Module::FORMAT_DATE => 'php:Y-m-d',
                Module::FORMAT_TIME => 'php:H:i:s',
                Module::FORMAT_DATETIME => 'php:Y-m-d H:i:s',
            ],

            // set your display timezone
            'displayTimezone' => 'Asia/Jakarta',

            // set your timezone for date saved to db
            'saveTimezone' => 'Asia/Jakarta',
            // automatically use kartik\widgets for each of the above formats
            'autoWidget' => true,
            // use ajax conversion for processing dates from display format to save format.
            //'ajaxConversion' => true,

            // default settings for each widget from kartik\widgets used when autoWidget is true
            'autoWidgetSettings' => [
                Module::FORMAT_DATE => ['type'=>2, 'pluginOptions'=>['autoclose'=>true]], // example
                Module::FORMAT_DATETIME => ['type'=>2, 'pluginOptions'=>['autoclose'=>true]], // setup if needed
                Module::FORMAT_TIME => [], // setup if needed
            ],
            // custom widget settings that will be used to render the date input instead of kartik\widgets,
            // this will be used when autoWidget is set to false at module or widget level.
            'widgetSettings' => [
                Module::FORMAT_DATE => [
                    'class' => 'yii\jui\DatePicker', // example
                    'options' => [
                        'dateFormat' => 'php:Y-m-d',
                        'options' => ['class'=>'form-control'],
                    ]
                ]
            ]
            // other settings
        ],
        'user' => [
            'class' => 'dektrium\user\Module',
            'components' => [
                'manager' => [
                    'class' => 'dektrium\user\Module',
                    // Active record classes
                    'userClass'    => 'dektrium\user\models\User',
                    'tokenClass'   => 'dektrium\user\models\Token',
                    'profileClass' => 'dektrium\user\models\Profile',
                    'accountClass' => 'dektrium\user\models\Account',
                    // Model that is used on user search on admin pages
                    'userSearchClass' => 'dektrium\user\models\UserSearch',
                    // Model that is used on registration
                    'registrationFormClass' => 'dektrium\user\models\RegistrationForm',
                    // Model that is used on resending confirmation messages
                    'resendFormClass' => 'dektrium\user\models\ResendForm',
                    // Model that is used on logging in
                    'loginFormClass' => 'dektrium\user\models\LoginForm',
                    // Model that is used on password recovery
                    'recoveryFormClass' => 'dektrium\user\models\RecoveryForm',
                    // Model that is used on requesting password recovery
                    'recoveryRequestFormClass' => 'dektrium\user\models\RecoveryRequestForm',
                ],
            ],
            'enableUnconfirmedLogin' => false,
            'confirmWithin' => 21600,
            'cost' => 12,
            'admins' => ['admin']
        ],
        'admin' => [
            'layout' => 'left-menu', // default null. other avaliable value 'right-menu' and 'top-menu'
            'class' => 'mdm\admin\Module',
            'controllerMap' => [
                 'assignment' => [
                    'class' => 'mdm\admin\controllers\AssignmentController',
                    'userClassName' => 'dektrium\user\models\User',
                    'idField' => 'id', // id field of model User
                ]
            ],
        ],
        'gridview' => [
            'class' => 'kartik\grid\Module',
        ],
        /*'datecontrol' =>  [
            'class' => 'kartik\datecontrol\Module',

            // format settings for displaying each date attribute
            'displaySettings' => [
                'date' => 'd-m-Y',
                'time' => 'H:i:s A',
                'datetime' => 'd-m-Y H:i:s A',
            ],

            // format settings for saving each date attribute
            'saveSettings' => [
                'date' => 'Y-m-d', 
                'time' => 'H:i:s',
                'datetime' => 'Y-m-d H:i:s',
            ],

            // automatically use kartik\widgets for each of the above formats
            'autoWidget' => true,
        ],*/
    ],
    'components' => [
        'devicedetect' => [
            'class' => 'alexandernst\devicedetect\DeviceDetect',
        ],
        'urlManager' => [
            'enablePrettyUrl' => true,
            /*'enableStrictParsing' => true,
            'showScriptName' => false,
            'rules' => [
                ['class' => 'yii\rest\UrlRule', 'controller' => 'sales-request'],
            ],*/
        ],
        'authManager' => [
            'class' => 'yii\rbac\DbManager', // or use 'yii\rbac\DbManager'
            'defaultRoles' => ['Guest'],
        ],
        'request' => [
            // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
            'cookieValidationKey' => 'abcdefg',
            /*'parsers' => [
                'application/json' => 'yii\web\JsonParser',
            ],*/
        ],
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'user' => [
            'identityClass' => 'dektrium\user\models\User',
            'enableAutoLogin' => true,
        ],
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            'transport' => [
                'class' => 'Swift_SmtpTransport',
                'host' => 'mail.mywebsite.co.id',
                'username' => 'notification@mywebsite.co.id',
                'password' => 'password',
                'port' => '26',
                'encryption' => 'tls',
            ],
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            'useFileTransport' => false,
        ],
        'mailerlocalization' => [
            'class' => 'yii\swiftmailer\Mailer',
            'transport' => [
                'class' => 'Swift_SmtpTransport',
                'host' => 'mail.mywebsite.co.id',
                'username' => 'localization@mywebsite.co.id',
                'password' => 'password',
                'port' => '26',
                'encryption' => 'tls',
            ],
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            'useFileTransport' => false,
        ],
        'log' => [
            'traceLevel' => YII_DEBUG ? 3 : 0,
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'db' => require(__DIR__ . '/db.php'),
    ],
    /*'as access' => [
        'class' => 'mdm\admin\components\AccessControl',
        'allowActions' => [
            //'admin/*', // add or remove allowed actions to this list
            //'site/*',
            //'user/*',
        ]
    ],*/
    'params' => $params,
];

if (YII_ENV_DEV) {
    // configuration adjustments for 'dev' environment
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = 'yii\debug\Module';

    $config['bootstrap'][] = 'gii';
    //$config['modules']['gii'] = 'yii\gii\Module';
    $config['modules']['gii']['class'] = 'yii\gii\Module';
    $config['modules']['gii']['generators'] = [
        'kartikgii-crud' => ['class' => 'warrence\kartikgii\crud\Generator'],
    ];
}

return $config;

RGTimothy commented 7 years ago

console.php


Yii::setAlias('@tests', dirname(__DIR__) . '/tests');

$params = require(__DIR__ . '/params.php');
$db = require(__DIR__ . '/db.php');

return [
    'id' => 'basic-console',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log', 'gii'],
    'controllerNamespace' => 'app\commands',
    'modules' => [
        'gii' => 'yii\gii\Module',
        'allowedIPs' => ['127.0.0.1', '::1'] // adjust this to your needs
    ],
    'components' => [
        'authManager' => [
            'class' => 'yii\rbac\DbManager', // or use 'yii\rbac\DbManager'
        ],
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'log' => [
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'db' => $db,
        'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            'transport' => [
                'class' => 'Swift_SmtpTransport',
                'host' => 'mail.mywebsite.co.id',
                'username' => 'notification@mywebsite.co.id',
                'password' => 'password',
                'port' => '26',
                'encryption' => 'tls',
            ],
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            'useFileTransport' => false,
        ],
        'mailerlocalization' => [
            'class' => 'yii\swiftmailer\Mailer',
            'transport' => [
                'class' => 'Swift_SmtpTransport',
                'host' => 'mail.mywebsite.co.id',
                'username' => 'localization@mywebsite.co.id',
                'password' => 'password',
                'port' => '26',
                'encryption' => 'tls',
            ],
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            'useFileTransport' => false,
        ],
    ],
    'params' => $params,
];

samdark commented 7 years ago

Yes, as I've said allowedIPs is nested improperly.

RGTimothy commented 7 years ago

Actually I didn't understand. Its even still got error after I delete allowedIPs line as below:

This is Yii version 2.0.9.

The following commands are available:

- asset                          Status: 500 Internal Server Error
X-Powered-By: PHP/5.6.30
Content-type: text/html; charset=UTF-8

PHP Warning 'yii\base\ErrorException' with message 'exec() has been disabled for security reasons'

in /home/mywebsite/public_html/vendor/yiisoft/yii2/helpers/BaseConsole.php:622

Stack trace:
#0 [internal function]: yii\base\ErrorHandler->handleError(2, 'exec() has been...', '/home/mywebsite/...', 622, Array)
#1 /home/mywebsite/public_html/vendor/yiisoft/yii2/helpers/BaseConsole.php(622): exec('stty -a 2>&1', Array)
#2 /home/mywebsite/public_html/vendor/yiisoft/yii2/helpers/BaseConsole.php(663): yii\helpers\BaseConsole::getScreenSize(false)
#3 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/controllers/HelpController.php(214): yii\helpers\BaseConsole::wrapText('Allows you to c...', 33)
#4 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/controllers/HelpController.php(67): yii\console\controllers\HelpController->getDefaultHelp()
#5 [internal function]: yii\console\controllers\HelpController->actionIndex(NULL)
#6 /home/mywebsite/public_html/vendor/yiisoft/yii2/base/InlineAction.php(55): call_user_func_array(Array, Array)
#7 /home/mywebsite/public_html/vendor/yiisoft/yii2/base/Controller.php(154): yii\base\InlineAction->runWithParams(Array)
#8 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/Controller.php(119): yii\base\Controller->runAction('', Array)
#9 /home/mywebsite/public_html/vendor/yiisoft/yii2/base/Module.php(454): yii\console\Controller->runAction('', Array)
#10 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/Application.php(180): yii\base\Module->runAction('', Array)
#11 /home/mywebsite/public_html/vendor/yiisoft/yii2/console/Application.php(147): yii\console\Application->runAction('', Array)
#12 /home/mywebsite/public_html/vendor/yiisoft/yii2/base/Application.php(375): yii\console\Application->handleRequest(Object(yii\console\Request))
#13 /home/mywebsite/public_html/yii(22): yii\base\Application->run()
#14 {main}
RGTimothy commented 7 years ago

Its working now. It was nothing to do with the allowedIPs. I just need to downgrade the php version to 5.5. That's it. Thanks for your help.

SilverFire commented 7 years ago

You need to change your PHP configuration file and allow exec() function to make it work

http://php.net/manual/en/ini.core.php#ini.disable-functions