Ứng dụng ============ Mỗi ứng dụng là một đối tượng giúp quản lý tổng thể cấu trúc và vòng đời của ứng dụng Yii. Mỗi ứng dụng Yii đều chứa một đối tượng ứng dụng, đối tượng này được khởi tạo tại mục [entry script](structure-entry-scripts.md) và đồng thời được truy cập qua biểu thức `\Yii::$app`. > Gợi ý: Phụ thuộc vào từng ngữ cảnh, có khi chúng ta gọi là "một application", có nghĩa là một đối tượng ứng dụng hoặc một hệ thống ứng dụng. Có 2 kiểu ứng dụng: [[yii\web\Application|Ứng dụng Web]] và [[yii\console\Application|ứng dụng giao diện dòng lệnh]]. Tương tự như vậy, ứng dụng Web xử lý với các yêu cầu về Web, , ứng dụng còn lại sẽ xử lý với các yêu cầu ở giao diện dòng lệnh. ## Cấu hình ứng dụng Mỗi khi [entry script](structure-entry-scripts.md) tạo ứng dụng mới, nó sẽ tải thêm thông tin về [cấu hình](concept-configurations.md) và gán vào trong ứng dụng, như sau: ```php require(__DIR__ . '/../vendor/autoload.php'); require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php'); // tải các cấu hình ứng dụng $config = require(__DIR__ . '/../config/web.php'); // gán cấu hình và khởi tạo ứng dụng (new yii\web\Application($config))->run(); ``` Thông thường việc [cấu hình](concept-configurations.md), ứng dụng sẽ xác định làm thế nào để khởi tạo các thuộc tính và đối tượng ứng dụng. Do việc cấu hình ứng dụng khá phức tạp nên vậy , chúng thường được lưu giữ tại [các file cấu hình](concept-configurations.md#configuration-files), như file `web.php` ở ví dụ trên. ## Các thuộc tính của ứng dụng Có nhiều thuộc tính quan trọng mà bạn cần phải cấu hình trong ứng dụng. Những thuộc tính này thường được mô tả về môi trường mà ứng dụng đang chạy. Chẳng hạn, ứng dụng cần biết làm thế nào để tải các [controllers](structure-controllers.md), nơi lưu trữ các file tạm, vv. Trong phần dưới này, chúng ta sẽ tổng hợp thông tin về thuộc tính. ### Thuộc tính bắt buộc Ở mỗi ứng dụng, bạn cần cấu hình ít nhất 2 thuộc tính là: [[yii\base\Application::id|id]] và [[yii\base\Application::basePath|basePath]]. #### [[yii\base\Application::id|id]] Thuộc tính [[yii\base\Application::id|id]] giúp đặc tả một định danh ID để phân biệt với các ứng dụng khác . Thuộc tính chủ yếu được sử dụng trong chương trình. Mặc dù nó không được yêu cầu, để thích hợp cho khả năng tương tác nên chỉ sử dụng các chữ cái chữ số khi mô tả một định danh của ứng dụng. #### [[yii\base\Application::basePath|basePath]] Thuộc tính [[yii\base\Application::basePath|basePath]] dùng để mô tả thư mục gốc của ứng dụng. Nó là thư mục chứa tất cả mã nguồn của ứng dụng. Bên trong thư mục, bạn sẽ thấy các thư mục con như `models`, `views`, và `controllers`, các thư mục con này chứa các mã nguồn tương ứng với các thành phần trong mô hình MVC. Bạn phải cấu hình thuộc tính [[yii\base\Application::basePath|basePath]] bằng sử dụng các đường dẫn trực tiếp hoặc [một bí danh](concept-aliases.md). Trong các trường hợp, các thư mục tương ứng phải tồn tại, nếu không sẽ phát sinh ra lỗi . Đường dẫn trực tiếp được lấy qua việc gọi hàm `realpath()` . Thuộc tính [[yii\base\Application::basePath|basePath]] thường được dùng để lấy được các đường dẫn quan trọng khác (vd đường dẫn dành cho thực thi). Vì vậy, bí danh `@app` được xác định là đường dẫn gốc . Các đường dẫn trong ứng dụng được lấy từ bí danh (vd `@app/runtime` tương ứng tới đường dẫn mục runtime). ### Các thuộc tính quan trọng Các thuộc tính được mô tả trong phần này thường cần được cấu hình bởi vì mỗi ứng dụng có các thuộc tính khác nhau. #### [[yii\base\Application::aliases|aliases]] Thuộc tính cho phép khai báo các [bí danh(aliases)](concept-aliases.md) vào trong một mảng. Các khóa lưu trữ tên bí danh, và giá trị trong mảng tương ứng với đường dẫn được khai báo. Ví dụ: ```php [ 'aliases' => [ '@name1' => 'path/to/path1', '@name2' => 'path/to/path2', ], ] ``` Thuộc tính này được cung cấp cho bạn việc khai báo các bí danh trong cấu hình ứng dụng thay vì gọi phương thức [[Yii::setAlias()]]. #### [[yii\base\Application::bootstrap|bootstrap]] Thuộc tính này khá quan trọng. Nó cung cấp cho bạn thông tin về mảng các thành phần (components) mà cần được chạy trong suốt chu trình ứng dụng [[yii\base\Application::bootstrap()|bootstrapping process]]. Ví dụ, nếu bạn muốn một [module](structure-modules.md) dùng để tùy biến các [URL](runtime-routing.md), bạn có thể tùy biến các ID như phần tử trong các thuộc tính. Mỗi thành phần được liệt kê ra có thể khai báo một trong các định dạng sau: - một đinh danh về thành phần được tuân thủ qua [components](#components), - một định danh về module tuân thủ theo quy định về [modules](#modules), - một tên class, - một mảng các cấu hình, - một hàm dùng để khởi tạo và trả về một thành phần. Ví dụ: ```php [ 'bootstrap' => [ // một định danh về thành phần hoặc module 'demo', // tên class 'app\components\Profiler', // mảng cấu hình [ 'class' => 'app\components\Profiler', 'level' => 3, ], // hàm trả về một thành phần function () { return new app\components\Profiler(); } ], ] ``` > Lưu ý: Nếu định danh của module trùng với định danh của thành phần , ứng dụng sẽ sử dụng > trong suốt tiền trình xử lý. Nếu bạn muốn chỉ sử dụng mỗi module, bạn cần lấy nó ở một hàm khác > như sau: > > ```php > [ > function () { > return Yii::$app->getModule('user'); > }, > ] > ``` Trong suốt quá trình xử lý, mỗi thành phần sẽ được khởi tạo. nếu lớp thành phần được hiện thực từ giao diện [[yii\base\BootstrapInterface]], thì phương thức [[yii\base\BootstrapInterface::bootstrap()|bootstrap()]] sẽ đồng thời được gọi. Một ví dụ khác trong việc cấu hình ứng dụng trong [Mẫu Basic Project](start-installation.md), module `debug` và `gii` được cấu hình như những thành phần khi ứng dụng khởi chạy ở môi trường phát triển: ```php if (YII_ENV_DEV) { // cấu hình được thiết lập trong môi trường phát triển 'dev' $config['bootstrap'][] = 'debug'; $config['modules']['debug'] = 'yii\debug\Module'; $config['bootstrap'][] = 'gii'; $config['modules']['gii'] = 'yii\gii\Module'; } ``` > Lưu ý: Việc đưa quá nhiều các thành phần vào `bootstrap` sẽ làm giảm hiệu năng trong ứng dụng, bởi vì mỗi khi có yêu cầu, các thành phần sẽ được chạy. Vì vậy việc sử dụng các thành phần cần sử dụng một cách khôn ngoan. #### [[yii\web\Application::catchAll|catchAll]] Thuộc tính này chỉ được hỗ trợ với [[yii\web\Application| ứng dụng Web]]. Nó mô tả một [hành động](structure-controllers.md) và nhận xử lý mọi yêu cầu. Thường được sử dụng mỗi khi ứng dụng đang ở chế độ bảo trì và cần xử lý mọi yêu cầu được gửi tới. Thông tin được cấu hình bao gồm mảng và chứa thông tin về router và action. Các thông tin mô tả các tham số (thông tin khóa-giá trị) để giới hạn các action. Ví dụ: ```php [ 'catchAll' => [ 'offline/notice', 'param1' => 'value1', 'param2' => 'value2', ], ] ``` #### [[yii\base\Application::components|components]] Đây là thuộc tính quan trọng nhất. Nó cho phép đăng ký danh sách cách component để sử dụng ở các mục khác được gọi là [application components](structure-application-components.md). Ví dụ: ```php [ 'components' => [ 'cache' => [ 'class' => 'yii\caching\FileCache', ], 'user' => [ 'identityClass' => 'app\models\User', 'enableAutoLogin' => true, ], ], ] ``` Mỗi thành phần ứng dụng đều xác định một mảng các thông tin chứa cặp key-value. Giá trị key đại diện cho định danh của thành phần, trong khi đó value đại diện cho tên class hoặc thông tin về [cấu hình](concept-configurations.md). Bạn có thể đăng ký bất kỳ thành phần nào vào ứng dụng, và các thành phần có thể truy cập ở phạm vi toàn cục qua biểu thức `\Yii::$app->componentID`. Xem thêm mục [Application Components](structure-application-components.md) để biết thêm thông tin. #### [[yii\base\Application::controllerMap|controllerMap]] Thuộc tính này cho phép liên kết tới một định danh (ID) tới lớp của trình điều khiển. Mặc định, Yii sẽ liên kết ID tới các lớp của trình điều khiển dựa trên [các nguyên tắc](#controllerNamespace) (chẳng hạn định danh ID của trình điều khiển `post` sẽ liên kết tới lớp `app\controllers\PostController`). Bằng việc cấu hình những thuộc tính này, bạn có thay đổi các nguyên tắc này cho các trình điều khiển cụ thể . Trong ví dụ sau, `account` sẽ được liên kết tới class `app\controllers\UserController`, trong khi đó `article` sẽ liên kết tới class `app\controllers\PostController`. ```php [ 'controllerMap' => [ [ 'account' => 'app\controllers\UserController', 'article' => [ 'class' => 'app\controllers\PostController', 'enableCsrfValidation' => false, ], ], ], ] ``` Danh sách khóa của các thuộc tính trên đại diện cho ID của trình điều khiển, giá trị của mỗi khóa sẽ đại diện về thông tin tên class của trình điều khiển hoặc [các thông tin về cấu hình](concept-configurations.md). #### [[yii\base\Application::controllerNamespace|controllerNamespace]] Thuộc tính này xác định các thông tin tên lớp mặc định của trình điều khiển. Mặc định là `app\controllers`. Nếu ID của trình điều khiển là `post`, theo quy ước thì tên class của trình điều khiển (không bao gồm không gian tên) sẽ là `PostController`, và tên lớp đầy đủ sẽ là `app\controllers\PostController`. Các lớp trình điều khiển thường được lưu trữ ở thư mục con của thư mục chính các không gian tên. Chẳng hạn, với ID của trình điều khiển `admin/post`, tương ứng với tên lớp đầy đủ sẽ là `app\controllers\admin\PostController`. Điều này khá quan trọng vì các lớp điều khiển có thể được [tải tự động](concept-autoloading.md) và các không gian tên của các lớp điều khiển sẽ khớp với giá trị của các thuộc tính. Nếu không thì, bạn sẽ nhận thông báo lỗi "Không tìm thấy trang" khi truy cập vào ứng dụng. Trong trường hợp khác, nếu bạn muốn bỏ các quy ước này như mổ tả ở trên, bạn có thể tùy chỉnh lại các thuộc tính trong phần [controllerMap](#controllerMap). #### [[yii\base\Application::language|language]] Thuộc tính này mô tả thông tin về ngôn ngữ trong mỗi ứng dụng và nội dung được hiển thị tới user. Giá trị mặc định của thuộc tính là `en`, có nghĩa là tiếng Anh. Bạn có thể tùy chỉnh thuộc tính này rằng nếu ứng dụng của bạn hỗ trợ đa ngôn ngữ . Giá trị của thuộc tính được xác định theo chuẩn [quốc tế hóa](tutorial-i18n.md), bao gồm các thông tin, định dạng ngày giờ, số, vv. Ví dụ, widget [[yii\jui\DatePicker]] sẽ sử dụng các giá trị thuộc tính qua việc xác định ngôn ngữ nào cần được hiển thị và định dạng ngày giờ như thế nào. Khuyến khích bạn xác định các ngôn ngữ dựa theo [IETF language tag](http://en.wikipedia.org/wiki/IETF_language_tag). Ví dụ, `en` là chuẩn cho tiếng anh, trong khi đó `en-US` chuẩn cho tiếng anh ở Mỹ (United States). Xem thêm thông tin về thuộc tính này tại mục [Internationalization](tutorial-i18n.md). #### [[yii\base\Application::modules|modules]] Thuộc tính này mô tả các thông tin về [modules](structure-modules.md) được chứa trong ứng dụng. Thuộc tính này chứa mảng các lớp về module hoặc thông tin về [cấu hình](concept-configurations.md) chứa mảng các khóa về các định danh của module. Ví dụ: ```php [ 'modules' => [ // "booking" mô tả tên class 'booking' => 'app\modules\booking\BookingModule', // "comment" được mô tả với mảng cấu hình 'comment' => [ 'class' => 'app\modules\comment\CommentModule', 'db' => 'db', ], ], ] ``` Tham khảo thêm ở phần [Modules](structure-modules.md) để biết thêm thông tin. #### [[yii\base\Application::name|name]] Thuộc tính này mô tả tên của ứng dụng và hiển thị tới user. Khác với thuộc tính [[yii\base\Application::id|id]], cần phải là tên duy nhất, thì thuộc tính này dùng với mục đích để hiển thị tới user; không cần thiết phải là tên duy nhất. Nếu trong mã nguồn bạn không cần phải dùng tới nó thì bạn không cần phải thiết lập. #### [[yii\base\Application::params|params]] Thuộc tính này là mảng chứa các tham số mà có thể truy cập trong ứng dụng ở phạm vi toàn cầu. Thay vì trong mã nguồn của bạn cần được mã hóa bởi số và ký tự, đây là cách tốt để định nghĩa các tham số của ứng dụng, định nghĩa một lần và có thể được truy cập ở mọi nơi. Ví dụ, bạn có thể định nghĩa kích thước ảnh thumbnail với kích thước như sau: ```php [ 'params' => [ 'thumbnail.size' => [128, 128], ], ] ``` Bạn có thể thực hiện dòng lệnh sau để lấy tham số về kích thước ảnh thumbnail: ```php $size = \Yii::$app->params['thumbnail.size']; $width = \Yii::$app->params['thumbnail.size'][0]; ``` Bạn có thể thay đổi kích thước ảnh thumbnail sau đó, bạn chỉ cần thay đổi vào trong mục cấu hình ứng dụng; bạn không cần phải đụng chạm vào mã nguồn của bạn. #### [[yii\base\Application::sourceLanguage|sourceLanguage]] Thuộc tính mô tả về ngôn ngữ được sử dụng để viết mã nguồn của bạn. Giá trị mặc đinh là `'en-US'`, nghĩa là tiếng Anh Mỹ(United States). Bạn nên cấu hình thuộc tính này nếu nội dung trong mã nguồn của bạn không phải là tiếng Anh. Giống như thuộc tính [language](#language), you should configure this property in terms of an [IETF language tag](http://en.wikipedia.org/wiki/IETF_language_tag). Ví dụ, `en` chuẩn cho tiếng Anh, trong khi `en-US` chuẩn cho tiếng Anh Mỹ (United States). Xem thêm trong phần [Quốc tế hóa](tutorial-i18n.md) để hiểu thêm thuộc tính này. #### [[yii\base\Application::timeZone|timeZone]] Thuộc tính này cung cấp cách khác để thiết lập time zone trong PHP. Qua việc cấu hình thuộc tính này, chủ yếu được gọi qua hàm [date_default_timezone_set()](https://secure.php.net/manual/en/function.date-default-timezone-set.php). Ví dụ: ```php [ 'timeZone' => 'America/Los_Angeles', ] ``` #### [[yii\base\Application::version|version]] Thuộc tính mô tả về phiên bản của ứng dụng. Mặc định là `'1.0'`. Bạn không cần phải thiết lập thuộc tính này nếu như trong mã nguồn của bạn không dùng tới. ### Các thuộc tính thông dụng Những thuộc tính được mô tả trong phần dưới thường có sự cấu hình khác nhau bởi vì các giá trị thường khác nhau . Tuy nhiên, nêu bạn muốn thay đổi giá trị mặc định, bạn có thể cấu hình theo cách của bạn. #### [[yii\base\Application::charset|charset]] Thuộc tính này mô tả các bộ ký tự mà ứng dụng sử dụng. Mặc định là `'UTF-8'`, hầu hết các ứng dụng đều sử dụng. #### [[yii\base\Application::defaultRoute|defaultRoute]] Thuộc tính này mô tả các [route](runtime-routing.md), ứng dụng sẽ dùng route này để thực hiện khi có yêu cầu gửi đến mà không được mô tả. Mỗi router gồm có các module ID, a controller ID, hoặc có thể là một action ID. Ví dụ, `help`, `post/create`, hoặc `admin/post/create`. Nếu action ID không khai báo, thuộc tính sẽ lấy giá trị mặc định được mô tả trong [[yii\base\Controller::defaultAction]]. Đối với [[yii\web\Application| Ứng dụng Web ]], giá trị mặc định của thuộc tính là `'site'`, nghĩa là trình điều khiển `SiteController` được gọi và một hành động mặc định được sử dụng. Như vậy, nếu bạn truy cập vào ứng dụng mà không cung cấp thông tin route, thì ứng dụng mặc định sẽ trả về hành động `app\controllers\SiteController::actionIndex()`. Đối với [[yii\console\Application| Ứng dụng console]], thì giá trị mặc định là `'help'`, đồng nghĩa hành động [[yii\console\controllers\HelpController::actionIndex()]] sẽ được gọi. Như vậy, nếu bạn chạy dòng lệnh `yii` mà không cung cấp các tham số nào khác, thì nó sẽ hiển thị lên màn hình trợ giúp tương ứng kết quả của action index của trình điều khiển HelpController. #### [[yii\base\Application::extensions|extensions]] Thuộc tính này mô tả về danh sách các [thành phần mở rộng (extensions)](structure-extensions.md) đã được cài và sử dụng trong ứng dụng. Mặc định, thuộc tính sẽ nhận mảng được trả về từ file `@vendor/yiisoft/extensions.php`. File `extensions.php` được sinh tự động khi bạn sử dụng [Composer](https://getcomposer.org) để cài các thành phần mở rộng. Ở các trường hợp này, thuộc tính này có thể không cần cấu hình. Trong trường hợp, khi bạn muốn cấu hình các extension một cách thủ công, bạn có thể cấu hình thuộc tính như sau: ```php [ 'extensions' => [ [ 'name' => 'tên extension', 'version' => 'phiên bản', 'bootstrap' => 'BootstrapClassName', // mặc định, giá trị thường là mảng 'alias' => [ // mặc định '@alias1' => 'to/path1', '@alias2' => 'to/path2', ], ], // ... các extensions khác ... ], ] ``` Như bạn thấy ở phần trên, thuộc tính sẽ nhận thông tin bao gồm mảng các cấu hình. Mỗi extension được mô tả là mảng bao gồm các thành phần là`name` và `version`. Nêu muốn extension cần được chạy ở tiến trình [bootstrap](runtime-bootstrapping.md) , mỗi `bootstrap` cần được mô tả về tên lớp hoặc mảng giá trị về [cấu hình](concept-configurations.md) . Mỗi extension có thể định nghĩa thêm các [bí danh (aliases)](concept-aliases.md). #### [[yii\base\Application::layout|layout]] Thuộc tính này mô tả vê layout mặc định được dùng mỗi khi render dữ liệu ra [view](structure-views.md). Giá trị mặc định là `'main'`, nghĩa là file `main.php` nằm trong [đường dẫn layout](#layoutPath) được dùng. Nếu giá trị [layout path](#layoutPath) và [view path](#viewPath) nhận giá trị là mặc định, giá trị mặc định của file layout có thể được thay thế qua bí danh `@app/views/layouts/main.php`. Bạn có thể cấu hình thuộc tính với giá trị `false` nếu bạn muốn tắt giá trị mặc định của layout. #### [[yii\base\Application::layoutPath|layoutPath]] Thuộc tính mô tả đường dẫn nơi lưu trữ file layout. Giá trị mặc định sẽ là `layouts` thư mục con nằm trong [đường dẫn view](#viewPath). Nếu [đường dẫn view](#viewPath) nhận giá trị mặc định , giá trị mặc định tới đường dẫn layout được thay thế như một đường dẫn của bí danh `@app/views/layouts`. Bạn có thể cấu hình như đường dẫn hoặc một [bí danh](concept-aliases.md). #### [[yii\base\Application::runtimePath|runtimePath]] Đường dẫn chứa đường dẫn tới các file tạm của ứng dụng, như file log và cache, cần được tạo ra. Giá trị mặc định của đường dẫn có thể lấy qua bí danh `@app/runtime`. Bạn có thể cấu hình thuộc tính với đường dẫn hoặc một [bí danh](concept-aliases.md). Đường dẫn này cần được quyền ghi đè lên trong quá trình ứng dụng được chạy. Và user không thể truy cập vào đường dẫn , bởi vì các tập tin này có thể chứa các thông tin nhạy cảm. Yii cung cấp cách đơn giản nhất để truy cập vào đường dẫn này qua bí danh là `@runtime`. #### [[yii\base\Application::viewPath|viewPath]] Thuộc tính này chỉ định thư mục để lưu trữ những file view trong mô hình MVC. Giá trị mặc định là là một bí danh `@app/views`. Bạn có thể cấu hình nó với thư mục hoặc đường dẫn [alias](concept-aliases.md). #### [[yii\base\Application::vendorPath|vendorPath]] Thuộc tính này quy định cụ thể về thư mục được quản lý bởi [Composer](https://getcomposer.org). Thư mục này chứa các thư viện được cung cấp bởi nhà phát triển và được dùng trong ứng dụng, bao gồm Yii framework. Giá trị mặc định là một thư mục được cung cấp bởi bí danh `@app/vendor`. Thuộc tính có thể được cấu hình là thư mục hoặc là đường dẫn [alias](concept-aliases.md). Mỗi khi bạn thay đổi thuộc tính này , bạn cần phải thay đổi thông tin cấu hình Composer cho phù hợp. Yii cung cấp cách thức đơn giản để truy cập vào đường dẫn này qua bí danh là `@vendor`. #### [[yii\console\Application::enableCoreCommands|enableCoreCommands]] Thuộc tính này chỉ được hỗ trợ bởi [[yii\console\Application|ứng dụng console]]. Nó được xác định vị trí các dòng lệnh được kích hoạt lên trong phiên bản Yii. Giá trị mặc định là `true`. ## Sự kiện Ứng dụng trong chu trình hoạt động sẽ gán một vài sự kiện để nắm bắt các yêu cầu. Bạn cần liên kết tới các sự kiện vào trong ứng dụng như sau: ```php [ 'on beforeRequest' => function ($event) { // ... }, ] ``` Các mô tả về cú pháp của các sự kiện `on eventName` được mô tả ở trong mục [Cấu hình](concept-configurations.md#configuration-format). Cách khác, bạn có thể nắm bắt các sự kiện tại [tiến trình bootstrapping](runtime-bootstrapping.md) mỗi khi ứng dụng được khởi tạo. Ví dụ: ```php \Yii::$app->on(\yii\base\Application::EVENT_BEFORE_REQUEST, function ($event) { // ... }); ``` ### [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] Sự kiện được gán *trước lúc* ứng dụng nhận các yêu cầu. Tên sự kiện gọi là `beforeRequest`. Mỗi nắm bắt được sự kiện, ứng dụng sẽ tải các thông tin cấu hình và khởi tạo. So it is a good place to insert your custom code via the event mechanism to intercept the request handling process. For example, in the event handler, you may dynamically set the [[yii\base\Application::language]] property based on some parameters. ### [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]] Sự kiện được gán *sau khi* ứng dụng hoàn thành việc xử lý *trước lúc* đưa phản hồi. Tên sự kiện là `afterRequest`. Mỗi khi sự kiện được gán, việc nắm giữ yêu cầu xử lý thành công thì bạn có thể xử lý sau đó các thông tin về yêu cầu xử lý hoặc nội dung phản hồi. Lưu ý rằng thành phần [[yii\web\Response|response]] luôn được gán một vài sự kiện mỗi lúc gửi nội dung tới user. Những sự kiện được gán *sau* sự kiện này là. ### [[yii\base\Application::EVENT_BEFORE_ACTION|EVENT_BEFORE_ACTION]] Sự kiện sẽ được gán *trước* khi thực hiện chạy một [hành động](structure-controllers.md). Tên sự kiện là `beforeAction`. Các tham số của sự kiện được khởi tạo từ [[yii\base\ActionEvent]]. Các sự kiện cần thiết lập thuộc tính [[yii\base\ActionEvent::isValid]] về giá trị `false` để tạm ngưng hành động. Ví dụ: ```php [ 'on beforeAction' => function ($event) { if (some condition) { $event->isValid = false; } else { } }, ] ``` Lưu ý, có một sự kiện tương tự `beforeAction` được gán bởi [modules](structure-modules.md) và [controllers](structure-controllers.md). Ứng dụng sẽ nắm bắt sự kiện này trước , tiếp sau đó bởi modules (nếu có), và cuối cùng là trình điều khiển. Nếu sự kiện đều thiết lập tham số [[yii\base\ActionEvent::isValid]] là `false`, tất cả các yêu cầu nằm trong sự kiện sẽ không được nắm giữ. ### [[yii\base\Application::EVENT_AFTER_ACTION|EVENT_AFTER_ACTION]] Tương tự, sự kiện này được gán *sau khi* khởi chạy một [hành động](structure-controllers.md). Tên sự kiện là `afterAction`. Các tham số của sự kiện được khởi tạo từ [[yii\base\ActionEvent]]. Xem thuộc tính [[yii\base\ActionEvent::result]], sự kiện này có thể truy cập hoặc chỉnh sửa kết quả trả về. Chẳng hạn: ```php [ 'on afterAction' => function ($event) { if (điều kiện) { // thay đổi kết quả $event->result } else { } }, ] ``` Lưu ý rằng với sự kiện `afterAction` được gán bởi [modules](structure-modules.md) và [controllers](structure-controllers.md). Những đối tượng được gán vào trong sự kiện này được ưu tiên ngược lại như sự kiện `beforeAction`. Đó là, trình điều khiển sẽ nắm giữ trước, tiếp đến là module modules (nếu có), và cuối cùng là ứng dụng. ## Vòng đời ứng dụng ![Vòng đời ứng dụng](images/application-lifecycle.png) Khi một [entry script](structure-entry-scripts.md) được gọi và nắm giữ các yêu cầu, vòng đời của ứng dụng sẽ được thực hiện như sau: 1. Entry script sẽ tải các thông tin cấu hình trong ứng dụng ra một mảng. 2. Entry script sẽ khởi tạo mới một ứng dụng: * Phương thức [[yii\base\Application::preInit()|preInit()]] sẽ được gọi, nhằm tải các thông tin cấu hình mà có sự ưu tiên cao , như thuộc tính [[yii\base\Application::basePath|basePath]]. * Đăng ký một [[yii\base\Application::errorHandler|error handler]]. * Cấu hình các thuộc tính trong ứng dụng. * Phương thức [[yii\base\Application::init()|init()]] sẽ được gọi và phương thức [[yii\base\Application::bootstrap()|bootstrap()]] sẽ tải thành phần bootstrapping. 3. Entry script sẽ gọi phương thức [[yii\base\Application::run()]] để chạy ứng dụng: * Sự kiện [[yii\base\Application::EVENT_BEFORE_REQUEST|EVENT_BEFORE_REQUEST]] sẽ được gán sau đó. * Xử lý các yêu cầu: chuyển các yêu cầu vào [bộ định tuyến (route)](runtime-routing.md) và các tham số liên quan; khởi tạo đối tượng module, controller, và action như phần mô tả ở bộ định tuyến; và khởi chạy action. * Gán sự kiện [[yii\base\Application::EVENT_AFTER_REQUEST|EVENT_AFTER_REQUEST]]. * Gửi phản hồi tới user. 4. Entry script tiếp nhận trạng thái kết thúc từ ứng dụng hoàn tất xử lý tiến trình.