亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄 搜索
閱讀前篇 簡介 Yii 是什么 從 Yii 1.1 升級 入門 安裝 Yii 運行應用 第一次問候 使用Forms 數(shù)據(jù)庫應用 使用 Gii 生成代碼 進階 應用結構 概述 入口腳本 應用(Applications) 應用組件(Application Components) 控制器(Controllers) 模型(Models) 視圖(views) 模塊(Modules) 過濾器(Filters) 小部件(Widgets) 前端資源(Assets) 擴展(Extensions) 請求處理 運行概述 啟動引導(Bootstrapping) 路由和創(chuàng)建URL 請求(Requests) 響應(Responses) Sessions 和 Cookies 錯誤處理(Handling Errors) 日志(Logging) 關鍵概念 組件(Component) 屬性(Property) 事件(Events) 行為(Behaviors) 配置(Configurations) 別名(Aliases) 類自動加載(Autoloading) 服務定位器(Service Locator) 依賴注入容器(Dependency Injection Container) 配合數(shù)據(jù)庫工作 數(shù)據(jù)庫訪問 (Data Access Objects) 查詢生成器(Query Builder) 活動記錄(Active Record) 數(shù)據(jù)庫遷移(Migrations) Sphinx Redis MongoDB Elasticsearch 接收用戶數(shù)據(jù) 創(chuàng)建表單(Creating Forms) 輸入驗證(Validating Input) 文件上傳(Uploading Files) 收集列表輸入(Collecting Tabular Input) 多模型的復合表單(Getting Data for Multiple Models) 顯示數(shù)據(jù) 格式化輸出數(shù)據(jù)(Data Formatting) 分頁(Pagination) 排序(Sorting) 數(shù)據(jù)提供器(Data Providers) 數(shù)據(jù)小部件(Data Widgets) 客戶端腳本使用(Working with Client Scripts) 主題(Theming) 安全 認證(Authentication) 授權(Authorization) 處理密碼(Working with Passwords) 客戶端認證(Auth Clients) 最佳安全實踐(Best Practices) 緩存 概述 數(shù)據(jù)緩存 片段緩存 頁面緩存 HTTP 緩存 RESTfull Web服務 快速入門(Quick Start) 資源(Resources) 控制器(Controllers) 路由(Routing) 格式化響應(Response Formatting) 授權認證(Authentication) 速率限制(Rate Limiting) 版本(Versioning) 錯誤處理(Error Handling) 開發(fā)工具 調(diào)試工具欄和調(diào)試器 使用Gii生成代碼 生成API文檔 測試 概述(Overview) 配置測試環(huán)境(Testing environment setup) 單元測試(Unit Tests) 功能測試(Function Tests) 驗收測試(Acceptance Tests) 測試夾具(Fixtures) 高級專題 高級應用模板 創(chuàng)建自定義應用程序結構 控制臺命令 核心驗證器(Core Validators) 國際化 收發(fā)郵件 性能優(yōu)化 共享主機環(huán)境 模板引擎 集成第三方代碼 小部件 Bootstrap 小部件 Jquery UI 助手類 概述 Array 助手(ArrayHelper) Html 助手(Html) Url 助手(Url)
文字

應用主體

應用主體

應用主體是管理 Yii 應用系統(tǒng)整體結構和生命周期的對象。 每個Yii應用系統(tǒng)只能包含一個應用主體,應用主體在?入口腳本?中創(chuàng)建并能通過表達式?\Yii::$app?全局范圍內(nèi)訪問。

補充: 當我們說"一個應用",它可能是一個應用主體對象,也可能是一個應用系統(tǒng),是根據(jù)上下文來決定[譯:中文為避免歧義,Application翻譯為應用主體]。

Yii有兩種應用主體: yii\web\Application and yii\console\Application, 如名稱所示,前者主要處理網(wǎng)頁請求,后者處理控制臺請求。

應用主體配置

如下所示,當?入口腳本?創(chuàng)建了一個應用主體,它會加載一個?配置?文件并傳給應用主體。

require(__DIR__ . '/../vendor/autoload.php');
require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');

// 加載應用主體配置$config = require(__DIR__ . '/../config/web.php');

// 實例化應用主體、配置應用主體
(new yii\web\Application($config))->run();

類似其他?配置?文件, 應用主體配置文件標明如何設置應用對象初始屬性。 由于應用主體配置比較復雜,一般保存在多個類似如上web.php的?配置文件?當中。

應用主體屬性

應用主體配置文件中有許多重要的屬性要配置,這些屬性指定應用主體的運行環(huán)境。 比如,應用主體需要知道如何加載?控制器?,臨時文件保存到哪兒等等。 以下我們簡述這些屬性。

必要屬性

在一個應用中,至少要配置2個屬性: yii\base\Application::id 和 yii\base\Application::basePath。

yii\base\Application::id

yii\base\Application::id 屬性用來區(qū)分其他應用的唯一標識ID。主要給程序使用。 為了方便協(xié)作,最好使用數(shù)字作為應用主體ID,但不強制要求為數(shù)字。

yii\base\Application::basePath

yii\base\Application::basePath 指定該應用的根目錄。根目錄包含應用系統(tǒng)所有受保護的源代碼。 在根目錄下可以看到對應MVC設計模式的models,?views,?controllers等子目錄。

可以使用路徑或?路徑別名?來在配置 yii\base\Application::basePath 屬性。 兩種格式所對應的目錄都必須存在,否則系統(tǒng)會拋出一個異常。 系統(tǒng)會使用?realpath()?函數(shù)規(guī)范化配置的路徑.

yii\base\Application::basePath 屬性經(jīng)常用于派生一些其他重要路徑(如runtime路徑),因此,系統(tǒng)預定義?@app?代表這個路徑。 派生路徑可以通過這個別名組成(如@app/runtime代表runtime的路徑)。

重要屬性

本小節(jié)所描述的屬性通常需要設置,因為不同的應用屬性不同。

yii\base\Application::aliases

該屬性允許你用一個數(shù)組定義多個?別名。數(shù)組的key為別名名稱,值為對應的路徑。例如:

[
    'aliases' => [
        '@name1' => 'path/to/path1',
        '@name2' => 'path/to/path2',
    ],
]

使用這個屬性來定義別名,代替 Yii::setAlias() 方法來設置。

yii\base\Application::bootstrap

這個屬性很實用,它允許你用數(shù)組指定啟動階段yii\base\Application::bootstrap()需要運行的組件。 比如,如果你希望一個?模塊?自定義URL 規(guī)則,你可以將模塊ID加入到bootstrap數(shù)組中。

屬性中的每個組件需要指定以下一項:

  • 應用?組件?ID.
  • 模塊?ID.
  • 類名.
  • 配置數(shù)組.
  • 創(chuàng)建并返回一個組件的無名稱函數(shù).

例如:

[
    'bootstrap' => [
        // 應用組件ID或模塊ID
        'demo',

        // 類名
        'app\components\Profiler',

        // 配置數(shù)組
        [
            'class' => 'app\components\Profiler',
            'level' => 3,
        ],

        // 無名稱函數(shù)
        function () {
            return new app\components\Profiler();
        }
    ],
]

補充: 如果模塊ID和應用組件ID同名,優(yōu)先使用應用組件ID,如果你想用模塊ID,可以使用如下無名稱函數(shù)返回模塊ID。?`php [

function () {
    return Yii::$app->getModule('user');
},

]?`

在啟動階段,每個組件都會實例化。如果組件類實現(xiàn)接口 yii\base\BootstrapInterface,也會調(diào)用 yii\base\BootstrapInterface::bootstrap() 方法。

舉一個實際的例子,Basic Application Template?應用主體配置中, 開發(fā)環(huán)境下會在啟動階段運行?debug?和?gii?模塊。

if (YII_ENV_DEV) {
    // configuration adjustments for 'dev' environment
    $config['bootstrap'][] = 'debug';
    $config['modules']['debug'] = 'yii\debug\Module';

    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = 'yii\gii\Module';
}

注: 啟動太多的組件會降低系統(tǒng)性能,因為每次請求都需要重新運行啟動組件,因此謹慎配置啟動組件。

yii\web\Application::catchAll

該屬性僅 yii\web\Application 網(wǎng)頁應用支持。 它指定一個要處理所有用戶請求的?控制器方法,通常在維護模式下使用,同一個方法處理所有用戶請求。

該配置為一個數(shù)組,第一項指定動作的路由,剩下的數(shù)組項(key-value 成對)指定傳遞給動作的參數(shù),例如:

[
    'catchAll' => [
        'offline/notice',
        'param1' => 'value1',
        'param2' => 'value2',
    ],
]

yii\base\Application::components

這是最重要的屬性,它允許你注冊多個在其他地方使用的應用組件. 例如

[
    'components' => [
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
        ],
    ],
]

每一個應用組件指定一個key-value對的數(shù)組,key代表組件ID,value代表組件類名或?配置。

在應用中可以任意注冊組件,并可以通過表達式?\Yii::$app->ComponentID?全局訪問。

詳情請閱讀?應用組件?一節(jié).

yii\base\Application::controllerMap

該屬性允許你指定一個控制器ID到任意控制器類。Yii遵循一個默認的?規(guī)則指定控制器ID到任意控制器類(如post對應app\controllers\PostController)。 通過配置這個屬性,可以打破這個默認規(guī)則,在下面的例子中,account對應到app\controllers\UserController,?article?對應到?app\controllers\PostController。

[
    'controllerMap' => [
        [
            'account' => 'app\controllers\UserController',
            'article' => [
                'class' => 'app\controllers\PostController',
                'enableCsrfValidation' => false,
            ],
        ],
    ],
]

數(shù)組的鍵代表控制器ID,數(shù)組的值代表對應的類名。

yii\base\Application::controllerNamespace

該屬性指定控制器類默認的命名空間,默認為app\controllers。比如控制器ID為?post?默認對應?PostController?(不帶命名空間), 類全名為?app\controllers\PostController。

控制器類文件可能放在這個命名空間對應目錄的子目錄下, 例如,控制器ID?admin/post?對應的控制器類全名為app\controllers\admin\PostController。

控制器類全面能被?自動加載,這點是非常重要的,控制器類的實際命名空間對應這個屬性, 否則,訪問時你會收到"Page Not Found"[譯:頁面找不到]。

如果你想打破上述的規(guī)則,可以配置?controllerMap?屬性。

yii\base\Application::language

該屬性指定應用展示給終端用戶的語言,默認為?en?標識英文。如果需要之前其他語言可以配置該屬性。

該屬性影響各種?國際化?,包括信息翻譯、日期格式、數(shù)字格式等。 例如 yii\jui\DatePicker 小部件會根據(jù)該屬性展示對應語言的日歷以及日期格式。

推薦遵循?IETF language tag?來設置語言,例如?en?代表英文,?en-US?代表英文(美國).

該屬性的更多信息可參考?國際化?一節(jié).

yii\base\Application::modules

該屬性指定應用所包含的?模塊。

該屬性使用數(shù)組包含多個模塊類?配置,數(shù)組的鍵為模塊ID,例:

[
    'modules' => [
        // "booking" 模塊以及對應的類
        'booking' => 'app\modules\booking\BookingModule',

        // "comment" 模塊以及對應的配置數(shù)組
        'comment' => [
            'class' => 'app\modules\comment\CommentModule',
            'db' => 'db',
        ],
    ],
]

更多詳情請參考?模塊?一節(jié)。

yii\base\Application::name

該屬性指定你可能想展示給終端用戶的應用名稱,不同于需要唯一性的 yii\base\Application::id 屬性, 該屬性可以不唯一,該屬性用于顯示應用的用途。

如果其他地方的代碼沒有用到,可以不配置該屬性。

yii\base\Application::params

該屬性為一個數(shù)組,指定可以全局訪問的參數(shù),代替程序中硬編碼的數(shù)字和字符,應用中的參數(shù)定義到一個單獨的文件并隨時可以訪問是一個好習慣。 例如用參數(shù)定義縮略圖的長寬如下:

[
    'params' => [
        'thumbnail.size' => [128, 128],
    ],
]

然后簡單的使用如下代碼即可獲取到你需要的長寬參數(shù):

$size = \Yii::$app->params['thumbnail.size'];
$width = \Yii::$app->params['thumbnail.size'][0];

以后想修改縮略圖長寬,只需要修改該參數(shù)而不需要相關的代碼。

yii\base\Application::sourceLanguage

該屬性指定應用代碼的語言,默認為?'en-US'?標識英文(美國),如果應用不是英文請修改該屬性。

和?語言?屬性類似,配置該屬性需遵循?IETF language tag. 例如?en?代表英文,?en-US?代表英文(美國)。

該屬性的更多信息可參考?國際化?一節(jié).

yii\base\Application::timeZone

該屬性提供一種方式修改PHP運行環(huán)境中的默認時區(qū),配置該屬性本質(zhì)上就是調(diào)用PHP函數(shù)?date_default_timezone_set(),例如:

[
    'timeZone' => 'America/Los_Angeles',
]

yii\base\Application::version

該屬性指定應用的版本,默認為'1.0',其他代碼不使用的話可以不配置。

實用屬性

本小節(jié)描述的屬性不經(jīng)常設置,通常使用系統(tǒng)默認值。如果你想改變默認值,可以配置這些屬性。

yii\base\Application::charset

該屬性指定應用使用的字符集,默認值為?'UTF-8',絕大部分應用都在使用,除非已有的系統(tǒng)大量使用非unicode數(shù)據(jù)才需要更改該屬性。

yii\base\Application::defaultRoute

該屬性指定未配置的請求的響應?路由?規(guī)則,路由規(guī)則可能包含模塊ID,控制器ID,動作ID。 例如help,?post/create,admin/post/create,如果動作ID沒有指定,會使用yii\base\Controller::defaultAction中指定的默認值。

對于 yii\web\Application 網(wǎng)頁應用,默認值為?'site'?對應?SiteController?控制器,并使用默認的動作。 因此你不帶路由的訪問應用,默認會顯示?app\controllers\SiteController::actionIndex()?的結果。

對于 yii\console\Application 控制臺應用, 默認值為?'help'?對應 yii\console\controllers\HelpController::actionIndex()。 因此,如果執(zhí)行的命令不帶參數(shù),默認會顯示幫助信息。

yii\base\Application::extensions

該屬性用數(shù)組列表指定應用安裝和使用的?擴展,默認使用@vendor/yiisoft/extensions.php文件返回的數(shù)組。 當你使用?Composer?安裝擴展,extensions.php?會被自動生成和維護更新。 所以大多數(shù)情況下,不需要配置該屬性。

特殊情況下你想自己手動維護擴展,可以參照如下配置該屬性:

[
    'extensions' => [
        [
            'name' => 'extension name',
            'version' => 'version number',
            'bootstrap' => 'BootstrapClassName',  // 可選配,可為配置數(shù)組
            'alias' => [  // 可選配
                '@alias1' => 'to/path1',
                '@alias2' => 'to/path2',
            ],
        ],

        // ... 更多像上面的擴展 ...

    ],
]

如上所示,該屬性包含一個擴展定義數(shù)組,每個擴展為一個包含?name?和?version?項的數(shù)組。 如果擴展要在?引導啟動?階段運行,需要配置?bootstrap以及對應的引導啟動類名或?configuration?數(shù)組。 擴展也可以定義?別名

yii\base\Application::layout

該屬性指定渲染?視圖?默認使用的布局名字,默認值為?'main'?對應布局路徑下的?main.php?文件, 如果?布局路徑?和?視圖路徑?都是默認值,默認布局文件可以使用路徑別名@app/views/layouts/main.php

如果不想設置默認布局文件,可以設置該屬性為?false,這種做法比較罕見。

yii\base\Application::layoutPath

該屬性指定查找布局文件的路徑,默認值為?視圖路徑?下的?layouts?子目錄。 如果?視圖路徑?使用默認值,默認的布局路徑別名為@app/views/layouts

該屬性需要配置成一個目錄或 路徑?別名。

yii\base\Application::runtimePath

該屬性指定臨時文件如日志文件、緩存文件等保存路徑,默認值為帶別名的?@app/runtime

可以配置該屬性為一個目錄或者路徑?別名,注意應用運行時有對該路徑的寫入權限, 以及終端用戶不能訪問該路徑因為臨時文件可能包含一些敏感信息。

為了簡化訪問該路徑,Yii預定義別名?@runtime?代表該路徑。

yii\base\Application::viewPath

該路徑指定視圖文件的根目錄,默認值為帶別名的?@app/views,可以配置它為一個目錄或者路徑?別名.

yii\base\Application::vendorPath

該屬性指定?Composer?管理的供應商路徑,該路徑包含應用使用的包括Yii框架在內(nèi)的所有第三方庫。 默認值為帶別名的?@app/vendor?。

可以配置它為一個目錄或者路徑?別名,當你修改時,務必修改對應的 Composer 配置。

為了簡化訪問該路徑,Yii預定義別名?@vendor?代表該路徑。

yii\console\Application::enableCoreCommands

該屬性僅 yii\console\Application 控制臺應用支持, 用來指定是否啟用Yii中的核心命令,默認值為?true

應用事件

應用在處理請求過程中會觸發(fā)事件,可以在配置文件配置事件處理代碼,如下所示:

[
    'on beforeRequest' => function ($event) {
        // ...
    },
]

on eventName?語法的用法在?Configurations?一節(jié)有詳細描述.

另外,在應用主體實例化后,你可以在引導啟動?階段附加事件處理代碼,例如:

\Yii::$app->on(\yii\base\Application::EVENT_BEFORE_REQUEST, function ($event) {
    // ...
});

yii\base\Application::EVENT_BEFORE_REQUEST

該事件在應用處理請求before之前,實際的事件名為?beforeRequest。

在事件觸發(fā)前,應用主體已經(jīng)實例化并配置好了,所以通過事件機制將你的代碼嵌入到請求處理過程中非常不錯。 例如在事件處理中根據(jù)某些參數(shù)動態(tài)設置yii\base\Application::language語言屬性。

yii\base\Application::EVENT_AFTER_REQUEST

該事件在應用處理請求after之后但在返回響應before之前觸發(fā),實際的事件名為afterRequest。

該事件觸發(fā)時,請求已經(jīng)被處理完,可以做一些請求后處理或自定義響應。

注意 yii\web\Response 組件在發(fā)送響應給終端用戶時也會觸發(fā)一些事件,這些事件都在本事件after之后觸發(fā)。

yii\base\Application::EVENT_BEFORE_ACTION

該事件在每個?控制器動作?運行before之前會被觸發(fā),實際的事件名為?beforeAction.

事件的參數(shù)為一個 yii\base\ActionEvent 實例, 事件處理中可以設置yii\base\ActionEvent::isValid 為?false?停止運行后續(xù)動作,例如:

[
    'on beforeAction' => function ($event) {
        if (some condition) {
            $event->isValid = false;
        } else {
        }
    },
]

注意?模塊?和?控制器?都會觸發(fā)?beforeAction?事件。 應用主體對象首先觸發(fā)該事件,然后模塊觸發(fā)(如果存在模塊),最后控制器觸發(fā)。 任何一個事件處理中設置 yii\base\ActionEvent::isValid 設置為?false?會停止觸發(fā)后面的事件。

yii\base\Application::EVENT_AFTER_ACTION

該事件在每個?控制器動作?運行after之后會被觸發(fā),實際的事件名為?afterAction.

該事件的參數(shù)為 yii\base\ActionEvent 實例,通過yii\base\ActionEvent::result屬性, 事件處理可以訪問和修改動作的結果。例如:

[
    'on afterAction' => function ($event) {
        if (some condition) {
            // 修改 $event->result
        } else {
        }
    },
]

注意?模塊?和?控制器?都會觸發(fā)?afterAction?事件。 這些對象的觸發(fā)順序和?beforeAction?相反,也就是說,控制器最先觸發(fā),然后是模塊(如果有模塊),最后為應用主體。

應用主體生命周期

當運行?入口腳本?處理請求時,應用主體會經(jīng)歷以下生命周期:

  1. 入口腳本加載應用主體配置數(shù)組。
  2. 入口腳本創(chuàng)建一個應用主體實例:
    • 調(diào)用 yii\base\Application::preInit() 配置幾個高級別應用主體屬性,比如yii\base\Application::basePath。
    • 注冊 yii\base\Application::errorHandler 錯誤處理方法.
    • 配置應用主體屬性.
    • 調(diào)用 yii\base\Application::init() 初始化,該函數(shù)會調(diào)用 yii\base\Application::bootstrap() 運行引導啟動組件.
  3. 入口腳本調(diào)用 yii\base\Application::run() 運行應用主體:
    • 觸發(fā) yii\base\Application::EVENT_BEFORE_REQUEST 事件。
    • 處理請求:解析請求?路由?和相關參數(shù);創(chuàng)建路由指定的模塊、控制器和動作對應的類,并運行動作。
    • 觸發(fā) yii\base\Application::EVENT_AFTER_REQUEST 事件。
    • 發(fā)送響應到終端用戶.
  4. 入口腳本接收應用主體傳來的退出狀態(tài)并完成請求的處理。
上一篇: 下一篇: