本章将列出自1.1版本以来Yii 2.0的主要变化

文章转自:http://www.zhihu.com/question/22924271


本章将列出自1.1版本以来Yii 2.0的主要变化。


命名空间(Namespace)
Yii 2.0最明显的改变是对命名空间的使用。几乎所有的核心类都使用了命名空间,比如yii\web\Request。同时,类名前不再使用“C”前缀。命名空间的命名遵循目录结构,如yii\web\Request代表的相应类文件是位于Yii 框架的目录下的 web/Request.php。由于Yii的类装载机制,可以在未显示包含类文件的情况下使用任意的核心类。


组件(Component)和对象(Object)
Yii 2.0将1.1版本中的CComponent类拆分成两个类:[[yii\base\Object]] 和 [[yii\base\Component]]。其中,[[yii\base\Object|Object]]类是一个轻量级的基类,它通过getter 和setter提供了定义类属性(property)的方法。[[yii\base\Component|Component]]继承自[[yii \base\Object|Object]],并提供对事件(event)和行为(behavior)的支持。


如果自定义类不需要事件或行为特性,可考虑使用Object 作为基类。这通常用于表示基础的数据结构。


对象配置Object Configuration
[[yii\base\Object|Object]]对配置对象引入了一个规范的方法。其后代类可以在需要的情况下通过如下的方式声明一个构造函数,那么该类就可以被正确的配置:
class MyClass extends \yii\base\Object
{
    function __construct($param1, $param2, $config = [])
    {
        // ... initialization before configuration is applied


        parent::__construct($config);
    }


    public function init ()
    {
        parent::init();


        // ... initialization after configuration is applied
    }
}


上面代码中,构造函数据的最后一个形参必须是接收一下包含键值对的配置数组,用于在初始化类的属性。可以重载[[yii\base\Object::init()|init()]]方法以在配置后执行初始化工作。


按照如下的约定,可以用配置数组创建一个新对象:
$object = Yii::createObject([
    'class' => 'MyClass',
    'property1' => 'abc',
    'property2' => 'cde',
], $param1, $param2);


事件(Events)
在Yii 2.0中,不再需要定义一个以on为前缀的方法作为事件,而是可以作用任意的事件名称。要将一个事件处理函数handler绑定到一个事件,可以使用如下的on方法:
$component->on($eventName, $handler);
// To detach the handler, use:
// $component->off($eventName, $handler);


在绑定一个handler时,可以关联一些参数,以便于handler在后续处理时可以通过事件参数访问:
$component->on($eventName, $handler, $params);


由于这一改变,现在可以使用一些“全局”的事件。只需简单地触发和绑定一个事件到application实例上:
Yii::$app->on($eventName, $handler);
....
// this will trigger the event and cause $handler to be invoked.
Yii::$app->trigger($eventName);


如果需要处理一个类的所有实例上的事件,可以使用如下方法绑定事件:
Event::on(ActiveRecord::className(), ActiveRecord::EVENT_AFTER_INSERT, function ($event) {
    Yii::trace(get_class($event->sender) . ' is inserted.');
});


上面的代码定义了一个handler,他会在每个Active Record对象的EVENT_AFTER_INSERT事件发生时被触发。


路径别名(Path Alias)
Yii 2.0扩大了对路径别名的使用,包含文件目录和URL。一个别名需以@字符开头,以便与文件目录路径和URL区别开来。比如,@yii代表Yii的安装路径。在Yii的核心代码中,路径别名都是支持的。比如FileCache::cachePath既可以作用于路径别名也可以作用于正常的文件路径。


路径别名还与类的命名空间紧密关联。建议为每个根命名空间定义一个别名,如此可以利用Yii的类装载机制加载类而不需要额外的配置。比如,由于@yii代表了Yii的安装路径,一个诸如yii\web\Request的类就可以被Yii自动装载。如果使用了Zend Framework等第三方库,可以定义一个@Zend的路径别名来指向其安装目录,那么Yii可以自动加载该库中的所有类。


视图(View)
Yii 2.0引入了一个[[yii\web\View|View]]视图类以代表MVC模式中的V部分。可以在全局层面上通过application的“view”组件进行配置。也可以在视图文件中通过$this访问。与1.1版本相比,这是最大的变经之一:视图文件中的$this不再是一个控制器(controller)或一个挂件(widget)。


由于可以通过应用的“view”组件访问视图对象,因此可以在任意代码中渲染一个视图文件,而不再局限于controller或widget中。如下:
$content = Yii::$app->view->renderFile($viewFile, $params);
// You can also explicitly create a new View instance to do the rendering
// $view = new View;
// $view->renderFile($viewFile, $params);


同时,Yii 2.0中不再有CClientScript,[[yii\web\View|View]]类取代了它的角色,这是一个显著的改进。


Yii 2.0继续使用PHP作为其主要的模板(template)语言,同时还有两个官方的扩展(extension)以支持当前主流的两个模板引擎:Smarty和Twig。而Prado模板引擎不再支持。使用这些模板引擎,只需使用tpl或twig作为文件名的后缀,即可支持Smarty视图或Twig视图。还可以通过设置[[yii\web\View::$renderers|View::$renderers]]属性以使用其他模板引擎。


模型(Models)
现在,一个模型是与其一个表单通过其[[yii\base\Model::formName()|formName()]]方法返回的表单名紧密关联的。这通常用于收集用户在HTML表单上的输入。之前在1.1版本中,通常以硬编码为类名的方式设计模型。


引入了[[yii\base\Model::load()|load()] 和 [[yii\base\Model::loadMultiple()|Model::loadMultiple()]]两个新的方法用于简化将用户输入的数据填充到一个模型中。比如:
$model = new Post;
if ($model->load($_POST)) {...}
// which is equivalent to:
if (isset($_POST['Post'])) {
    $model->attributes = $_POST['Post'];
}


$model->save();


$postTags = [];
$tagsCount = count($_POST['PostTag']);
while ($tagsCount-- > 0) {
    $postTags[] = new PostTag(['post_id' => $model->id]);
}
Model::loadMultiple($postTags, $_POST);


Yii 2.0引入了[[yii\base\Model::scenarios()|scenarios()]]新方法,用以声明哪些属性 (attributes)在哪些场景下需要验证。子类需重载[[yii\base\Model::scenarios()|scenarios()]]方 法,并返一个包含场景及相应需要验证的属性的列表,以供调用[[yii\base\Model::validate()|validate()]]时使 用。如:
public function scenarios()
{
    return [
        'backend' => ['email', 'role'],
        'frontend' => ['email', '!name'],
    ];
}


同时,这个方法也明确了哪些属性是安全的,哪些是不安全的。在实际操作中,给定一个场景,如果一个属性出现在[[yii\base\Model::scenarios()|scenarios()]]返回的列表中,且其名称没有加!的前缀,则其可视为 safe。


因此,Yii 2.0中不再有“unsafe”验证器(validator)。


如果一个模型仅有一个应用场景,这很常见,则需一定非要重载[[yii\base\Model::scenarios()|scenarios()]],然后一切都会现原先在1.1版本中的方式一样。


控制器(Controllers)
[[yii\base\Controller::render()|render()]]和[[yii\base \Controller::renderPartial()|renderPartial()]]方法现在返回渲染后的结果,而不再是直接发送出去给用 户。因此,需要显式的用echo将结果发送出去。如:echo $this->render(...);。


挂件Widgets
在2.0版本中,使用挂件将更为直接。主要使用[[yii\base\Widget|Widget]]类的[[yii\base \Widget::begin()|begin()]],[[yii\base\Widget::end()|end()]] 和 [[yii\base\Widget::widget()|widget()]]方法。如:
// Note that you have to "echo" the result to display it
echo \yii\widgets\Menu::widget(['items' => $items]);


// Passing an array to initialize the object properties
$form = \yii\widgets\ActiveForm::begin([
    'options' => ['class' => 'form-horizontal'],
    'fieldConfig' => ['inputOptions' => ['class' => 'input-xlarge']],
]);
... form inputs here ...
\yii\widgets\ActiveForm::end();


原先在1.1版本中,需要在CBaseController类的beginWidget(),endWidget()和widget()方法中将挂件的类名以字符串的形式传入。而2.0版本使用的方法对于IDE而言,更为友好。


主题(Themes)
在2.0版本中,主题以完全不同的方式运转。现在以一种将路径名映射、翻译为某主题的视图源文件的方式运转。比如,对主题的路径映射为['/web/views' => '/web/themes/basic'],那么,其主题化后的视图文件/web/views/site/index.php将变成/web/themes/basic/site/index.php。


因此,主题可以应用于任意视图文件,甚至是在控件器和挂件之外渲染的视图。


也不在有CThemeManager,相应地,theme成为应用的view组件的一个可设置的属性。


命令行应用(Console Applications)
命令行应用现和Web应用一样由控件器组成。事实上,命令行控制器和Web控制器共用相同的控制器基类。


每个命令行控制器就像1.1版本中的CConsoleCommand,包含一个或多个action。可以使用yii <route>命令执行一个命令行命令, <route>代表一个控件器路由(如sitemap/index)。额外的匿名参数会被传递给相应的控制器中的action方法。而命名参数被视为像globalOptions()中的全局参数一样。


Yii 2.0支持自动从注释块中生成一个命令的帮助信息。


图际化(I18N)
Yii 2.0中删除了数据和数字格式化器,而合用了PHP的PECL和intl模块。


消息翻译仍通过应用的“i18n”组件支持。该组件管理了一系列的消息源,并允许根据消息的不同类别使用不同的消息源。


过滤器(Action Filters)
Action过滤器已经改由行为(behavior)来实现。可以通过继承 [[yii\base\ActionFilter]] 来定义新的过滤器。使用一个过滤器,可以将一个过滤器类作为行为绑定到一个控制器。如,要使用[[yii\web\AccessControl]]过滤器 可以在控制器中进行如下编码:
public function behaviors()
{
    return [
        'access' => [
            'class' => 'yii\web\AccessControl',
            'rules' => [
                ['allow' => true, 'actions' => ['admin'], 'roles' => ['@']],
            ),
        ),
    );
}


资源(Assets)
Yii 2.0引入了一个asset bundle的新概念。就像1.1版本中的脚本包(由CClientScript管理)一样,但是更高级。


一个资源包是一些资源文件在一个目录下的集合,始JavaScript文件、CSS文件、图片等。每个资源包由一个继承自[[yii\web \AssetBundle]]的类来表征。使用[[yii\web\AssetBundle::register()]]来注册一个资源包,可以使资源包 中的资源可以通过Web访问,且当前的页面会自动地将包中的JavaScript和CSS文件引入进来。


静态工具类(Static Helpers)
Yii 2.0引入了诸多常用的静态工具类,如[[yii\helpers\Html|Html]],[[yii\helpers \ArrayHelper|ArrayHelper]],[[yii\helpers\StringHelper|StringHelper]], [[yii\helpers\FileHelper|FileHelper]], [[yii\helpers\Json|Json]], [[yii\helpers\Security|Security]]这些类都设计成易于继承,尽管静态类由于固定的类名引用而通常不易继承。但是Yii 2.0引入了类映射(利用[[Yii::$classMap]])来克服这个困难。


Yii 2.0引入了field的概念用于通过[[yii\widgets\ActiveForm]]创建的表单。一个字段就是 一个包含了一个标签、一个input控件和一个错误信息/提示文本的容器,以[[yii\widgets \ActiveField|ActiveField]]类对象表示。使用字段,可以更简洁的创建表单:
<?php $form = yii\widgets\ActiveForm::begin(); ?>
    <?= $form->field($model, 'username') ?>
    <?= $form->field($model, 'password')->passwordInput() ?>
    <div class="form-group">
        <?= Html::submitButton('Login') ?>
    </div>
<?php yii\widgets\ActiveForm::end(); ?>


查询构建器(Query Builder)
在1.1版本中,数据库查询的构建被分散到几个类中,如CDbCommand,CDbCriteria和CDbCommandBuilder。Yii 2.0使用 [[yii\db\Query|Query]]表示数据库查询,并使用[[yii\db\QueryBuilder|QueryBuilder]]从query对象生成SQL语句。如,
$query = new \yii\db\Query;
$query->select('id, name')
      ->from('tbl_user')
      ->limit(10);


$command = $query->createCommand();
$sql = $command->sql;
$rows = $command->queryAll();


更难得的,这个构建查询的方法可以与下面的[[yii\db\ActiveRecord|ActiveRecord]]搭配。


[[yii\db\ActiveRecord|ActiveRecord]]在Yii 2.0中经历了显著的变更。最为重要的方面是关联ActiveRecord查询。在1.1版本中,需要在relations() 方法中声明关系。而在2.0中,改为由一个返回[[yii\db\ActiveQuery|ActiveQuery]] 对象的getter方法来完成。比如,以下的方法声明了一个关于订单的关系:
class Customer extends \yii\db\ActiveRecord
{
    public function getOrders()
    {
        return $this->hasMany('Order', ['customer_id' => 'id']);
    }
}


可以使用$customer->orders以访问用户的订单。还可以用$customer->getOrders()->andWhere('status=1')->all()来实现一个基于自定义条件的实时的关系查询。


在预先载入关系记录的方式上,Yii 2.0与1.1版本完全不同。在实际操作中,1.1版本使用一个JOIN查询以返回主记录和关联记录,而在2.0版本中,使用了两个SQL语句而非一个JOIN查询:第一个语句返回主记录,第二个语句返回与主记录主键关联的关联记录。


Yii 2.0不再使用model()方法来执行查询,而改用[[yii\db\ActiveRecord::find()|find()]]方法:
// to retrieve all *active* customers and order them by their ID:
$customers = Customer::find()
    ->where(['status' => $active])
    ->orderBy('id')
    ->all();
// return the customer whose PK is 1
$customer = Customer::find(1);


[[yii\db\ActiveRecord::find()|find()]]方法返回一个[[yii\db \ActiveQuery|ActiveQuery]]实例,注意该[[yii\db\ActiveQuery|ActiveQuery]]是[[yii \db\Query]]的子类。因此,可以对其使用[[yii\db\Query]]的所有查询方法。


如果不想返回一个ActiveRecord对象,可以调用[[yii\db\ActiveQuery::asArray()|ActiveQuery::asArray()]]以返回一个数组。这会提高效率,特别是需要返回大量记录的时候:
$customers = Customer::find()->asArray()->all();


默认地,ActiveRecord现在只保存改变了的属性值。在1.1版本中,当调用save()时,所有的属性都被保存到数据库中,而不管是属性值是否有改变,除非显式地列出要保存的属性。


查询范围(Scope)现在不再定义于模型中,而是定义于自定义的[[yii\db\ActiveQuery|ActiveQuery]]类中。


自动引用表名和列名
Yii 2.0支持自动引用数据库的表名和列名。一个由双花括号括起来的命名视为表名,双方括号括起来的视为列名。其引用的结果取决于所使用的数据库驱动:
$command = $connection->createCommand('SELECT [[id]] FROM {{posts}}');
echo $command->sql;  // MySQL: SELECT `id` FROM `posts`


这个特性在开发支持各种不同DBMS的应用时格外有用。


用户及认证接口
1.1版本中的CWebUser现在被[[yii\web\User]]所取代,而且不再有CUserIdentity 类。更为直接的,通过实现[[yii\web\IdentityInterface]]接口。这在高级模板中有实例。


URL管理 
URL管理与1.1版本一样,一个主要的加强是对于可选参数的支持。比如,如下规则匹配post/popular和post/1/popular。在1.1版本中,需要写2个规则来达到这一目的。
[
    'pattern' => 'post/<page:\d+>/<tag>',
    'route' => 'post/index',
    'defaults' => ['page' => 1],
]


与Composer整合
Yii完全地与Composer这一PHP包管理器整合,这解决了依赖问题,并保持代码不过时,半自动地更新、管理第三方库自动加载不管理其使用的是何种自动加载机制。

基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值