Yii2是目前最流行的PHP开发框架之一,具有简洁优雅、脉络清晰、开放融合、易于扩展、开发高效等等特点。
在使用Yii2 Framework开发项目的过程中,必然会遇到很多复用代码或公共代码的管理问题,例如在backend和frontend都会用到的Css样式资源、Js脚本资源、图片资源、自定义的扩展组件等等。为了便于维护这些代码的版本,且能同时在backend、frontend以及其他子系统中调用,使用Yii2的扩展是非常好的选择。
这里分别以资源和小部件为例进行说明,本文不详细介绍扩展Composer的编写和配置,如需了这部分内容,可参考《The Definitive Guide to Yii 2.0》的3.12节,里面详细介绍了如何配置扩展的Composer。
Yii2资源扩展
Yii2中的资源是前端需要用到的如:Js、Css、图片、音频或视频文件。通常来说,资源文件放在Web可访问的目录下,由Web服务器直接读取。在Yii2中,可以通过编写资源管理类,由程序自动管理资源文件。当需要调用资源时,只要在视图或小部件中注册资源类,Yii2框架就能把需要用到的资源包含在视图或小部件中。
乍看起来这和扩展似乎并无关系,实则不然,这也是编写本文的主要目的,前文已经提到过在backend和frontend中共用代码的问题,若在前后台应用中分别管理Js或Css文件,并通过资源类进行管理当然可行,但如果项目中有更多应用,那么随之而来的就是这些Js、Css脚本的版本维护问题,在团队开发中这会演变成版本控制的“焦油坑”,而且这也不利于代码复用和分发。我们的目标是实现对有高复用性的代码进行集中管理和维护,且能对这部分代码独立分发,以便于在新的项目中再次复用。
Yii2扩展能很方便地满足我们的需求,下面详细介绍开发过程。
首先在项目目录中找到vender目录,该目录在项目创建之后即会存在,其部署位置默认是在项目根目录中,用于存放Yii2框架和扩展组件,开发者可以通过以下代码修改此目录的位置:$application->setVendorPath(path)。
在vender目录下创建一个子目录,如:nic,用于存放自定义扩展;继续在nic目录中创建子目录,这个目录名称建议按照Yii2扩展开发命名规则,即以“yii2-”开头,如:yii2-nic-common。在yii2-nic-common目录中创建assets目录用于存放资源文件,如Js、Css或图片文件等。至此,目录结构创建完成。
创建资源包管理类,该类必须声明为:yii\web\AssetBundle类的子类,该类有几项用于指定路径的属性,分别说明如下:
$basePath属性:服务器上存放资源文件的位置,必须是Web可见目录,当设置了$sourcePath属性,则该属性将被覆盖;
$baseUrl属性:相对根URL的资源访问路径;
$sourcePath属性:如果资源文件不在Web可见目录中,则要通过该属性指定资源包位置,一旦设置了该属性,将会覆盖$basePath属性;
$css属性:该属性数据类型为数组,用于指定本资源包需要包含的所有样式表文件;
$js属性:该属性数据类型为数组,用于指定本资源包需要包含的所有javascript文件;
$depends属性:该属性数据类型为数组,用于指定本资源包依赖的所有外部资源包,这些资源包类必须已经通过类自动装载器载入,注意:要从命名空间开始标识依赖的资源包;
完整的资源包类代码如下:
namespace nic\common;
use yii\web\AssetBundle;
/**
* @author gunnery
*/
class NicCommonAsset extends AssetBundle
{
public $sourcePath = __DIR__ . "/assets";
public $js = [
'nic.common.js',
];
public $css = [
'nic.common.css',
'nic.bootstrap.css',
];
public $depends = [
'yii\web\JqueryAsset',
'yii\bootstrap\BootstrapAsset',
'yii\bootstrap\BootstrapPluginAsset',
'lo\icofont\IcoFontAsset',
];
}
在代码中可见,先通过$sourcePath属性设置资源包的位置,然后分别用$js属性和$css属性设置的js文件和css文件的名称,再通过$deoends属性设置依赖项。
仅有资源包代码还不能在应用中调用,还需要在扩展配置文件中添加资源包的位置,确定类自动装载器能将载入资源包类。
进入vender目录下的yiisoft目录,可以看到有个名为extensions.php的文件,打开文件可以看到里面已经配置了很多默认自带的扩展。在返回数组的最后增加一项元素,配置为如下内容:
// Nic扩展
'nic' =>
array (
'name' => 'nic',
'version' => '1.0.0',
'alias' =>
array (
'@nic/common' => $vendorDir . '/nic/yii2-common',
),
),
配置好扩展文件后,就能在视图或者小部件中注册资源包了,注册方法很简单,只要调用资源包的静态注册方法即可:NicCommonAsset::register(your_view); 即可完成注册,在视图渲染过程中,会自动将必要的资源文件加载在视图上。
关于小部件扩展下次再写,过程与此类似。