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');
更多建议: