Yii - 配置

  • 简述

    配置用于创建新对象或初始化现有对象。配置通常包括一个类名和一个初始值列表。它们还可能包括事件处理程序和行为列表。
    以下是数据库配置的示例 -
    
    <?php
       $config = [
          'class' => 'yii\db\Connection',
          'dsn' => 'mysql:host = localhost;dbname = helloworld',
          'username' => 'vladimir',
          'password' => '12345',
          'charset' => 'utf8',
       ];
       $db = Yii::createObject($config);
    ?>
    
    Yii::createObject()方法接受一个配置数组并根据配置中命名的类创建一个对象。
    配置的格式 -
    
    [
       //a fully qualified class name for the object being created
       'class' => 'ClassName',
       //initial values for the named property
       'propertyName' => 'propertyValue',
       //specifies what handlers should be attached to the object's events
       'on eventName' => $eventHandler,
       //specifies what behaviors should be attached to the object
       'as behaviorName' => $behaviorConfig,
    ]
    
    基本应用程序模板的配置文件是最复杂的文件之一 -
    
    <?php
       $params = require(__DIR__ . '/params.php');
       $config = [
          'id' => 'basic',
          'basePath' => dirname(__DIR__),
          'bootstrap' => ['log'],
          'components' => [
             'request' => [
                // !!! insert a secret key in the following (if it is empty) - this 
                   //is required by cookie validation
                'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
             ],
             'cache' => [
                'class' => 'yii\caching\FileCache',
             ],
             'user' => [
                'identityClass' => 'app\models\User',
                'enableAutoLogin' => true,
             ],
             'errorHandler' => [
                'errorAction' => 'site/error',
             ],
             'mailer' => [
                'class' => 'yii\swiftmailer\Mailer',
                // 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' => true,
             ],
             'log' => [
                'traceLevel' => YII_DEBUG ? 3 : 0,
                'targets' => [
                   [
                      'class' => 'yii\log\FileTarget',
                      'levels' => ['error', 'warning'],
                   ],
                ],
             ],
             'urlManager' => [
                //'showScriptName' => false,
                //'enablePrettyUrl' => true,
                //'enableStrictParsing' => true,
                //'suffix' => '/'
             ],
             'db' => require(__DIR__ . '/db.php'),
          ],
          'modules' => [
             'hello' => [
                'class' => 'app\modules\hello\Hello',
             ],
          ],
          'params' => $params,
       ];
       if (YII_ENV_DEV) {
          // configuration adjustments for 'dev' environment
          $config['bootstrap'][] = 'debug';
          $config['modules']['debug'] = [
             'class' => 'yii\debug\Module',
          ];
          $config['bootstrap'][] = 'gii';
          $config['modules']['gii'] = [
             'class' => 'yii\gii\Module',
          ];
       }
       return $config;
    ?>
    
    在上面的配置文件中,我们没有定义类名。这是因为我们已经在index.php文件中定义了它 -
    
    <?php
       //defining global constans
       defined('YII_DEBUG') or define('YII_DEBUG', true);
       defined('YII_ENV') or define('YII_ENV', 'dev');
       //register composer autoloader
       require(__DIR__ . '/../vendor/autoload.php');
       //include yii files
       require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
       //load application config
       $config = require(__DIR__ . '/../config/web.php');
       //create, config, and process request
       (new yii\web\Application($config))->run();
    ?>
    
    许多小部件还使用如下代码所示的配置。
    
    <?php
       NavBar::begin([
          'brandLabel' => 'My Company',
          'brandUrl' => Yii::$app->homeUrl,
          'options' => [
             'class' => 'navbar-inverse navbar-fixed-top',
          ],
       ]);
       echo Nav::widget([
          'options' => ['class' => 'navbar-nav navbar-right'],
          'items' => [
             ['label' => 'Home', 'url' => ['/site/index']],
             ['label' => 'About', 'url' => ['/site/about']],
             ['label' => 'Contact', 'url' => ['/site/contact']],
             Yii::$app->user->isGuest ?
             ['label' => 'Login', 'url' => ['/site/login']] :
             [
                'label' => 'Logout (' . Yii::$app->user->identity->username . ')',
                'url' => ['/site/logout'],
                'linkOptions' => ['data-method' => 'post']
             ],
          ],
       ]);
       NavBar::end();
    ?>
    
    当配置过于复杂时,通常的做法是创建一个 PHP 文件,该文件返回一个数组。查看config/console.php配置文件 -
    
    <?php
       Yii::setMooas('@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',
          ],
          'components' => [
             'cache' => [
                'class' => 'yii\caching\FileCache',
             ],
             'log' => [
                'targets' => [
                   [
                      'class' => 'yii\log\FileTarget',
                      'levels' => ['error', 'warning'],
                   ],
                ],
             ],
             'db' => $db,
          ],
          'params' => $params,
       ];
    ?>
    
    默认配置可以通过调用Yii::$container->set()方法来指定。它允许你在通过Yii::createObject()方法调用指定类的所有实例时应用默认配置。
    例如,要自定义yii\widgets\LinkPager类,使所有链接分页器最多显示三个按钮,可以使用以下代码。
    
    \Yii::$container->set('yii\widgets\LinkPager', [
       'maxButtonCount' => 3,
    ]);