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

direktori cari
閱讀前篇 簡介 Yii 是什么 從 Yii 1.1 升級 入門 安裝 Yii 運行應(yīng)用 第一次問候 使用Forms 數(shù)據(jù)庫應(yīng)用 使用 Gii 生成代碼 進階 應(yīng)用結(jié)構(gòu) 概述 入口腳本 應(yīng)用(Applications) 應(yīng)用組件(Application Components) 控制器(Controllers) 模型(Models) 視圖(views) 模塊(Modules) 過濾器(Filters) 小部件(Widgets) 前端資源(Assets) 擴展(Extensions) 請求處理 運行概述 啟動引導(dǎo)(Bootstrapping) 路由和創(chuàng)建URL 請求(Requests) 響應(yīng)(Responses) Sessions 和 Cookies 錯誤處理(Handling Errors) 日志(Logging) 關(guān)鍵概念 組件(Component) 屬性(Property) 事件(Events) 行為(Behaviors) 配置(Configurations) 別名(Aliases) 類自動加載(Autoloading) 服務(wù)定位器(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) 多模型的復(fù)合表單(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) 安全 認(rèn)證(Authentication) 授權(quán)(Authorization) 處理密碼(Working with Passwords) 客戶端認(rèn)證(Auth Clients) 最佳安全實踐(Best Practices) 緩存 概述 數(shù)據(jù)緩存 片段緩存 頁面緩存 HTTP 緩存 RESTfull Web服務(wù) 快速入門(Quick Start) 資源(Resources) 控制器(Controllers) 路由(Routing) 格式化響應(yīng)(Response Formatting) 授權(quán)認(rèn)證(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) 高級專題 高級應(yīng)用模板 創(chuàng)建自定義應(yīng)用程序結(jié)構(gòu) 控制臺命令 核心驗證器(Core Validators) 國際化 收發(fā)郵件 性能優(yōu)化 共享主機環(huán)境 模板引擎 集成第三方代碼 小部件 Bootstrap 小部件 Jquery UI 助手類 概述 Array 助手(ArrayHelper) Html 助手(Html) Url 助手(Url)
watak

應(yīng)用主體

應(yīng)用主體

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

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

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

應(yīng)用主體配置

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

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

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

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

類似其他?配置?文件, 應(yīng)用主體配置文件標(biāo)明如何設(shè)置應(yīng)用對象初始屬性。 由于應(yīng)用主體配置比較復(fù)雜,一般保存在多個類似如上web.php的?配置文件?當(dāng)中。

應(yīng)用主體屬性

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

必要屬性

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

yii\base\Application::id

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

yii\base\Application::basePath

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

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

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

重要屬性

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

yii\base\Application::aliases

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

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

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

yii\base\Application::bootstrap

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

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

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

例如:

[
    'bootstrap' => [
        // 應(yīng)用組件ID或模塊ID
        'demo',

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

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

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

補充: 如果模塊ID和應(yīng)用組件ID同名,優(yōu)先使用應(yīng)用組件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?應(yīng)用主體配置中, 開發(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)性能,因為每次請求都需要重新運行啟動組件,因此謹(jǐn)慎配置啟動組件。

yii\web\Application::catchAll

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

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

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

yii\base\Application::components

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

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

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

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

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

yii\base\Application::controllerMap

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

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

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

yii\base\Application::controllerNamespace

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

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

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

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

yii\base\Application::language

該屬性指定應(yīng)用展示給終端用戶的語言,默認(rèn)為?en?標(biāo)識英文。如果需要之前其他語言可以配置該屬性。

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

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

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

yii\base\Application::modules

該屬性指定應(yīng)用所包含的?模塊。

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

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

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

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

yii\base\Application::name

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

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

yii\base\Application::params

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

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

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

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

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

yii\base\Application::sourceLanguage

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

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

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

yii\base\Application::timeZone

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

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

yii\base\Application::version

該屬性指定應(yīng)用的版本,默認(rèn)為'1.0',其他代碼不使用的話可以不配置。

實用屬性

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

yii\base\Application::charset

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

yii\base\Application::defaultRoute

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

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

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

yii\base\Application::extensions

該屬性用數(shù)組列表指定應(yīng)用安裝和使用的?擴展,默認(rèn)使用@vendor/yiisoft/extensions.php文件返回的數(shù)組。 當(dāng)你使用?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ù)組。 如果擴展要在?引導(dǎo)啟動?階段運行,需要配置?bootstrap以及對應(yīng)的引導(dǎo)啟動類名或?configuration?數(shù)組。 擴展也可以定義?別名

yii\base\Application::layout

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

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

yii\base\Application::layoutPath

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

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

yii\base\Application::runtimePath

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

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

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

yii\base\Application::viewPath

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

yii\base\Application::vendorPath

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

可以配置它為一個目錄或者路徑?別名,當(dāng)你修改時,務(wù)必修改對應(yīng)的 Composer 配置。

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

yii\console\Application::enableCoreCommands

該屬性僅 yii\console\Application 控制臺應(yīng)用支持, 用來指定是否啟用Yii中的核心命令,默認(rèn)值為?true。

應(yīng)用事件

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

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

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

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

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

yii\base\Application::EVENT_BEFORE_REQUEST

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

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

yii\base\Application::EVENT_AFTER_REQUEST

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

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

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

yii\base\Application::EVENT_BEFORE_ACTION

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

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

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

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

yii\base\Application::EVENT_AFTER_ACTION

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

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

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

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

應(yīng)用主體生命周期

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

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