精解PHP的Yii框架中国和东瀛记的有关配置及利用_php工夫_脚本之家

扩展是专门设计的在 Yii 应用中随时可拿来使用的,
并可重发布的软件包。例如, yiisoft/yii2-debug
扩展在你的应用的每个页面底部添加一个方便用于调试的工具栏,
帮助你简单地抓取页面生成的情况。 你可以使用扩展来加速你的开发过程。

默认的日志是输出到protected/runtime/application.log

第一种方法按照YII系统的办法生成视图觉得有点麻烦,觉得用smarty更省事。尝试着把smarty模板加进来了。复制代码
代码如下:date_default_timezone_set;class PlaceController extends
CController {protected $_smarty;function
__construct(){parent::__construct;//需要一个参数来调用父类的构造函数,该参数为控制器ID$path
= Yii::getPathOfAlias;//获得protected文件夹的绝对路径include
.DIRECTORY_SEPARATOR.’Smarty’.DIRECTORY_SEPARATOR.’Smarty.class.php’);//smarty所在路径$this->_smarty
= new Smarty();$this->_smarty->template_dir =
dirname.DIRECTORY_SEPARATOR.’template’.DIRECTORY_SEPARATOR;//模板路径}主要一个问题是自动加载类执行冲突的问题。YII注册了一个自动加载类spl_autoload_register(array),SMARTY也注册了一个自动加载类,spl_autoload_register,YII
注册在前,这样在遇到一个类名的时候,先执行的是YII的自定义自动加载类的函数,对应SMARTY里的每个类名而言,也是先调用YII的自动加载类的函
数,但是如果不符合YII自动加载的条件的话,就会执行SMARTY的自动加载类的函数,然而,SMARTY的类名在自动加载类的时候,确符合了YII自
动加载类的逻辑语句,结果就是YII使用Include语句要包含的类肯定找不到。解决的办法是:当SMARTY的类自动加载的时候,跳出在YII定义的自动加载函数,这样就会执行SMARTY的加载函数。具体实现是,修改YIIBase类里面的autoload函数,增加如下代码复制代码 代码如下:public static function
autoload{// use include so that the error PHP file may
appearif(preg_match(‘/smarty/i’, $className)){
//只要类名包含smarty的,无论大小写,都返回,这样就跳出了YII自动加载类而去执行
SMARTY的自动加载类函数了return;}
YII自动加载类代码}这样就可以在每个Action里使用smarty模板了。复制代码 代码如下:public function
actionIndex(){$this->_smarty->assign;$this->_smarty->display;}第二种方法:在protected下的extensions文件夹放入smarty模板插件,并建立CSmarty类文件,内容如下复制代码 代码如下:

一个绑定了行为的类,表现起来是这样的:

Yii中的资源是和Web页面相关的文件,可为CSS文件,JavaScript文件,图片或视频等,
资源放在Web可访问的目录下,直接被Web服务器调用。

信息:本文中我们使用的术语 “扩展” 特指 Yii 软件包。而用术语 “软件包” 和
“库” 指代非 Yii 专用的通常意义上的软件包。使用扩展

如果需要修改那么需要在main.php里面的 components 下面增加log配置,如下:

template_dir = SMARTY_VIEW_DIR; $this->compile_dir =
SMARTY_VIEW_DIR.self::DIR_SEP.’template_c’; $this->caching =
true; $this->cache_dir = SMARTY_VIEW_DIR.self::DIR_SEP.’cache’;
$this->left_delimiter = ”; $this->cache_lifetime = 3600; }
function init() {} } ?>
然后建立samrty所需的template_c,cache等文件夹。接下来是配置部分打开protected/config/main.php在components数组中加入复制代码 代码如下:’smarty’=>array(
‘class’=>’application.extensions.CSmarty’,),最后在action中直接用Yii::app()->smarty就可以试用smarty了。如果每次在action中使用Yii::app()->smarty比较麻烦的话,可以在components下的Controller中可以加入复制代码 代码如下:protected $smarty =
”;protected function init() { $this->smarty =
Yii::app()->smarty;}然后在action中就直接可以用$this->smarty使用smarty了。

// Step 1: 定义一个将绑定行为的类class MyClass extends yii\base\Component{ // 空的}// Step 2: 定义一个行为类,他将绑定到MyClass上class MyBehavior extends yii\base\Behavior{ // 行为的一个属性 public $property1 = 'This is property in MyBehavior.'; // 行为的一个方法 public function method1() { return 'Method in MyBehavior is called.'; }}$myClass = new MyClass();$myBehavior = new MyBehavior();// Step 3: 将行为绑定到类上$myClass->attachBehavior('myBehavior', $myBehavior);// Step 4: 访问行为中的属性和方法,就和访问类自身的属性和方法一样echo $myClass->property1;echo $myClass->method1();

通过程序自动管理资源更好一点,例如,当你在页面中使用
yii\jui\DatePicker 小部件时,
它会自动包含需要的CSS和JavaScript文件,而不是要求你手工去找到这些文件并包含,
当你升级小部件时,它会自动使用新版本的资源文件,在本教程中,我们会详述Yii提供的强大的资源管理功能。

要使用扩展,你要先安装它。大多数扩展以 Composer 软件包的形式发布,
这样的扩展可采取下述两个步骤来安装:

'preload' => array,//这句也必须加上'components' => array( 'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( //这是一个文件route表示category为test开头的所有类型的输出都会记录到runtime/test.log下面 array( 'class'=>'CFileLogRoute', 'levels'=>'trace, info, debug, warn, error, fatal, profile', 'categories'=>'test.*', 'maxFileSize'=>1048576,//单文件最大1G 'logFile'=>'test.log', ), // // 开发过程中所有日志直接输出到浏览器了,这样不需要登录服务器看日志了 array( 'class' => 'CWebLogRoute', 'categories' => 'test.*', 'levels' => CLogger::LEVEL_PROFILE, 'showInFireBug' => true, 'ignoreAjaxInFireBug' => true, ), array( 'class' => 'CWebLogRoute', 'categories' => 'test.* ', ), array( 'class'=>'CEmailLogRoute', 'levels'=>'error, warning', 'emails'=>'admin@example.com', ), ), ), ),

上面的代码你不用全都看懂,虽然你可能已经用脚趾头猜到了这些代码的意思,
但这里你只需要记住行为中的属性和方法可以被所绑定的类像访问自身的属性和方法一样直接访问就OK了。
代码中, $myClass 是没有 property1 method() 成员的。这俩是 $myBehavior
的成员。 但是,通过 attachBehavior() 将行为绑定到对象之后, $myCalss
就好像练成了吸星大法、化功大法,表现的财大气粗,将别人的属性和方法都变成了自己的。

资源包

修改你的应用的 composer.json 文件,指明你要安装的是哪个扩展 。运行
composer install 来安装指定的扩展。注意如果你还没有安装 Composer
,你需要先安装。

如果在某处调用了Yii::log(“jdkshgds”,”info”,’test.xx’);

另外,从上面的代码中,你还要掌握使用行为的大致流程:

Yii在资源包中管理资源,资源包简单的说就是放在一个目录下的资源集合,
当在视图中注册一个资源包,在渲染Web页面时会包含包中的CSS和JavaScript文件。

默认情况,Composer安装的是在 Packagist 中 注册的软件包 – 最大的开源
Composer 代码库。你可以在 Packageist 中查找扩展。 你也可以
创建你自己的代码库 然后配置 Composer 来使用它。
如果是在开发私有的扩展,并且想只在你的其他工程中共享时,这样做是很有用的。

这个log首先被记录在了内存中一个CLogger类的array中,然后会逐一的判断每个LogRoute,判断是否需要输出,注意是逐一判断,不是其中一个输出下一个就不管了。

从 yii\base\Component 派生自己的类,以便使用行为; 从
yii\base\Behavior 派生自己的行为类,里面定义行为涉及到的属性、方法;
将Component和Behavior绑定起来;
像使用Component自身的属性和方法一样,尽情使用行为中定义的属性和方法。

定义资源包

通过 Composer 安装的扩展会存放在 BasePath/vendor 目录下,这里的 BasePath
指你的应用的 base path。因为 Composer
还是一个依赖管理器,当它安装一个包时,
也将安装这个包所依赖的所有软件包。

第一个CFileLogRoute,’categories’=>’test.*’,levels里包含了info,
test.xx满足条件,所以会执行,将这条log输出到test.log中,然后下一个CWebLogRoute,
‘levels’ =>
CLogger::LEVEL_PROFILE,。而这条log是info的,所以不会执行,再下一个CWebLogRoute,’categories’
=> ‘test.*
‘,levels没指定,那就说不过滤,所以这个也会被执行,所以这条log将被输出到浏览器中。

使用行为,必须像前文描述的一样先把它附加到 yii\base\Component
类或其子类。一旦行为附加到组件,就可以直接使用它。

资源包指定为继承yii\web\AssetBundle的PHP类,包名为可自动加载的PHP类名,
在资源包类中,要指定资源所在位置,包含哪些CSS和JavaScript文件以及和其他包的依赖关系。

例如想安装 yiisoft/yii2-imagine 扩展,可按如下示例修改你的 composer.json
文件:

二、profile功能另外logger还有一个很强大的功能:profile,

行为附加到组件后,可以通过组件访问一个行为的公共成员变量或 getter 和
setter 方法定义的属性:

如下代码定义基础应用模板使用的主要资源包:

{ // ... "require": { // ... other dependencies "yiisoft/yii2-imagine": "*" }}
Yii::beginProfile;...code block being profiled...Yii::endProfile;
// "prop1" 是定义在行为类的属性echo $component->prop1;$component->prop1 = $value;类似地也可以调用行为的公共方法:// foo() 是定义在行为类的公共方法$component->foo();
如上AppAsset 类指定资源文件放在 @webroot 目录下,对应的URL为 @web,资源包中包含一个CSS文件 css/site.css,没有JavaScript文件, 依赖其他两个包 yii\web\YiiAsset 和 yii\bootstrap\BootstrapAsset, 关于yii\web\AssetBundle 的属性的更多详细如下所述: yii\web\AssetBundle::sourcePath: 指定包包含资源文件的根目录, 当根目录不能被Web访问时该属性应设置,否则,应设置 yii\web\AssetBundle::basePath 属性和yii\web\AssetBundle::baseUrl。 路径别名 可在此处使用; yii\web\AssetBundle::basePath: 指定包含资源包中资源文件并可Web访问的目录, 当指定yii\web\AssetBundle::sourcePath 属性, 资源管理器 会发布包的资源到一个可Web访问并覆盖该属性, 如果你的资源文件在一个Web可访问目录下,应设置该属性,这样就不用再发布了。 路径别名 可在此处使用。yii\web\AssetBundle::baseUrl: 指定对应到yii\web\AssetBundle::basePath目录的URL, 和 yii\web\AssetBundle::basePath 类似,如果你指定 yii\web\AssetBundle::sourcePath 属性, 资源管理器 会发布这些资源并覆盖该属性,路径别名 可在此处使用。yii\web\AssetBundle::js: 一个包含该资源包JavaScript文件的数组,注意正斜杠"/"应作为目录分隔符, 每个JavaScript文件可指定为以下两种格式之一: 相对路径表示为本地JavaScript文件 ,文件实际的路径在该相对路径前加上 yii\web\AssetManager::basePath,文件实际的URL在该路径前加上yii\web\AssetManager::baseUrl。 绝对URL地址表示为外部JavaScript文件,如 http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js 或//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js. yii\web\AssetBundle::css: 一个包含该资源包JavaScript文件的数组,该数组格式和 yii\web\AssetBundle::js 相同。 yii\web\AssetBundle::depends: 一个列出该资源包依赖的其他资源包。 yii\web\AssetBundle::jsOptions: 当调用yii\web\View::registerJsFile()注册该包 每个 JavaScript文件时, 指定传递到该方法的选项。 yii\web\AssetBundle::cssOptions: 当调用yii\web\View::registerCssFile()注册该包 每个 css文件时, 指定传递到该方法的选项。 yii\web\AssetBundle::publishOptions: 当调用yii\web\AssetManager::publish()发布该包资源文件到Web目录时 指定传递到该方法的选项,仅在指定了yii\web\AssetBundle::sourcePath属性时使用。资源位置资源根据它们的位置可以分为:源资源: 资源文件和PHP源代码放在一起,不能被Web直接访问,为了使用这些源资源,它们要拷贝到一个可Web访问的Web目录中 成为发布的资源,这个过程称为发布资源,随后会详细介绍。发布资源: 资源文件放在可通过Web直接访问的Web目录中;外部资源: 资源文件放在你的Web应用不同的Web服务器上;当定义资源包类时候,如果你指定了yii\web\AssetBundle::sourcePath 属性,就表示任何使用相对路径的资源会被 当作源资源;如果没有指定该属性,就表示这些资源为发布资源(因此应指定yii\web\AssetBundle::basePath 和 yii\web\AssetBundle::baseUrl 让Yii知道它们的位置)。推荐将资源文件放到Web目录以避免不必要的发布资源过程,这就是之前的例子指定 yii\web\AssetBundle::basePath 而不是 yii\web\AssetBundle::sourcePath.对于 扩展来说,由于它们的资源和源代码都在不能Web访问的目录下, 在定义资源包类时必须指定yii\web\AssetBundle::sourcePath属性。注意: yii\web\AssetBundle::sourcePath 属性不要用@webroot/assets,该路径默认为 yii\web\AssetManager资源管理器将源资源发布后存储资源的路径,该路径的所有内容会认为是临时文件, 可能会被删除。资源依赖当Web页面包含多个CSS或JavaScript文件时,它们有一定的先后顺序以避免属性覆盖, 例如,Web页面在使用jQuery UI小部件前必须确保jQuery JavaScript文件已经被包含了, 我们称这种资源先后次序称为资源依赖。资源依赖主要通过yii\web\AssetBundle::depends 属性来指定, 在AppAsset 示例中,资源包依赖其他两个资源包: yii\web\YiiAsset 和 yii\bootstrap\BootstrapAsset 也就是该资源包的CSS和JavaScript文件要在这两个依赖包的文件包含 之后 才包含。资源依赖关系是可传递,也就是人说A依赖B,B依赖C,那么A也依赖C。资源选项可指定yii\web\AssetBundle::cssOptions 和 yii\web\AssetBundle::jsOptions 属性来自定义页面包含CSS和JavaScript文件的方式, 这些属性值会分别传递给 yii\web\View::registerCssFile() 和 yii\web\View::registerJsFile() 方法, 在视图 调用这些方法包含CSS和JavaScript文件时。注意: 在资源包类中设置的选项会应用到该包中 每个 CSS/JavaScript 文件,如果想对每个文件使用不同的选项, 应创建不同的资源包并在每个包中使用一个选项集。例如,只想IE9或更高的浏览器包含一个CSS文件,可以使用如下选项:public $cssOptions = ['condition' => 'lte IE9'];

安装完成后,你应该能在 BasePath/vendor 目录下见到 yiisoft/yii2-imagine
目录。你也应该 见到另一个 imagine/imagine目录,在其中安装了所依赖的包。

这样就能测试这个code block的执行效率了,非常的方便啊。

如你所见,尽管 $component 未定义 prop1 和 foo()
,它们用起来也像组件自己定义的一样。

这会是包中的CSS文件使用以下HTML标签包含进来:

信息: yiisoft/yii2-imagine 是 Yii 由开发团队维护一个核心扩展,
所有核心扩展均由 Packagist 集中管理,命名为yiisoft/yii2-xyz,其中的
xyz,
不同扩展有不同名称。现在你可以使用安装好的扩展了,好比是应用的一部分。如下示例展示了如何使用
yiisoft/yii2-imagine 扩展 提供的yii\imagine\Image 类:

更详细的配置查看:

如果两个行为都定义了一样的属性或方法,并且它们都附加到同一个组件,那么首先附加上的行为在属性或方法被访问时有优先权。

为链接标签包含

use Yii;use yii\imagine\Image;// 生成一个缩略图Image::thumbnail('@webroot/img/test-image.jpg', 120, 120) ->save(Yii::getAlias('@runtime/thumb-test-image.jpg'), ['quality' => 50]);

然后还有一个很BUG的功能,Profiling SQL Executions

附加行为到组件时的命名行为,可以使用这个名称来访问行为对象,如下所示:

可使用如下代码:

信息: 扩展类由 Yii class autoloader 自动加载。手动安装扩展

很多时候sql语句写的不好会非常影响效率的,但是要确定哪一条语句影响了效率就需要profiling了。YII也提供了这个bug级别的功能。

$behavior = $component->getBehavior;
public $cssOptions = ['noscript' => true];

在极少情况下,你可能需要手动安装一部分或者全部扩展,而不是依赖
Composer。 想做到这一点,你应当:

三、Yii::log的使用首先在config文件中设置log

也能获取附加到这个组件的所有行为:

为使JavaScript文件包含在页面head区域(JavaScript文件默认包含在body的结束处)使用以下选项:

下载扩展压缩文件,解压到 vendor
目录。如果有,则安装扩展提供的自动加载器。按指导说明下载和安装所有依赖的扩展。如果扩展没有提供类的自动加载器,但也遵循了
PSR-4 standard 标准,那么你可以使用 Yii 提供的类自动加载器来加载扩展类。
你需要做的仅仅是为扩展的根目录声明一个 root alias。 例如,假设在
vendor/mycompany/myext 目录中安装了一个扩展,并且扩展类的命名空间为
myext , 那么你可以在应用配置文件中包含如下代码:

'log'=>array( 'class'=>'CLogRouter', 'routes'=>array( array( 'class'=>'CFileLogRoute',//这表示把日志输出到文件中,下方有详细的 'levels'=>'error, warning', ), array( 'class'=>'CWebLogRoute',//这表示把日志显示在网页下方,下方有详细的 'levels'=>'trace, info, error, warning', 'categories'=>'cool.*,system.db.*', ), ),),
$behaviors = $component->getBehaviors();
public $jsOptions = ['position' => \yii\web\View::POS_HEAD];
[ 'aliases' => [ '@myext' => '@vendor/mycompany/myext', ],]

CDbLogRoute: 将信息保存到数据库的表中。 CEmailLogRoute: 发送信息到指定的
Email 地址。 CFileLogRoute: 保存信息到应用程序 runtime
目录中的一个文件中。 CWebLogRoute: 将 信息 显示在当前页面的底部。
CProfileLogRoute: 在页面的底部显示概述信息。

要移除行为,可以调用 yii\base\Component::detachBehavior()
方法用行为相关联的名字实现:

Bower 和 NPM 资源

创建扩展

信息级别levels:

$component->detachBehavior;

$component->detachBehaviors();

大多数 JavaScript/CSS 包通过Bower 和/或 NPM管理,
如果你的应用或扩展使用这些包,推荐你遵循以下步骤来管理库中的资源:

在你需要将你的杰作分享给其他人的时候,你可能会考虑创建一个扩展。
扩展可包括任何你喜欢的代码,例如助手类、挂件、模块,等等。

trace: 这是在 Yii::trace 中使用的级别。它用于在开发中
跟踪程序的执行流程。 info: 这个用于记录普通的信息。 profile:
这个是性能概述。下面马上会有更详细的说明。 warning: 这个用于警告信息。
error: 这个用于致命错误信息。

修改应用或扩展的 composer.json 文件将包列入require 中,
应使用bower-asset/PackageName 或 npm-asset/PackageName
来对应库。创建一个资源包类并将你的应用或扩展要使用的JavaScript/CSS
文件列入到类中, 应设置 yii\web\AssetBundle::sourcePath
属性为@bower/PackageName 或 @npm/PackageName,
因为根据别名Composer会安装Bower或NPM包到对应的目录下。注意:
一些包会将它们分布式文件放到一个子目录中,对于这种情况,应指定子目录作为
yii\web\AssetBundle::sourcePath属性值,例如,yii\web\JqueryAsset使用
@bower/jquery/dist 而不是 @bower/jquery。使用资源包

建议你按照 Composer package 的条款创建扩展,以便其他人更容易安装和使用。

分类categories:

为使用资源包,在视图中调用yii\web\AssetBundle::register()方法先注册资源,
例如,在视图模板可使用如下代码注册资源包:

以下是将扩展创建为一个 Composer 软件包的需遵循的基本步骤。

可以自定义,但在输出函数里要对应才会被写入日志里(例如上边写的是 cool.*
和 system.db.* ,就会把相应分类的信息写入日志,请结合下文来理解)

use app\assets\AppAsset;AppAsset::register; // $this 代表视图对象

为你的扩展建一个工程,并将它存放在版本控制代码库中,例如 github.com 。
扩展的开发和维护都应该在这个代码库中进行。在工程的根目录下,建一个
Composer 所需的名为 composer.json 的文件。 在一个 Composer
代码库中注册你的扩展,比如在 Packagist 中,以便其他 用户能找到以及用
Composer 安装你的扩展。composer.json

设置完了,就可以用写入日志的函数来记录了:

如果在其他地方注册资源包,应提供视图对象,如在 小部件 类中注册资源包,
可以通过 $this->view 获取视图对象。

每个 Composer 软件包在根目录都必须有一个 composer.json
文件。该文件包含软件包的元数据。 你可以在 Composer手册
中找到完整关于该文件的规格。 以下例子展示了 yiisoft/yii2-imagine 扩展的
composer.json 文件。

Yii::trace('My log message.','cool.pd');//cool.pd属于cool.*分类,所以会被写入日志Yii::log('My log message.','info','cool.collectpd');//log定义级别为info,结合上文,第一个logclass会忽略,不会被写入文件,但会被第二个logclass接收,写入日志在网络下方显示。

当在视图中注册一个资源包时,在背后Yii会注册它所依赖的资源包,如果资源包是放在Web不可访问的目录下,会被发布到可访问的目录,
后续当视图渲染页面时,会生成这些注册包包含的CSS和JavaScript文件对应的 和

{ // package name "name": "yiisoft/yii2-imagine", // package type "type": "yii2-extension", "description": "The Imagine integration for the Yii framework", "keywords": ["yii2", "imagine", "image", "helper"], "license": "BSD-3-Clause", "support": { "issues": "https://github.com/yiisoft/yii2/issues?labels=ext%3Aimagine", "forum": "http://www.yiiframework.com/forum/", "wiki": "http://www.yiiframework.com/wiki/", "irc": "irc://irc.freenode.net/yii", "source": "https://github.com/yiisoft/yii2" }, "authors": [ { "name": "Antonio Ramirez", "email": "amigo.cobos@gmail.com" } ], // package dependencies "require": { "yiisoft/yii2": "*", "imagine/imagine": "v0.5.0" }, // class autoloading specs "autoload": { "psr-4": { "yii\\imagine\\": "" } }}

trace只会在调试模式下生效,即开启debug的时候trace能设置levels参数

包名

四、调试sql query每个语句执行的耗时在配置中的log下加上下面这个Route

每个 Composer
软件包都应当有一个唯一的包名以便能从其他的软件包中识别出来。
包名的格式为 vendorName/projectName 。例如在包名 yiisoft/yii2-imagine
中,vendor 名和 project 名分别是 yiisoft 和 yii2-imagine 。

//这个配置专门负责数据库操作的profile array( 'class'=>'CProfileLogRoute', 'levels' => CLogger::LEVEL_PROFILE, 'showInFireBug' => true, 'ignoreAjaxInFireBug' => true, 'categories' => 'system.db.* ', //只记录db的操作日志,其他的忽略 ),

不要用 yiisoft 作为你的 vendor 名,由于它被 Yii 的核心代码预留使用了。

然后在某个controller的某个action中加入:

我们推荐你用 yii2- 作为你的包名的前缀,表示它是 Yii 2
的扩展,例如,myname/yii2-mywidget。 这更便于用户辨别是否是 Yii 2
的扩展。

Yii::beginProfile; for{ $user = UserModel::model;//这里只要是数据库操作就行,这个只是个例子 }

包类型

Yii::endProfile;

将你的扩展指明为 yii2-extension 类型很重要,以便安装的时候
能被识别出是一个 Yii 扩展。

在浏览器中访问这个action,记得先打开firebug,然后firebug中就能看到如下图的记录:

当用户运行 composer install 安装一个扩展时,
vendor/yiisoft/extensions.php
文件会被自动更新使之包含新扩展的信息。从该文件中, Yii
应用程序就能知道安装了 哪些扩展 (这些信息可通过
yii\base\Application::extensions 访问)。

相同的query会进行归类,计算total和average,这个对于分析还是非常有帮助的。

依赖

也可以将db的日志写到文件,配置如下(不建议使用,还是到浏览器用firebug方便):

你的扩展依赖于 Yii 。因此你应当在 composer.json 文件中列出它
。如果你的扩展还依赖其他的扩展或者是第三方库,你也要一并列出来。
确定你也为每一个依赖的包列出了适当的版本约束条件 。
当你发布一个稳定版本时,你所依赖的包也应当使用稳定版本。

array( 'class'=>'CFileLogRoute', 'levels' => CLogger::LEVEL_PROFILE, 'categories' => 'system.db.* ', //只记录db的操作日志,其他的忽略 'logFile'=>'db.log', ),

大多数 JavaScript/CSS 包是用 Bower 来管理的,而非 Composer。你可使用
Composer asset 插件 使之可以 通过 Composer
来管理这类包。如果你的扩展依赖 Bower 软件包,你可以如下例所示那样简单地
在 composer.json 文件的依赖中列出它。

当然,想要生效还得有下面两步配置:

{ // package dependencies "require": { "bower-asset/jquery": ">=1.11.*" }}

1 . 记得在index.php, 中加入以下配置

上述代码表明该扩展依赖于 jquery Bower 包。一般来说,你可以在
composer.json 中用 bower-asset/PackageName 指定 Bower 包,用
npm-asset/PackageName 指定 NPM 包。 当 Compower 安装 Bower 和 NPM
软件包时,包的内容默认会分别安装到@vendor/bower/PackageName 和
@vendor/npm/Packages 下。这两个目录还可以分别用 @bower/PackageName
和@npm/PackageName 别名指向。

$yii = dirname.'/../yii/framework/yii.php';$config = dirname.'/protected/config/main.php';defined or define;defined('YII_DEBUG_SHOW_PROFILER') or define('YII_DEBUG_SHOW_PROFILER',true);//enable profilingdefined('YII_DEBUG_PROFILING') or define('YII_DEBUG_PROFILING',true);//trace leveldefined or define;//execution timedefined('YII_DEBUG_DISPLAY_TIME') or define('YII_DEBUG_DISPLAY_TIME',false);require_once;Yii::createWebApplication;

类的自动加载

  1. 在main.php主配置文件里面,的components db
    里将enableProfiling设置为true

    ‘components’ => array(‘db’ => array( ‘enableProfiling’ => true, //这个是用来记录日志的,会记录每一条语句执行的时间 ‘enableParamLogging’ => true,//true表示包括sql语句的参数在内的信息都会记录到日志里,非常详细 ),)

为使你的类能够被 Yii 的类自动加载器或者 Composer
的类自动加载器自动加载,你应当在 composer.json 中指定 autoload
条目,如下所示:

{ // .... "autoload": { "psr-4": { "yii\\imagine\\": "" } }}

你可以列出一个或者多个根命名空间和它们的文件目录。

当扩展安装到应用中后,Yii 将为每个所列出根命名空间创建一个 别名
指向命名空间对应的目录。 例如,上述的 autoload 条目声明将对应于别名
@yii/imagine。

推荐的做法

扩展意味着会被其他人使用,你在开发中通常需要额外的付出。
下面我们介绍一些通用的及推荐的做法,以创建高品质的扩展。

命名空间

为避免冲突以及使你的扩展中的类能被自动加载,你的类应当使用命名空间,
并使类的命名符合 PSR-4 standard 或者 PSR-0 standard 标准。

你的类的命名空间应以 vendorName\extensionName 起始,其中 extensionName
和项目名相同,除了它没有 yii2- 前缀外。例如,对 yiisoft/yii2-imagine
扩展 来说,我们用 yii\imagine 作为它的类的命名空间。

不要使用 yii、yii2 或者 yiisoft 作为你的 vendor 名。这些名称已由 Yii
内核代码预留使用了。

类的自举引导

有时候,你可能想让你的扩展在应用的 自举过程 中执行一些代码。
例如,你的扩展可能想响应应用的 beginRequest 事件,做一些环境的设置工作。
虽然你可以指导扩展的使用者显式地将你的扩展中的事件句柄附加到
beginRequest 事件, 但是更好的方法是自动完成。

为实现该目标,你可以创建一个所谓 bootstrapping class 实现
yii\base\BootstrapInterface 接口。 例如,

namespace myname\mywidget;use yii\base\BootstrapInterface;use yii\base\Application;class MyBootstrapClass implements BootstrapInterface{ public function bootstrap { $app->on(Application::EVENT_BEFORE_REQUEST, function () { // do something here }); }}

然后你将这个类在 composer.json 文件中列出来,如下所示,

{ // ... "extra": { "bootstrap": "myname\\mywidget\\MyBootstrapClass" }}

当这个扩展安装到应用后,Yii 将在每一个请求的自举过程中
自动实例化自举类并调用其 yii\base\BootstrapInterface::bootstrap()
方法。

操作数据库

你的扩展可能要存取数据库。不要假设使用你的扩展的应用总是用 Yii::$db
作为数据库连接。你应当在需要访问数据库的类中申明一个 db 属性。
这个属性允许你的扩展的用户可定制你的扩展使用哪个 DB 连接。例如,
你可以参考 yii\caching\DbCache 类看一下它是如何申明和使用 db 属性的。

如果你的扩展需要创建特定的数据库表,或者修改数据库结构,你应当

提供 数据迁移
来操作数据库的结构修改,而不是使用SQL文本文件;尽量使迁移文件适用于不同的
DBMS;在迁移文件中避免使用 Active Record。使用 Assets

如果你的扩展是挂件或者模块类型,它有可能需要使用一些 assets 。
例如,一个模块可能要显示一些包含图片,JavaScript 和 CSS
的页面。因为扩展的文件 都是放在同一个目录之下,安装之后 Web
无法读取,你有两个选择使得这些 asset 文件目录 可以通过 Web 读取:

让扩展的用户手动将这些 asset 文件拷贝到特定的 Web
可以读取的文件夹;申明一个 asset bundle 并依靠 asset
发布机制自动将这些文件 拷贝到 Web
可读的文件夹。我们推荐你使用第二种方法,以便其他人能更容易使用你的扩展。

国际化和本地化

你的扩展可能会在支持不同语言的应用中使用!因此,如果你的扩展要显示内容给终端用户,
你应当试着实现 国际化和本地化,特别地,

如果扩展为终端用户显示信息,这些信息应该用 Yii::t()
包装起来,以便可以进行翻译。
只给开发者参考的信息不需要做翻译。如果扩展显示数字、日期等,你应该用
yii\i18n\Formatter 中适当的格式化规则做格式化处理。

测试

你一定想让你的扩展可以无暇地运行而不会给其他人带来问题和麻烦。为达到这个目的,
你应当在公开发布前做测试。

推荐你创建测试用例,做全面覆盖的测试你的扩展,而不只是依赖于手动测试。
每次发布新版本前,你只要简单地运行这些测试用例确保一切完好。 Yii
提供了测试支持,使你更容易写单元测试、验收测试和功能测试。

版本控制

你应该为每一个扩展定一个版本号。我们推荐你命名版本号时参照 semantic
versioning 决定用什么样的版本号。

发布

为使其他人知道你的扩展,你应该公开发布。

如果你首次发布一个扩展,你应该在 Composer 代码库中注册它,例如
Packagist。之后,你所需要做的仅仅是在 版本管理库中创建一个 tag
,然后通知 Composer 代码库。 其他人就能查找到这个新的发布了,并可通过
Composer 代码库安装和更新该扩展。

在发布你的扩展时,除了代码文件,你还应该考虑包含如下内容
帮助其他人了解和使用你的扩展:

根目录下的 readme 文件:它描述你的扩展是干什么的以及如何安装和使用。
我们推荐你用 Markdown 的格式
来写并将文件命名为readme.md。根目录下的修改日志文件:它列举每个版本的发布做了哪些更改。该文件可以用
Markdown 根式 编写并命名为
changelog.md。根目录下的升级文件:它给出如何从其他就版本升级该扩展的指导。该文件可以用
Markdown 根式 编写并命名为
changelog.md。入门指南、演示代码、截屏图示等:如果你的扩展提供了许多功能,在
readme 文件中不能完整 描述时,就要用到这些文件。API
文档:你的代码应当做好文档,让其他人更容易阅读和理解。 你可以参照 Object
class file 学习如何为你的代码做文档。信息:你的代码注释可以写成 Markdown
格式。yiisoft/yii2-apidoc 扩展为你提供了一个从你的 代码注释生成漂亮的
API 文档。

信息:虽然不做要求,我们还是建议你的扩展遵循某个编码规范。 你可以参照
core framework code style。核心扩展

Yii 提供了下列核心扩展,由 Yii 开发团队开发和维护。这些扩展全都在
Packagist 中注册:

yiisoft/yii2-apidoc: 提供了一个可扩展的、高效的 API
文档生成器。核心框架的 API 文档也是用它生成的。 yiisoft/yii2-authclient:
提供了一套常用的认证客户端,例如 Facebook OAuth2 客户端、GitHub OAuth2
客户端。 yiisoft/yii2-bootstrap: 提供了一套挂件,封装了 Bootstrap
的组件和插件。 yiisoft/yii2-codeception: 提供了基于 Codeception
的测试支持。 yiisoft/yii2-debug: 提供了对 Yii
应用的调试支持。当使用该扩展是, 在每个页面的底部将显示一个调试工具条。
该扩展还提供了一个独立的页面,以显示更详细的调试信息。
yiisoft/yii2-elasticsearch: 提供对 Elasticsearch
的使用支持。它包含基本的查询/搜索支持, 并实现了 Active Record
模式让你可以将活动记录 存储在 Elasticsearch 中。 yiisoft/yii2-faker:
提供了使用 Faker 的支持,为你生成模拟数据。 yiisoft/yii2-gii:
提供了一个基于页面的代码生成器,具有高可扩展性,并能用来快速生成模型、
表单、模块、CRUD等。 yiisoft/yii2-imagine: 提供了基于 Imagine
的常用图像处理功能。 yiisoft/yii2-jui: 提供了一套封装 JQuery UI
的挂件以及它们的交互。 yiisoft/yii2-mongodb: 提供了对 MongoDB
的使用支持。它包含基本
的查询、活动记录、数据迁移、缓存、代码生成等特性。 yiisoft/yii2-redis:
提供了对 redis 的使用支持。它包含基本的 查询、活动记录、缓存等特性。
yiisoft/yii2-smarty: 提供了一个基于 Smarty 的模板引擎。
yiisoft/yii2-sphinx: 提供了对 Sphinx 的使用支持。它包含基本的
查询、活动记录、代码生成等特性。 yiisoft/yii2-swiftmailer: 提供了基于
swiftmailer 的邮件发送功能。 yiisoft/yii2-twig: 提供了一个基于 Twig
的模板引擎。

发表评论

电子邮件地址不会被公开。 必填项已用*标注