yii2aliasassetsgii

Yii2 - Gii extension assets folder alias referencing to a wrong path


I am trying to learn Yii 2 from a book (Web application development with Yii2 and PHP). Somewhere along the line it instructs me to install gii and create crud files with it.

When I installed with the following command:

php composer.phar require --prefer-dist "yiisoft/yii2-gii:*"

I have following error:

Invalid Parameter – yii\base\InvalidParamException The file or directory to be published does not exist: /var/projectsRoot/crmapp/src/vendor/yiisoft/yii2/gii/assets

My bootstrap code:

//Define Yii debug mode
define (YII_DEBUG, true);

//Including composer autoloader
require (__DIR__ . '/../vendor/autoload.php');

//Including Yii framework
require (__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');

//debugging for PHP
ini_set('display_errors', true);

//Getting Configuration
$config = require(__DIR__ . '/../config/web.php');

//Include and launch application
(new yii\web\Application($config))->run();

config file:

return [
    'id' => 'crmapp',
    'basePath' => realpath(__DIR__ . '/../'),
    'components' => [
        'request' => [
            'cookieValidationKey' => 'your secret key here'
        ],
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false
        ],
        'db' => require(__DIR__ . '/db.php')
    ],
    'modules' => [
        'gii' => [
            'class' => 'yii\gii\Module',
            'allowedIPs' => ['192.168.33.1']
        ]
    ],
    'extensions' => [
        require (__DIR__ . '/../vendor/yiisoft/extensions.php')
    ]
];

extensions file:

$vendorDir = dirname(__DIR__);

return array (
  'yiisoft/yii2-bootstrap' => 
  array (
    'name' => 'yiisoft/yii2-bootstrap',
    'version' => '2.0.5.0',
    'alias' => 
    array (
      '@yii/bootstrap' => $vendorDir . '/yiisoft/yii2-bootstrap',
    ),
  ),
  'yiisoft/yii2-gii' => 
  array (
    'name' => 'yiisoft/yii2-gii',
    'version' => '2.0.4.0',
    'alias' => 
    array (
      '@yii/gii' => $vendorDir . '/yiisoft/yii2-gii',
    ),
  ),
);

I digged it a little bit. It seems problem is about the alias of the assets folder.

In GiiAsset.php file, there is this codeblock:

...
class GiiAsset extends AssetBundle
{
    public $sourcePath = '@yii/gii/assets';
...

which returns

/var/projectsRoot/crmapp/src/vendor/yiisoft/yii2/gii/assets

but it normally should return

/var/projectsRoot/crmapp/src/vendor/yiisoft/gii/assets

so it is adding an unnecessary yii2 to the path.

I tried to change the $sourcePath in extensions.php file, but changing the value here does not effect the result in any way.

Any ideas?

--UPDATE--

While I was fiddling with things, I tried to define the alias to force the correct value; as follows:

Yii::setAlias('@yii/gii', $vendorDir . '/yiisoft/yii2-gii');

when I try to run the application with this setting I get following error:

The file or directory to be published does not exist: /var/projectsRoot/crmapp/src/vendor/bower/bootstrap/dist

When I change the alias definition to this:

Yii::setAlias('@yii/gii', $vendorDir . '/yiisoft/yii2-gi');

I get following error:

The file or directory to be published does not exist: /var/projectsRoot/crmapp/src/vendor/yiisoft/yii2-gi

I'm quite confused with this behavior. What would be causing this?


Solution

  • I ended up with deleting my vendor folder and composer.json file, and creating it back with following content:

    {
        "require": {
            "codeception/codeception": "*",
            "fzaninotto/faker": "*",
            "yiisoft/yii2": "*",
            "yiisoft/yii2-gii": "*"
        }
    }
    

    When I launched the gii, it again threw the following exception:

    The file or directory to be published does not exist: /var/projectsRoot/crmapp/src/vendor/bower/jquery/dist

    I renamed the vendor/bower-asset folder to vendor/bower and it works now.

    I probably messed up with something before without noticing, but I'm not certain why it is looking for bower, instead of bower-asset. Renaming the bower-asset to bower seems to solve it.

    UPDATE

    Thanks to jacmoe from the original Yii forum, it has finally solved.

    It seems these two lines need do be present in composer.json in order to automatically create bower folder, instead of bower-asset.

    "extra": {
        "asset-installer-paths": {
            "npm-asset-library": "vendor/npm",
            "bower-asset-library": "vendor/bower"
        }
    }
    

    Original conversation can be found at here:

    These lines are automatically created when you install the basic application template, but when installing the bare code base, you need to manually write them.