CakePHP的控制器

2018-11-29 18:25 更新

控制器顾名思义控制应用程序。它就像模型和视图之间的桥梁。控制器处理请求数据,确保调用正确的模型、响应或视图。控制器的类中的方法被称为行为 。每个控制器遵循以下命名规格。控制器类名是复数形式,驼峰结构,并以Controller结束-如:PostsController。

AppController

AppConttroller类是所有应用程序控制器的父类。该类扩展至CakePHP的Controller类。 AppController在src/Controller/AppController.php中定义。该文件包含下面的代码。

<?php
   namespace AppController;
   use CakeControllerController;
   use CakeEventEvent;

   class AppController extends Controller{
      public function initialize(){
         parent::initialize();
         $this->loadComponent('RequestHandler');
         $this->loadComponent('Flash');
      }
      public function beforeRender(Event $event){
         if (!array_key_exists('_serialize', $this->viewVars) &&
            in_array($this->response->type(), ['application/json', application/xml'])) {
            $this->set('_serialize', true);
         }
      }
   }

AppController可以用来加载在你的应用程序的每个控制器中会使用到的组件。在AppController中创建的属性和方法可以在扩展至它的所有控制器中使用。initialize()方法将在构造函数的末尾被调用来加载组件。

控制器行为

控制器类中的方法被称为行为。行为负责给发出请求的浏览器/用户发送适当的响应。试图通过行为来展现,或者说通过控制器的方法来展现。

class RecipesController extends AppController{
   public function view($id){
      // Action logic goes here.
   }
   public function share($customerId, $recipeId){
      // Action logic goes here.
   }
   public function search($query){
      // Action logic goes here.
   }
}

正如你可以在上面的例子中看到的,RecipesController具有3种行为- view,share和search 。

重定向

要重定向用户到相同控制器的另一个行为,我们可以使用的setAction()方法。以下是用于setAction()方法的语法 -

CakeControllerController::setAction($action, $args...)

下面的代码将用户重定向到同一控制器的index行为。

$this->setAction('index');

以下示例显示了上述方法的使用。

在以下项目中,修改如下config/routes.php文件

config/routes.php文件

<?php
   use CakeCorePlugin;
   use CakeRoutingRouteBuilder;
   use CakeRoutingRouter;

   Router::defaultRouteClass('DashedRoute');
   Router::scope('/', function (RouteBuilder $routes) {
      $routes->connect('/redirectcontroller',['
         controller'=>'Redirects','action'=>'action1']);
      
      $routes->connect('/redirectcontroller2',['
         controller'=>'Redirects','action'=>'action2']);
      
      $routes->fallbacks('DashedRoute');
   });
   Plugin::routes();

src/Controller/下创建RedirectsController.php文件。复制以下代码至其中。

src/Controller/RedirectsController.php

<?php
   namespace AppController;
   use AppControllerAppController;
   use CakeORMTableRegistry;
   use CakeDatasourceConnectionManager;

   class RedirectsController extends AppController{
      public function action1(){
      }
      public function action2(){
         echo "redirecting from action2";
         $this->setAction('action1');
      }
   }
?>

src/Template目录下创建一个Redirects目录,在此Redirects目录下创建一个名为action1.ctp一个视图(View)文件。复制以下代码至其中。

src/Template/Redirects/action1.ctp

This is an example of how to redirect within controller.

通过访问以下网址执行上面的例子。

http://localhost:85/CakePHP/redirect-controller

输出

执行后,您会看到以下输出。


现在,请访问以下网址- http://localhost:85/CakePHP/redirect-controller2

上述网址会产生以下输出。


加载模型

在CakePHP中,一个模型可以使用loadModel()方法来加载。以下使用loadModel()方法的语法。

语法

CakeControllerController::loadModel(string $modelClass, string $type)

上面的函数有两个参数-

  • 第一个参数是模型类的名字。

  • 第二个参数是需要加载的库的类型。

如果要在控制器中加载文章模型,那么可以通过给控制器的行为添加以下代码进行加载。

$this->loadModel('Articles');

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号