mirror of
				https://github.com/yiisoft/yii2.git
				synced 2025-11-01 03:26:36 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			144 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| Saying Hello
 | |
| ============
 | |
| 
 | |
| This section describes how to create a new "Hello" page in your application.
 | |
| To achieve this goal, you will create an [action](structure-controllers.md#creating-actions) and
 | |
| a [view](structure-views.md):
 | |
| 
 | |
| * The application will dispatch the page request to the action
 | |
| * and the action will in turn render the view that shows the word "Hello" to the end user.
 | |
| 
 | |
| Through this tutorial, you will learn three things:
 | |
| 
 | |
| 1. how to create an [action](structure-controllers.md#creating-actions) to respond to requests,
 | |
| 2. how to create a [view](structure-views.md) to compose the response's content, and
 | |
| 3. how an application dispatches requests to [actions](structure-controllers.md#creating-actions).
 | |
| 
 | |
| 
 | |
| Creating an Action <span id="creating-action"></span>
 | |
| ------------------
 | |
| 
 | |
| For the "Hello" task, you will create a `say` [action](structure-controllers.md#creating-actions) that reads
 | |
| a `message` parameter from the request and displays that message back to the user. If the request
 | |
| does not provide a `message` parameter, the action will display the default "Hello" message.
 | |
| 
 | |
| > Info: [Actions](structure-controllers.md#creating-actions) are the objects that end users can directly refer to for
 | |
|   execution. Actions are grouped by [controllers](structure-controllers.md). The execution result of
 | |
|   an action is the response that an end user will receive.
 | |
| 
 | |
| Actions must be declared in [controllers](structure-controllers.md). For simplicity, you may
 | |
| declare the `say` action in the existing  `SiteController`. This controller is defined
 | |
| in the class file `controllers/SiteController.php`. Here is the start of the new action:
 | |
| 
 | |
| ```php
 | |
| <?php
 | |
| 
 | |
| namespace app\controllers;
 | |
| 
 | |
| use yii\web\Controller;
 | |
| 
 | |
| class SiteController extends Controller
 | |
| {
 | |
|     // ...existing code...
 | |
| 
 | |
|     public function actionSay($message = 'Hello')
 | |
|     {
 | |
|         return $this->render('say', ['message' => $message]);
 | |
|     }
 | |
| }
 | |
| ```
 | |
| 
 | |
| In the above code, the `say` action is defined as a method named `actionSay` in the `SiteController` class.
 | |
| Yii uses the prefix `action` to differentiate action methods from non-action methods in a controller class.
 | |
| The name after the `action` prefix maps to the action's ID.
 | |
| 
 | |
| When it comes to naming your actions, you should understand how Yii treats action IDs. Action IDs are always
 | |
| referenced in lower case. If an action ID requires multiple words, they will be concatenated by dashes
 | |
| (e.g., `create-comment`). Action method IDs are mapped to action names by removing any dashes from the IDs,
 | |
| capitalizing the first letter in each word, and prefixing the resulting string with `action`. For example,
 | |
| the action ID `create-comment` corresponds to the action method name `actionCreateComment`.
 | |
| 
 | |
| The action method in our example takes a parameter `$message`, whose value defaults to `"Hello"` (in exactly
 | |
| the same way you set a default value for any function or method argument in PHP). When the application
 | |
| receives a request and determines that the `say` action is responsible for handling said request, the application will
 | |
| populate this parameter with the same named parameter found in the request. In other words, if the request includes
 | |
| a `message` parameter with a value of `"Goodbye"`, the `$message` variable within the action will be assigned that value.
 | |
| 
 | |
| Within the action method, [[yii\web\Controller::render()|render()]] is called to render
 | |
| a [view](structure-views.md) file named `say`. The `message` parameter is also passed to the view
 | |
| so that it can be used there. The rendering result is returned by the action method. That result will be received
 | |
| by the application and displayed to the end user in the browser (as part of a complete HTML page).
 | |
| 
 | |
| 
 | |
| Creating a View <span id="creating-view"></span>
 | |
| ---------------
 | |
| 
 | |
| [Views](structure-views.md) are scripts you write to generate a response's content.
 | |
| For the "Hello" task, you will create a `say` view that prints the `message` parameter received from the action method:
 | |
| 
 | |
| ```php
 | |
| <?php
 | |
| use yii\helpers\Html;
 | |
| ?>
 | |
| <?= Html::encode($message) ?>
 | |
| ```
 | |
| 
 | |
| The `say` view should be saved in the file `views/site/say.php`. When the method [[yii\web\Controller::render()|render()]]
 | |
| is called in an action, it will look for a PHP file named as `views/ControllerID/ViewName.php`.
 | |
| 
 | |
| Note that in the above code, the `message` parameter is [[yii\helpers\Html::encode()|HTML-encoded]]
 | |
| before being printed. This is necessary as the parameter comes from an end user, making it vulnerable to
 | |
| [cross-site scripting (XSS) attacks](https://en.wikipedia.org/wiki/Cross-site_scripting) by embedding
 | |
| malicious JavaScript code in the parameter.
 | |
| 
 | |
| Naturally, you may put more content in the `say` view. The content can consist of HTML tags, plain text, and even PHP statements.
 | |
| In fact, the `say` view is just a PHP script that is executed by the [[yii\web\Controller::render()|render()]] method.
 | |
| The content printed by the view script will be returned to the application as the response's result. The application will in turn output this result to the end user.
 | |
| 
 | |
| 
 | |
| Trying it Out <span id="trying-it-out"></span>
 | |
| -------------
 | |
| 
 | |
| After creating the action and the view, you may access the new page by accessing the following URL:
 | |
| 
 | |
| ```
 | |
| https://hostname/index.php?r=site%2Fsay&message=Hello+World
 | |
| ```
 | |
| 
 | |
| 
 | |
| 
 | |
| This URL will result in a page displaying "Hello World". The page shares the same header and footer as the other application pages.
 | |
| 
 | |
| If you omit the `message` parameter in the URL, you would see the page display just "Hello". This is because `message` is passed as a parameter to the `actionSay()` method, and when it is omitted,
 | |
| the default value of `"Hello"` will be used instead.
 | |
| 
 | |
| > Info: The new page shares the same header and footer as other pages because the [[yii\web\Controller::render()|render()]]
 | |
|   method will automatically embed the result of the `say` view in a so-called [layout](structure-views.md#layouts) which in this
 | |
|   case is located at `views/layouts/main.php`.
 | |
| 
 | |
| The `r` parameter in the above URL requires more explanation. It stands for [route](runtime-routing.md), an application wide unique ID
 | |
| that refers to an action. The route's format is `ControllerID/ActionID`. When the application receives
 | |
| a request, it will check this parameter, using the `ControllerID` part to determine which controller
 | |
| class should be instantiated to handle the request. Then, the controller will use the `ActionID` part
 | |
| to determine which action should be instantiated to do the real work. In this example case, the route `site/say`
 | |
| will be resolved to the `SiteController` controller class and the `say` action. As a result,
 | |
| the `SiteController::actionSay()` method will be called to handle the request.
 | |
| 
 | |
| > Info: Like actions, controllers also have IDs that uniquely identify them in an application.
 | |
|   Controller IDs use the same naming rules as action IDs. Controller class names are derived from
 | |
|   controller IDs by removing dashes from the IDs, capitalizing the first letter in each word,
 | |
|   and suffixing the resulting string with the word `Controller`. For example, the controller ID `post-comment` corresponds
 | |
|   to the controller class name `PostCommentController`.
 | |
| 
 | |
| 
 | |
| Summary <span id="summary"></span>
 | |
| -------
 | |
| 
 | |
| In this section, you have touched the controller and view parts of the MVC architectural pattern.
 | |
| You created an action as part of a controller to handle a specific request. And you also created a view
 | |
| to compose the response's content. In this simple example, no model was involved as the only data used was the `message` parameter.
 | |
| 
 | |
| You have also learned about routes in Yii, which act as the bridge between user requests and controller actions.
 | |
| 
 | |
| In the next section, you will learn how to create a model, and add a new page containing an HTML form.
 | 
