View on GitHub

yii2-cookbook-chinese

Yii Application Development Cookbook(Third Edition)中文翻译

修改Yii目录布局

默认情况下,我们有基础和高级Yii2应用框架,他们有不同的目录结构。但是这些框架不是教条,如果有需要我们可以自定义他们。

例如,我们可以将runtime文件夹移除项目。

准备

按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的yii2-app-basic应用。

如何做…

修改runtime文件夹的位置

打开config/web.phpconfig/console.php,定义runtimePath参数:

$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'runtimePath' => '/tmp/runtime',
    'components' => [
    // ...
    ],
]

将runtime文件夹移到新的位置。

修改vendor文件夹的位置

  1. 打开config/web.phpconsole.php,定义vendorPath参数:
$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'vendorPath' => dirname(__DIR__), '/../vendor',
    'components' => [
        // ...
    ],
]
  1. vendor文件夹以及composer.jsoncomposer.lock文件移到新的位置。
  2. 打开web/index.phpyii文件,找到这些行:
require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
  1. 修改包含的路径。

修改控制器的位置

  1. 重命名commands目录为console
  2. 修改命名空间app\commands\HelloControllerapp\console\HelloController
  3. 打开config/console.php,重新定义controllerNamespace参数:
$config = [
    'id' => 'basic-console',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'controllerNamespace' => 'app\console',
    'components' => [
        // ...
    ],
]

修改视图文件夹的位置

  1. 打开config/web.php,定义viewPath参数:
$config = [
    'id' => 'basic',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'viewPath' => '@app/myviews',
    'components' => [
        // ...
    ],
]
  1. 重命名views目录。

工作原理…

yii\base\Application::preInit方法中,我们的应用定义了basePathruntimePathvendorPath参数。

默认情况下,这些值分别指向了应用目录的根,runtimevendor路径。

例如,你可以重定义vendorPath,如果你希望将vendor目录分享给同样项目的一些实例。但是注意包的版本的兼容性。

yii\base\Application类继承了yii\base\Module,它包含了controllerNamespaceviewPath参数。第一个参数允许你修改应用和模块的基命名空间。如果你希望在同一个模块目录中,提供前端和后端控制器,这会非常有帮助。只修改controllers目录到前端和后端,或者创建子目录并配置你的前端和后端应用:

return [
    'id' => 'app-frontend',
    'basePath' => dirname(__DIR__),
    'controllerNamespace' => 'frontend\controllers',
    'bootstrap' => ['log'],
    'modules' => [
        'user' => [
            'my\user\Module',
            'controllerNamespace' => 'my\user\controllers\frontend',
        ]
    ],
// ...
]
return [
    'id' => 'app-backend',
    'basePath' => dirname(__DIR__),
    'controllerNamespace' => 'backend\controllers',
    'bootstrap' => ['log'],
    'modules' => [
        'user' => [
            'my\user\Module',
            'controllerNamespace' => 'my\user\controllers\backend',
        ]
    ],
// ...
]

参考

为了了解更多关于应用结构的信息,参考http://www.yiiframework.com/doc-2.0/guide-structure-applications.html