Yii2 技術點簡介(很好的)

我不得不說這篇文章太好了,只不過需要自己翻譯

命名空間

Yii 2.0 最顯著的改變是使用了命名空間。幾乎每一個核心類都使用了命名空間,例如 yii\web\Request。“C”前綴不再用於類名。命名空間的命名遵循目錄結構。例如 yii\web\Request 指的是在 Yii 框架目錄下的 web/Request.php 文件。

(由於有了類加載器,您也可以通過 Yii 類加載器調用未嚴格引用的類文件。)

組件和對象

Yii 2.0 將 Yii 1.1 中的 CComponent 一分爲二: yii\base\Object 和yii\base\Component。Object 類是一個輕量基類,允許通過 getter 和 setter 定義類屬性。Component 類繼承自 Object 並且支持 事件 和 行爲.

若你的類不需要事件或行爲特性,則應當考慮使用 Object 作爲基類。This is usually the case for classes that represent basic data structures.

對象(Object)配置

Object 類展示了配置類的通用方法。任何繼承自 Object 的類都應當聲明構造函數(如有必要)以便其能夠正確配置,如下所示:

class MyClass extends \yii\base\Object{
    public function __construct($param1, $param2, $config = [])
    {
        // ... initialization before configuration is applied

        parent::__construct($config);
    }

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

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

上面這段代碼中構造函數的最後一個參數 $config 必須爲數組,該數組包含了“名稱-值”對,用於在構造函數結尾初始化屬性。你可以覆蓋 init() 方法,以便應用配置後自行完成初始化工作。

By following this convention, you will be able to create and configure new objects using a configuration array:

$object = Yii::createObject([
    'class' => 'MyClass',
    'property1' => 'abc',
    'property2' => 'cde',
], [$param1, $param2]);

More details about configurations can be found in the Object Configurations section.

事件

In Yii 1, events were created by defining an on-method (e.g.,onBeforeSave). In Yii 2, you can now use any event name. You trigger an event by calling the trigger() method:

$event = new \yii\base\Event;
$component->trigger($eventName, $event);

To attach a handler to an event, use the on() method:

$component->on($eventName, $handler);
// To detach the handler, use:
// $component->off($eventName, $handler);

There are many enhancements to the event features. For more details, please refer to the Events section.

路徑別名

Yii 2.0 將路徑別名的用法擴展爲同時支持“文件/目錄”路徑和“URL”。Yii 2.0 的別名同樣需要以 @ 字符開頭,以便能夠將“文件/目錄”路徑和“URL”區分開。例如,別名 @yii 指的是 Yii 安裝目錄。 Path aliases are supported in most places in the Yii core code. For example,yii\caching\FileCache::$cachePath can take both a path alias and a normal directory path.

A path alias is also closely related to a class namespace. It is recommended that a path alias be defined for each root namespace, thereby allowing you to use Yii class autoloader without any further configuration. For example, because @yii refers to the Yii installation directory, a class like yii\web\Request can be autoloaded. If you use a third party library, such as the Zend Framework, you may define a path alias @Zend that refers to that framework’s installation directory. Once you’ve done that, Yii will be able to autoload any class in that Zend Framework library, too.

More on path aliases can be found in the Aliases section.

視圖

The most significant change about views in Yii 2 is that the special variable $this in a view no longer refers to the current controller or widget. Instead, $this now refers to a view object, a new concept introduced in 2.0. The view object is of type yii\web\View, which represents the view part of the MVC pattern. If you want to access the controller or widget in a view, you can use $this->context.

To render a partial view within another view, you use $this->render(), not $this->renderPartial(). The call to render also now has to be explicitly echoed, as the render() method returns the rendering result, rather than directly displaying it. For example:

echo $this->render('_item', ['item' => $item]);

Besides using PHP as the primary template language, Yii 2.0 is also equipped with official support for two popular template engines: Smarty and Twig. The Prado template engine is no longer supported. To use these template engines, you need to configure the view application component by setting the View::$renderers property. Please refer to theTemplate Engines section for more details.

模型

Yii 2.0 uses yii\base\Model as the base model, similar to CModel in 1.1. The class CFormModel has been dropped entirely. Instead, in Yii 2 you should extend yii\base\Model to create a form model class.

Yii 2.0 introduces a new method called scenarios() to declare supported scenarios, and to indicate under which scenario an attribute needs to be validated, can be considered as safe or not, etc. For example:

public function scenarios()
{
    return [
        'backend' => ['email', 'role'],
        'frontend' => ['email', '!role'],
    ];
}

In the above, two scenarios are declared: backend and frontend. For thebackend scenario, both the email and role attributes are safe, and can be massively assigned. For the frontend scenario, email can be massively assigned while role cannot. Both email and role should be validated using rules.

The rules() method is still used to declare the validation rules. Note that due to the introduction of scenarios(), there is no longer an unsafevalidator.

In most cases, you do not need to override scenarios() if the rules()method fully specifies the scenarios that will exist, and if there is no need to declare unsafe attributes.

To learn more details about models, please refer to the Models section.

控制器

Yii 2.0 uses yii\web\Controller as the base controller class, which is similar to CController in Yii 1.1. yii\base\Action is the base class for action classes.

The most obvious impact of these changes on your code is that a controller action should return the content that you want to render instead of echoing it:

public function actionView($id)
{
    $model = \app\models\Post::findOne($id);
    if ($model) {
        return $this->render('view', ['model' => $model]);
    } else {
        throw new \yii\web\NotFoundHttpException;
    }
}

Please refer to the Controllers section for more details about controllers.

小部件

Yii 2.0 uses yii\base\Widget as the base widget class, similar to CWidgetin Yii 1.1.

To get better support for the framework in IDEs, Yii 2.0 introduces a new syntax for using widgets. The static methods begin()end(), andwidget() have been introduced, to be used like so:

use yii\widgets\Menu;
use yii\widgets\ActiveForm;

// Note that you have to "echo" the result to display it
echo Menu::widget(['items' => $items]);

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

Please refer to the Widgets section for more details.

主題

Themes work completely differently in 2.0. They are now based on a path mapping mechanism that maps a source view file path to a themed view file path. For example, if the path map for a theme is['/web/views' => '/web/themes/basic'], then the themed version for the view file /web/views/site/index.php will be/web/themes/basic/site/index.php. For this reason, themes can now be applied to any view file, even a view rendered outside of the context of a controller or a widget.

Also, there is no more CThemeManager component. Instead, theme is a configurable property of the view application component.

Please refer to the Theming section for more details.

控制檯應用程序

Console applications are now organized as controllers, like Web applications. Console controllers should extend fromyii\console\Controller, similar to CConsoleCommand in 1.1.

To run a console command, use yii <route>, where <route> stands for a controller route (e.g. sitemap/index). Additional anonymous arguments are passed as the parameters to the corresponding controller action method, while named arguments are parsed according to the declarations in yii\console\Controller::options().

Yii 2.0 supports automatic generation of command help information from comment blocks.

Please refer to the Console Commands section for more details.

國際化(I18n)

Yii 2.0 removes the built-in date formatter and number formatter pieces in favor of the PECL intl PHP module.

Message translation is now performed via the i18n application component. This component manages a set of message sources, which allows you to use different message sources based on message categories.

Please refer to the Internationalization section for more details.

動作過濾

Action filters are implemented via behaviors now. To define a new, custom filter, extend from yii\base\ActionFilter. To use a filter, attach the filter class to the controller as a behavior. For example, to use theyii\filters\AccessControl filter, you would have the following code in a controller:

public function behaviors()
{
    return [
        'access' => [
            'class' => 'yii\filters\AccessControl',
            'rules' => [
                ['allow' => true, 'actions' => ['admin'], 'roles' => ['@']],
            ],
        ],
    ];
}

Please refer to the Filtering section for more details.

資產

Yii 2.0 introduces a new concept called asset bundle that replaces the script package concept found in Yii 1.1.

An asset bundle is a collection of asset files (e.g. JavaScript files, CSS files, image files, etc.) within a directory. Each asset bundle is represented as a class extending yii\web\AssetBundle. By registering an asset bundle via yii\web\AssetBundle::register(), you make the assets in that bundle accessible via the Web. Unlike in Yii 1, the page registering the bundle will automatically contain the references to the JavaScript and CSS files specified in that bundle.

Please refer to the Managing Assets section for more details.

助手

Yii 2.0 introduces many commonly used static helper classes, including.

Please refer to the Helper Overview section for more details.

表單

Yii 2.0 introduces the field concept for building a form usingyii\widgets\ActiveForm. A field is a container consisting of a label, an input, an error message, and/or a hint text. A field is represented as anActiveField object. Using fields, you can build a form more cleanly than before:

<?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(); ?>

Please refer to the Creating Forms section for more details.

查詢構建器

In 1.1, query building was scattered among several classes, includingCDbCommandCDbCriteria, and CDbCommandBuilder. Yii 2.0 represents a DB query in terms of a Query object that can be turned into a SQL statement with the help of QueryBuilder behind the scene. For example:

$query = new \yii\db\Query();
$query->select('id, name')
      ->from('user')
      ->limit(10);

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

Best of all, such query building methods can also be used when working with Active Record.

Please refer to the Query Builder section for more details.

活動記錄(Active Record)

Yii 2.0 introduces a lot of changes to Active Record. The two most obvious ones involve query building and relational query handling.

The CDbCriteria class in 1.1 is replaced by yii\db\ActiveQuery in Yii 2. That class extends from yii\db\Query, and thus inherits all query building methods. You call yii\db\ActiveRecord::find() to start building a query:

// To retrieve all *active* customers and order them by their ID:
$customers = Customer::find()
    ->where(['status' => $active])
    ->orderBy('id')
    ->all();

To declare a relation, simply define a getter method that returns anActiveQuery object. The property name defined by the getter represents the relation name. For example, the following code declares an ordersrelation (in 1.1, you would have to declare relations in a central placerelations()):

class Customer extends \yii\db\ActiveRecord
{
    public function getOrders()
    {
        return $this->hasMany('Order', ['customer_id' => 'id']);
    }
}

Now you can use $customer->orders to access a customer’s orders from the related table. You can also use the following code to perform an on-the-fly relational query with a customized query condition:

$orders = $customer->getOrders()->andWhere('status=1')->all();

When eager loading a relation, Yii 2.0 does it differently from 1.1. In particular, in 1.1 a JOIN query would be created to select both the primary and the relational records. In Yii 2.0, two SQL statements are executed without using JOIN: the first statement brings back the primary records and the second brings back the relational records by filtering with the primary keys of the primary records.

Instead of returning ActiveRecord objects, you may chain the asArray()method when building a query to return a large number of records. This will cause the query result to be returned as arrays, which can significantly reduce the needed CPU time and memory if large number of records . For example:

$customers = Customer::find()->asArray()->all();

Another change is that you can’t define attribute default values through public properties anymore. If you need those, you should set them in the init method of your record class.

public function init()
{
    parent::init();
    $this->status = self::STATUS_NEW;
}

There were some problems with overriding the constructor of an ActiveRecord class in 1.1. These are not present in version 2.0 anymore. Note that when adding parameters to the constructor you might have to override yii\db\ActiveRecord::instantiate().

There are many other changes and enhancements to Active Record. Please refer to the Active Record section for more details.

活動記錄行爲

In 2.0, we have dropped the base behavior class CActiveRecordBehavior. If you want to create an Active Record Behavior, you will have to extend directly from yii\base\Behavior. If the behavior class needs to respond to some events of the owner, you have to override the events() method like the following,

namespace app\components;

use yii\db\ActiveRecord;
use yii\base\Behavior;

class MyBehavior extends Behavior
{
    // ...

    public function events()
    {
        return [
            ActiveRecord::EVENT_BEFORE_VALIDATE => 'beforeValidate',
        ];
    }

    public function beforeValidate($event)
    {
        // ...
    }
}

用戶和驗證接口

The CWebUser class in 1.1 is now replaced by yii\web\User, and there is no more CUserIdentity class. Instead, you should implement theyii\web\IdentityInterface which is much more straightforward to use. The advanced application template provides such an example.

Please refer to the AuthenticationAuthorization, and Advanced Application Template sections for more details.

URL 管理

URL management in Yii 2 is similar to that in 1.1. A major enhancement is that URL management now supports optional parameters. For example, if you have a rule declared as follows, then it will match bothpost/popular and post/1/popular. In 1.1, you would have had to use two rules to achieve the same goal.

[
    'pattern' => 'post/<page:\d+>/<tag>',
    'route' => 'post/index',
    'defaults' => ['page' => 1],
]

Please refer to the Url manager docs section for more details.

Yii 1.1 與 2.x 同時使用

If you have legacy Yii 1.1 code that you want to use together with Yii 2.0, please refer to the Using Yii 1.1 and 2.0 Together section.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章