## 门面 (Facade) MixPHP 的门面具有如下功能: - 为 **组件** 提供了一个静态调用接口,带来了更好的可读性与快速性, - 同类型组件多源切换,如:多个 PDO、Redis 连接切换。 你可以为任何组件定义一个 `facade` 类。 ## 核心门面类库 系统给内置的常用类库定义了 Facade 类库,可直接使用,包括: | 组件 | 门面类 | | --- | --- | | app()->request | mix\facades\Request | | app()->response | mix\facades\Response | | app()->input | mix\facades\Input | | app()->output | mix\facades\Output | | app()->log | mix\facades\Log | | app()->error | mix\facades\Error | | app()->token | mix\facades\Token | | app()->session | mix\facades\Session | | app()->cookie | mix\facades\Cookie | | app()->pdo | mix\facades\PDO | | app()->redis | mix\facades\Redis | ## 自定义门面 为下面的组件定义一个门面: ~~~ // 组件配置 'components' => [ // 普通命名 'myComponent' => [ // 类路径 'class' => 'apps\index\components\MyComponent', // 属性 'name' => '小花', ], ], ~~~ 然后在 `apps\httpd\facades` 目录新增一个 `myComponent` 类文件。 ~~~ <?php namespace apps\httpd\facades; use mix\base\Facade; class myComponent extends Facade { // 获取实例 public static function getInstance() { return app()->myComponent; } } ~~~ ## 门面使用 原本组件的调用: ~~~ app()->myComponent->foo(); ~~~ 门面类的调用,是不是简单很多。 ~~~ myComponent::foo(); ~~~ ## 代码补全 自己创建的门面类是没有代码补全的,需要用户自己在注释中添加。 例如: ~~~ * @method emergency($message, array $context = []) static * @method alert($message, array $context = []) static * @method critical($message, array $context = []) static * @method error($message, array $context = []) static ~~~ [>> 到 GitHub 查看门面注释 DEMO <<](https://github.com/mixstart/mixphp-framework/blob/master/src/facades/Log.php) ## 同类型组件多源切换 系统提供的如下 Facade 类库具有多源切换功能: | 门面类 | | --- | | mix\facades\PDO | | mix\facades\Redis | 我们先看一下源码,看看于普通的有何不同: [>> 到 GitHub 查看多源切换门面 <<](https://github.com/mixstart/mixphp-framework/blob/master/src/facades/PDO.php) - `getInstances` 方法返回一个具有多个组件的数组。 - `name` 方法可以通过名称切换当前使用的组件,这样就达到了切换数据库的效果。 当然我们实际使用中一定不可能去修改这个核心门面,只需写一个新的门面继承 `mix\facades\PDO` 类,并重写 `getInstances` 方法即可。 框架默认代码已经帮你继承好了,如下: [>> 到 GitHub 查看门面 DEMO <<](https://github.com/mixstart/mixphp/blob/master/apps/common/facades/PDO.php) 当需要频繁使用多个连接时,只需增加一个 pdo 组件: ~~~ // 数据库 'pdo' => [ // 类路径 'class' => 'mix\client\PDO', // 数据源格式 'dsn' => env('DB_DSN'), // 数据库用户名 'username' => env('DB_USERNAME'), // 数据库密码 'password' => env('DB_PASSWORD'), // 设置PDO属性: http://php.net/manual/zh/pdo.setattribute.php 'attribute' => [ // 设置默认的提取模式: \PDO::FETCH_OBJ | \PDO::FETCH_ASSOC \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, ], ], // 数据库 'db1.pdo' => [ // 类路径 'class' => 'mix\client\PDO', // 数据源格式 'dsn' => env('DB_DSN'), // 数据库用户名 'username' => env('DB_USERNAME'), // 数据库密码 'password' => env('DB_PASSWORD'), // 设置PDO属性: http://php.net/manual/zh/pdo.setattribute.php 'attribute' => [ // 设置默认的提取模式: \PDO::FETCH_OBJ | \PDO::FETCH_ASSOC \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC, ], ], ~~~ 然后修改 `apps/common/facades/PDO` 类代码如下: ~~~ /** * 获取实例集合 * @return array */ public static function getInstances() { return [ 'default' => app()->pdo, 'db1' => app('db1')->pdo, ]; } ~~~ 使用: ~~~ // 使用 default /apps/common/facades/PDO::createCommand($sql)->queryAll(); // 使用 db1 /apps/common/facades/PDO::name('db1')->createCommand($sql)->queryAll(); ~~~