yiisoft / yii2-debug

Debug Extension for Yii 2
http://www.yiiframework.com
BSD 3-Clause "New" or "Revised" License
201 stars 149 forks source link

Illegal string offset 'class' in ActionRoutes.php #453

Closed dicrtarasov closed 3 years ago

dicrtarasov commented 3 years ago

PHP Warning – yii\base\ErrorException Illegal string offset 'class' in in /home/apkv/sites_dev/vendor/yiisoft/yii2-debug/src/models/router/ActionRoutes.php: 103

    protected function getActions($controller)
    {
       ...
         foreach ($externalActions as $id => $externalAction) {
            $actions[$id] = $externalAction['class'];
        }
       ...
    }

$externalActions:

array(4) {
  ["file"]=> string(38) "dicr\widgets\redactor\FileUploadAction"
  ["image"]=> string(39) "dicr\widgets\redactor\ImageUploadAction"
  ["image-json"]=> string(44) "dicr\widgets\redactor\ImageManagerJsonAction"
  ["file-json"]=> string(43) "dicr\widgets\redactor\FileManagerJsonAction"
}

Actions defined in short way:

    /**
     * @inheritDoc
     */
    public function actions() : array
    {
        return [
            'file' => FileUploadAction::class,
            'image' => ImageUploadAction::class,
            'image-json' => ImageManagerJsonAction::class,
            'file-json' => FileManagerJsonAction::class,
        ];
    }

So, need to check if $externalAction defined as array or simple string:

    protected function getActions($controller)
    {
       ...
         foreach ($externalActions as $id => $externalAction) {
 +++     if (is_string($externalAction)) {
 +++         $externalAction = ['class' => $externalAction];
 +++     }

            $actions[$id] = $externalAction['class'];
        }
       ...
    }

yii2-debug : 2.1.5

dicrtarasov commented 3 years ago
    protected function getActions($controller)
    {
       - // -

        foreach ($externalActions as $id => $externalAction) {
            if (is_array($externalAction)) {
                if (isset($externalAction['class'])) {
                    $actions[$id] = $externalAction['class'];
                }
            } elseif (is_string($externalAction)) {
                $actions[$id] = $externalAction;
            }
        }

       - // -
}
bizley commented 3 years ago

It's already fixed in master, waiting for release.