天天看點

yii架構學習1

https://www.yiichina.com/doc/guide/2.0

一、安裝

composer create-project --prefer-dist yiisoft/yii2-app-basic basic
           

二、指向根目錄

web

三、通路

http://localhost/

四、建立方法、視訊并通路(預設)

在controllers/SiteController.php新加方法

public function actionSay(){
        return $this->render('say',['message'=>'message news']);
    }
           

say 操作被定義為 actionSay 方法。 Yii 使用 action 字首區分普通方法和操作。 action 字首後面的名稱被映射為操作的 ID。

在views/site檔案夾下建立say.php

代碼如下:

<?php
use yii\helpers\Html;
?>
<?=Html::encode($message) ?>
           

say 視圖應該存為 views/site/say.php 檔案。當一個操作中調用了 render() 方法時, 它将會按 views/控制器 ID/視圖名.php 路徑加載 PHP 檔案。

五、擷取位址欄參數

文檔給出系統會自動擷取,隻需要在方法括号裡面加對應參數就行了,我也不知道為什麼

public function actionSay($message = 'Hello')
    {
        return $this->render('say', ['message' => $message]);
    }
           

前端代碼:

<?php
use yii\helpers\Html;
?>
<?=Html::encode($message) ?>
           

通路位址:http://localhost/index.php?r=site/say&message=holle+world

yii架構學習1

控制器生命周期

處理一個請求時,應用主體 會根據請求 路由建立一個控制器, 控制器經過以下生命周期來完成請求:

在控制器建立和配置後,yii\base\Controller::init() 方法會被調用。

控制器根據請求操作ID建立一個操作對象:

如果操作ID沒有指定,會使用default action ID預設操作ID;

如果在action map找到操作ID, 會建立一個獨立操作;

如果操作ID對應操作方法,會建立一個内聯操作;

否則會抛出yii\base\InvalidRouteException異常。

控制器按順序調用應用主體、子產品(如果控制器屬于子產品)、 控制器的 beforeAction() 方法;

如果任意一個調用傳回false,後面未調用的beforeAction()會跳過并且操作執行會被取消; action execution will be cancelled.

預設情況下每個 beforeAction() 方法會觸發一個 beforeAction 事件,在事件中你可以追加事件處理操作;

控制器執行操作:

請求資料解析和填入到操作參數;

控制器按順序調用控制器、子產品(如果控制器屬于子產品)、應用主體的 afterAction() 方法;

預設情況下每個 afterAction() 方法會觸發一個 afterAction 事件, 在事件中你可以追加事件處理操作;

應用主體擷取操作結果并指派給響應.

視圖名

渲染視圖時,可指定一個視圖名或視圖檔案路徑/别名,大多數情況下使用前者因為前者簡潔靈活, 我們稱用名字的視圖為 視圖名.

視圖名可以依據以下規則到對應的視圖檔案路徑:

視圖名可省略檔案擴充名,這種情況下使用 .php 作為擴充, 視圖名 about 對應到 about.php 檔案名;

視圖名以雙斜杠 // 開頭,對應的視圖檔案路徑為 @app/views/ViewName, 也就是說視圖檔案在 application’s view path 路徑下找, 例如 //site/about 對應到 @app/views/site/about.php。

視圖名以單斜杠/開始,視圖檔案路徑以目前使用子產品 的view path開始, 如果不存在子產品,使用@app/views/ViewName開始,例如,如果目前子產品為user, /user/create 對應成 @app/modules/user/views/user/create.php, 如果不在子產品中,/user/create對應@app/views/user/create.php。

如果 context 渲染視圖 并且上下文實作了 yii\base\ViewContextInterface, 視圖檔案路徑由上下文的 view path 開始, 這種主要用在控制器和小部件中渲染視圖,例如 如果上下文為控制器SiteController,site/about 對應到 @app/views/site/about.php。

如果視圖渲染另一個視圖,包含另一個視圖檔案的目錄以目前視圖的檔案路徑開始, 例如被視圖@app/views/post/index.php 渲染的 item 對應到 @app/views/post/item。

根據以上規則,在控制器中 app\controllers\PostController 調用 $this->render(‘view’), 實際上渲染 @app/views/post/view.php 視圖檔案,當在該視圖檔案中調用 $this->render(’_overview’) 會渲染 @app/views/post/_overview.php 視圖檔案。

布局

布局是一種特殊的視圖,代表多個視圖的公共部分, 例如,大多數Web應用共享相同的頁頭和頁尾, 在每個視圖中重複相同的頁頭和頁尾,更好的方式是将這些公共放到一個布局中, 渲染内容視圖後在合适的地方嵌入到布局中。

建立布局

由于布局也是視圖,它可像普通視圖一樣建立,布局預設存儲在@app/views/layouts路徑下, 子產品中使用的布局應存儲在 module directory子產品目錄 下的views/layouts路徑下, 可配置yii\base\Module::$layoutPath來自定義應用或子產品的布局預設路徑。

如下示例為一個布局大緻内容,注意作為示例,簡化了很多代碼, 在實際中,你可能想添加更多内容,如頭部标簽,主菜單等。

<?php
use yii\helpers\Html;

/* @var $this yii\web\View */
/* @var $content string 字元串 */
?>
<?php $this->beginPage() ?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <?= Html::csrfMetaTags() ?>
    <title><?= Html::encode($this->title) ?></title>
    <?php $this->head() ?>
</head>
<body>
<?php $this->beginBody() ?>
    <header>My Company</header>
    <?= $content ?>
    <footer>&copy; 2014 by My Company</footer>
<?php $this->endBody() ?>
</body>
</html>
<?php $this->endPage() ?>
           

如上所示,布局生成每個頁面通用的HTML标簽,在标簽中,列印$content變量, $content變量代表當yii\base\Controller::render() 控制器渲染方法調用時傳遞到布局的内容視圖渲染結果。

大多數視圖應調用上述代碼中的如下方法, 這些方法觸發關于渲染過程的事件, 這樣其他地方注冊的腳本和标簽會添加到這些方法調用的地方。

它觸發表明頁面開始的 EVENT_BEGIN_PAGE 事件。

它觸發表明頁面結尾的 EVENT_END_PAGE 事件。

它生成一個占位符,在頁面渲染結束時會被注冊的頭部HTML代碼 (如,link标簽, meta标簽)替換。

它觸發 EVENT_BEGIN_BODY 事件并生成一個占位符, 會被注冊的HTML代碼(如JavaScript)在頁面主體開始處替換。

它觸發 EVENT_END_BODY 事件并生成一個占位符, 會被注冊的HTML代碼(如JavaScript)在頁面主體結尾處替換。

布局中通路資料

在布局中可通路兩個預定義變量:$this 和 $content, 前者對應和普通視圖類似的view 視圖元件 後者包含調用render()方法渲染内容視圖的結果。

如果想在布局中通路其他資料,必須使用視圖中通路資料一節介紹的拉取方式, 如果想從内容視圖中傳遞資料到布局, 可使用視圖間共享資料一節中的方法。

使用布局

如控制器中渲染一節描述, 當控制器調用render() 方法渲染視圖時,會同時使用布局到渲染結果中,預設會使用@app/views/layouts/main.php布局檔案。

可配置yii\base\Application::KaTeX parse error: Undefined control sequence: \base at position 13: layout 或 yii\̲b̲a̲s̲e̲\Controller::layout 使用其他布局檔案, 前者管理所有控制器的布局,後者覆寫前者來控制單個控制器布局。 例如,如下代碼使 post 控制器渲染視圖時使用 @app/views/layouts/post.php 作為布局檔案, 假如 layout 屬性沒改變, 控制器預設使用 @app/views/layouts/main.php 作為布局檔案。

namespace app\controllers;

use yii\web\Controller;

class PostController extends Controller
{
    public $layout = 'post';
    
    // ...
}
           

視圖事件

View components 視圖元件會在視圖渲染過程中觸發幾個事件, 可以在内容發送給終端使用者前,響應這些事件來添加内容到視圖中或調整渲染結果。

該事件可設定 yii\base\ViewEvent::$isValid 為 false 取消視圖渲染。

EVENT_AFTER_RENDER: 在布局中調用 yii\base\View::afterRender() 時觸發, 該事件可擷取yii\base\ViewEvent::$output的渲染結果, 可修改該屬性來修改渲染結果。

EVENT_BEGIN_PAGE: 在布局調用 yii\base\View::beginPage() 時觸發;

EVENT_END_PAGE: 在布局調用 yii\base\View::endPage() 是觸發;

EVENT_BEGIN_BODY: 在布局調用 yii\web\View::beginBody() 時觸發;

EVENT_END_BODY: 在布局調用 yii\web\View::endBody() 時觸發。

例如,如下代碼将目前日期添加到頁面結尾處:

\Yii::$app->view->on(View::EVENT_END_BODY, function () {
    echo date('Y-m-d');
});
           

m o d e l − > l o a d ( model->load( model−>load(data) 傳回false 可以嘗試

$model->attributes = $data;
// 或者
$model->setAttributes($data);