codecamp

CakePHP的控制器

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

CakePHP的重定向路由
CakePHP的视图
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

CakePHP Useful Resources

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }