配置

虽然约定消除了配置所有 CakePHP 的需要,但您仍然需要配置一些内容,例如您的数据库凭据。

此外,还有一些可选的配置选项,允许您用适合您应用程序的选项替换默认值和实现。

配置您的应用程序

配置通常存储在 PHP 或 INI 文件中,并在应用程序启动时加载。CakePHP 默认情况下带有一个配置文件,但如果需要,您可以在应用程序的引导代码中添加其他配置文件并加载它们。 Cake\Core\Configure 用于全局配置,并且像 Cache 这样的类提供 setConfig() 方法以使配置简单透明。

应用程序框架包含一个 config/app.php 文件,其中应包含在应用程序部署的不同环境中不改变的配置。config/app_local.php 文件应包含在不同环境之间变化的配置数据,应由配置管理或您的部署工具管理。这两个文件都通过 env() 函数引用环境变量,该函数使配置值可以通过服务器环境设置。

加载附加的配置文件

如果您的应用程序有许多配置选项,将配置拆分为多个文件可能会有所帮助。在 config/ 目录中创建每个文件后,您可以在 bootstrap.php 中加载它们。

use Cake\Core\Configure;
use Cake\Core\Configure\Engine\PhpConfig;

Configure::setConfig('default', new PhpConfig());
Configure::load('app', 'default', false);
Configure::load('other_config', 'default');

环境变量

许多现代云提供商(如 Heroku)允许您为配置数据定义环境变量。您可以通过环境变量在 12 因子应用程序风格 中配置您的 CakePHP。环境变量使您的应用程序能够减少对状态的依赖,从而使您的应用程序在跨多个环境部署时更容易管理。

正如您在 app.php 中看到的,env() 函数用于从环境中读取配置并构建应用程序配置。CakePHP 使用 DSN 字符串用于数据库、日志、电子邮件传输和缓存配置,使您能够轻松地在每个环境中改变这些库。

对于本地开发,CakePHP 利用 dotenv 使本地开发自动重新加载环境变量。使用 composer 要求此库,然后在 bootstrap.php 中有一块代码需要取消注释才能利用它。

您将在您的应用程序中看到一个 config/.env.example。通过将此文件复制到 config/.env 并自定义值,您可以配置您的应用程序。

您应该避免将 config/.env 文件提交到您的存储库,而是使用 config/.env.example 作为包含占位符值的模板,以便您团队中的每个人都知道正在使用哪些环境变量以及每个变量应该包含什么内容。

设置好环境变量后,您可以使用 env() 从环境中读取数据。

$debug = env('APP_DEBUG', false);

传递给 env 函数的第二个值是默认值。如果不存在给定键的环境变量,则将使用此值。

常规配置

以下是变量的描述以及它们如何影响您的 CakePHP 应用程序。

debug

更改 CakePHP 调试输出。false = 生产模式。不显示错误消息、错误或警告。true = 显示错误和警告。

App.namespace

在其中查找应用程序类的命名空间。

注意

更改配置中的命名空间后,您还需要更新您的 composer.json 文件以使用此命名空间。此外,通过运行 php composer.phar dumpautoload 创建一个新的自动加载器。

App.baseUrl

如果您打算将 Apache 的 mod_rewrite 与 CakePHP 一起使用,请取消注释此定义。也不要忘记删除您的 .htaccess 文件。

App.base

应用程序所在的基目录。如果为 false,则将自动检测。如果不是 false,请确保您的字符串以 / 开头,并且/ 结尾。例如,/basedir 是一个有效的 App.base。

App.encoding

定义您的应用程序使用的编码。此编码用于在布局中生成字符集,以及对实体进行编码。它应该与为数据库指定的编码值匹配。

App.webroot

webroot 目录。

App.wwwRoot

webroot 的文件路径。

App.fullBaseUrl

应用程序根目录的完全限定域名(包括协议)。这在生成绝对 URL 时使用。默认情况下,此值使用 $_SERVER 环境生成。但是,您应该手动定义它以优化性能,或者如果您担心有人操纵 Host 标头。在 CLI 上下文(从命令)中,无法从 $_SERVER 读取 fullBaseUrl,因为没有涉及 Web 服务器。如果您确实需要从 shell 生成 URL(例如,在发送电子邮件时),您确实需要自己指定它。

App.imageBaseUrl

webroot 下公用图像目录的 Web 路径。如果您使用的是 CDN,则应将此值设置为 CDN 的位置。

App.cssBaseUrl

webroot 下公用 css 目录的 Web 路径。如果您使用的是 CDN,则应将此值设置为 CDN 的位置。

App.jsBaseUrl

webroot 下公用 js 目录的 Web 路径。如果您使用的是 CDN,则应将此值设置为 CDN 的位置。

App.paths

为非类资源配置路径。支持 pluginstemplateslocales 子键,它们分别允许定义插件、视图模板和区域设置文件的路径。

App.uploadedFilesAsObjects

定义上传的文件是作为对象 (true) 还是数组 (false) 表示。默认情况下,此选项被视为已启用。有关更多信息,请参见“请求和响应对象”一章中的 文件上传部分

Security.salt

哈希中使用的随机字符串。此值也用作对称加密时进行 HMAC 盐。.

Asset.timestamp

使用适当的助手时,将时间戳(即特定文件的最后修改时间)附加到资产文件 URL(CSS、JavaScript、图像)的末尾。有效值

  • (bool) false - 不执行任何操作(默认值)

  • (bool) true - 当 debug 为 true 时附加时间戳

  • (string) ‘force’ - 始终附加时间戳。

Asset.cacheTime

设置资源缓存时间。这决定了 http 头部 Cache-Controlmax-age,以及 http 头部 Expire 的时间,用于资源。它可以接受 PHP 版本的 strtotime 函数 可接受的任何内容。默认值为 +1 day

使用 CDN

要使用 CDN 加载静态资源,请将 App.imageBaseUrlApp.cssBaseUrlApp.jsBaseUrl 更改为指向 CDN URI,例如:https://mycdn.example.com/(注意结尾的 /)。

通过 HtmlHelper 加载的所有图片、脚本和样式都将在绝对 CDN 路径之前加上前缀,匹配应用程序中使用的相同相对路径。请注意,在使用基于插件的资源时,存在一个特定的用例:当使用绝对 ...BaseUrl URI 时,插件将不会使用插件的前缀,例如,默认情况下

  • $this->Helper->assetUrl('TestPlugin.logo.png') 解析为 test_plugin/logo.png

如果您将 App.imageBaseUrl 设置为 https://mycdn.example.com/

  • $this->Helper->assetUrl('TestPlugin.logo.png') 解析为 https://mycdn.example.com/logo.png

数据库配置

有关配置数据库连接的信息,请参阅 数据库配置

缓存配置

有关在 CakePHP 中配置缓存的信息,请参阅 缓存配置

错误和异常处理配置

有关配置错误和异常处理程序的信息,请参阅 错误和异常配置

日志记录配置

有关在 CakePHP 中配置日志记录的信息,请参阅 日志记录配置

电子邮件配置

有关在 CakePHP 中配置电子邮件预设的信息,请参阅 电子邮件配置

会话配置

有关在 CakePHP 中配置会话处理的信息,请参阅 会话配置

路由配置

有关配置路由和为您的应用程序创建路由的更多信息,请参阅 路由配置

其他类路径

其他类路径通过您的应用程序使用的自动加载器进行设置。当使用 composer 生成自动加载器时,您可以执行以下操作,为应用程序中的控制器提供回退路径

"autoload": {
    "psr-4": {
        "App\\Controller\\": "/path/to/directory/with/controller/folders/",
        "App\\": "src/"
    }
}

上面将为 AppApp\Controller 命名空间设置路径。将搜索第一个键,如果该路径不包含该类/文件,则将搜索第二个键。您还可以使用以下方法将单个命名空间映射到多个目录

"autoload": {
    "psr-4": {
        "App\\": ["src/", "/path/to/directory/"]
    }
}

插件、视图模板和语言环境路径

由于插件、视图模板和语言环境不是类,因此无法为它们配置自动加载器。CakePHP 提供三个 Configure 变量来为这些资源设置其他路径。在您的 config/app.php 中,您可以设置这些变量

return [
    // More configuration
    'App' => [
        'paths' => [
            'plugins' => [
                ROOT . DS . 'plugins' . DS,
                '/path/to/other/plugins/',
            ],
            'templates' => [
                ROOT . DS . 'templates' . DS,
                ROOT . DS . 'templates2' . DS,
            ],
            'locales' => [
                ROOT . DS . 'resources' . DS . 'locales' . DS,
            ],
        ],
    ],
];

路径应以目录分隔符结尾,否则将无法正常工作。

词形变化配置

有关更多信息,请参阅 词形变化配置 文档。

Configure 类

class Cake\Core\Configure

CakePHP 的 Configure 类可用于存储和检索应用程序或运行时特定的值。请小心,此类允许您在其中存储任何内容,然后在代码的任何其他部分使用它:这无疑会破坏 CakePHP 设计的 MVC 模式。Configure 类的主要目标是保留可在多个对象之间共享的集中式变量。请记住,尝试遵循“约定优于配置”的原则,这样您就不会最终破坏 CakePHP 提供的 MVC 结构。

编写配置数据

static Cake\Core\Configure::write($key, $value)

使用 write() 将数据存储在应用程序的配置中

Configure::write('Company.name', 'Pizza, Inc.');
Configure::write('Company.slogan', 'Pizza for your body and soul');

注意

$key 参数中使用的 点表示法 可用于将配置设置组织成逻辑组。

上面的示例也可以通过单个调用来完成

Configure::write('Company', [
    'name' => 'Pizza, Inc.',
    'slogan' => 'Pizza for your body and soul'
]);

您可以使用 Configure::write('debug', $bool) 在调试和生产模式之间动态切换。

注意

使用 Configure::write() 完成的任何配置更改都存储在内存中,并且不会跨请求持久化。

读取配置数据

static Cake\Core\Configure::read($key = null, $default = null)

用于从应用程序中读取配置数据。如果提供了键,则返回数据。使用我们从 write() 中的示例,我们可以读回这些数据

// Returns 'Pizza Inc.'
Configure::read('Company.name');

// Returns 'Pizza for your body and soul'
Configure::read('Company.slogan');

Configure::read('Company');
// Returns:
['name' => 'Pizza, Inc.', 'slogan' => 'Pizza for your body and soul'];

// Returns 'fallback' as Company.nope is undefined.
Configure::read('Company.nope', 'fallback');

如果 $key 保持为 null,则将返回 Configure 中的所有值。

static Cake\Core\Configure::readOrFail($key)

读取配置数据,就像 Cake\Core\Configure::read() 一样,但期望找到键值对。如果请求的对不存在,则会抛出 RuntimeException

Configure::readOrFail('Company.name');    // Yields: 'Pizza, Inc.'
Configure::readOrFail('Company.geolocation');  // Will throw an exception

Configure::readOrFail('Company');

// Yields:
['name' => 'Pizza, Inc.', 'slogan' => 'Pizza for your body and soul'];

检查配置数据是否已定义

static Cake\Core\Configure::check($key)

用于检查键/路径是否存在且具有非 null 值

$exists = Configure::check('Company.name');

删除配置数据

static Cake\Core\Configure::delete($key)

用于从应用程序的配置中删除信息

Configure::delete('Company.name');

读取和删除配置数据

static Cake\Core\Configure::consume($key)

从 Configure 中读取并删除一个键。这在您希望在一个操作中结合读取和删除值时很有用。

static Cake\Core\Configure::consumeOrFail($key)

消耗配置数据,就像 Cake\Core\Configure::consume() 一样,但期望找到键值对。如果请求的对不存在,则会抛出 RuntimeException

Configure::consumeOrFail('Company.name');    // Yields: 'Pizza, Inc.'
Configure::consumeOrFail('Company.geolocation');  // Will throw an exception

Configure::consumeOrFail('Company');

// Yields:
['name' => 'Pizza, Inc.', 'slogan' => 'Pizza for your body and soul'];

读取和写入配置文件

static Cake\Core\Configure::setConfig($name, $engine)

CakePHP 附带了两个内置的配置文件引擎。 Cake\Core\Configure\Engine\PhpConfig 能够读取 PHP 配置文件,格式与 Configure 历史上读取的格式相同。 Cake\Core\Configure\Engine\IniConfig 能够读取 ini 配置文件。有关 ini 文件的详细信息,请参阅 PHP 文档。要使用核心配置引擎,您需要使用 Configure::config() 将其附加到 Configure

use Cake\Core\Configure\Engine\PhpConfig;

// Read config files from config
Configure::config('default', new PhpConfig());

// Read config files from another path.
Configure::config('default', new PhpConfig('/path/to/your/config/files/'));

您可以将多个引擎附加到 Configure,每个引擎读取不同类型或来源的配置文件。您可以使用 Configure 上的其他方法与附加的引擎交互。要检查已附加的引擎别名,可以使用 Configure::configured()

// Get the array of aliases for attached engines.
Configure::configured();

// Check if a specific engine is attached
Configure::configured('default');
static Cake\Core\Configure::drop($name)

您还可以删除附加的引擎。 Configure::drop('default') 将删除默认引擎别名。将来尝试使用该引擎加载配置文件将失败。

Configure::drop('default');

加载配置文件

static Cake\Core\Configure::load($key, $config = 'default', $merge = true)

将配置引擎附加到 Configure 后,您可以加载配置文件。

// Load my_file.php using the 'default' engine object.
Configure::load('my_file', 'default');

加载的配置文件将它们的数据与 Configure 中的现有运行时配置合并。这允许您覆盖并将新值添加到现有的运行时配置中。通过将 $merge 设置为 true,值永远不会覆盖现有配置。

警告

当使用 $merge = true 合并配置文件时,键中的点表示法不会扩展。

// config1.php
'Key1' => [
    'Key2' => [
        'Key3' => ['NestedKey1' => 'Value'],
    ],
],

// config2.php
'Key1.Key2' => [
    'Key3' => ['NestedKey2' => 'Value2'],
]

Configure::load('config1', 'default');
Configure::load('config2', 'default', true);

// Now Key1.Key2.Key3 has the value ['NestedKey2' => 'Value2']
// instead of ['NestedKey1' => 'Value', 'NestedKey2' => 'Value2']

创建或修改配置文件

static Cake\Core\Configure::dump($key, $config = 'default', $keys = [])

将 Configure 中的所有或部分数据转储到配置文件引擎支持的文件或存储系统中。序列化格式由作为 $config 附加的配置引擎决定。例如,如果“default”引擎是 Cake\Core\Configure\Engine\PhpConfig,则生成的将是可由 Cake\Core\Configure\Engine\PhpConfig 加载的 PHP 配置文件。

假设“default”引擎是 PhpConfig 的实例。将 Configure 中的所有数据保存到 my_config.php 文件中。

Configure::dump('my_config', 'default');

仅保存错误处理配置。

Configure::dump('error', 'default', ['Error', 'Exception']);

Configure::dump() 可用于修改或覆盖使用 Configure::load() 可读的配置文件。

存储运行时配置

static Cake\Core\Configure::store($name, $cacheConfig = 'default', $data = null)

您还可以存储运行时配置值以便在将来的请求中使用。由于 Configure 仅记住当前请求的值,因此如果要在后续请求中使用任何修改的配置信息,则需要存储这些信息。

// Store the current configuration in the 'user_1234' key in the 'default' cache.
Configure::store('user_1234', 'default');

存储的配置数据会保留在命名的缓存配置中。有关缓存的更多信息,请参阅 Caching 文档。

恢复运行时配置

static Cake\Core\Configure::restore($name, $cacheConfig = 'default')

存储运行时配置后,您可能需要恢复它才能再次访问它。 Configure::restore() 就是为此目的。

// Restore runtime configuration from the cache.
Configure::restore('user_1234', 'default');

恢复配置信息时,重要的是使用与存储时相同的键和缓存配置进行恢复。恢复的信息会合并到现有的运行时配置之上。

配置引擎

CakePHP 提供了从多个不同来源加载配置文件的功能,并提供了一个可插拔系统用于 创建您自己的配置引擎。内置配置引擎包括

默认情况下,您的应用程序将使用 PhpConfig