cakephp如何拥有其他控制器扩展的控制器类

时间:2011-04-25 14:23:39

标签: cakephp controller

我想要一个扩展AppController的ThingsController。我的个人控制器将扩展ThingsController。每个模型的功能都是重复的,每个模型都有自己的冗余控制器。

A)这是个好主意吗?

B)我该怎么办?我尝试将它添加到controllers目录中,但是蛋糕没找到它。

c)我应该如何在beforeFilter和beforeRender中编码?这包括Auth。

2 个答案:

答案 0 :(得分:10)

它会正常工作。控制器只不过是php类,你可以让它们以你喜欢的方式继承,只要Cake可以找到它们。

  1. 创建您的ThingsController并将其放在app / controllers / things_controller.php
  2. 在派生控制器中,在类定义上方添加App::import('Controller', 'Things');
  3. 正确定义班级:class TestController extends ThingsController {}
  4. 过滤器将像往常一样继承。

答案 1 :(得分:1)

现在您可以使用App::uses('ClassName', 'Folder/Subfolder')

扩展类对数据库中的表没有任何作用...只要扩展模型,扩展模型名称就是蛋糕在数据库中查找的表名。您不能将公共字段存储在公用表中,也不能将扩展字段存储在扩展类表中。为此你无论如何都需要模型关联,所以在cakePHP中扩展模型和控制器并没有什么意义。要让多个模型处理同一个表,你可以使用$ useTable覆盖模型在模型定义中使用的表,但我无法想象除了你的项目需要与表格交谈之外重命名。

所以在你的情况下我会说Automobile extends AppModelCar extends AppModelTruck extends AppModel,(普通蛋糕模型)Truck $belongsTo AutomobileCar $belongsTo Automobile。将您的常用属性和方法放在汽车中,就像您要从Automobile扩展一样,而不是继承方法,您可以通过模型关联访问它们,如$this->Truck->Automobile->vin中的对象表示法而不是{{1}这就是你想要继承的东西。

换句话说,通过扩展cakePHP中的模型,您将无法更接近数据库规范化 - 这是通过模型关联完成的。你从AppModel和AppController继承,以获得像find(),save()等基本方法和回调,如beforeFilter()和afterRender()等。当你覆盖像beforeFilter()之类的回调时,你的问题是WRT扩展类,你必须在方法中调用$this->Truck->vin或者事情会破坏。

我想你可以有一个表格,其中包含扩展属性的所有字段(带有字段year,vin和box_length,trunk_litres的表汽车),然后从基类扩展Models并覆盖扩展模型的表用于使用基类表名(parent::beforeFilter()),但这会在表中留下大量空字段,并且不是正确的规范化表结构。这是一种说法,VIN在所有扩展类中都是一个独特的领域而不需要太多努力。但不确定ID的auto_increment在这种情况下是如何工作的。但是,从给定类型的公共表记录中提取与扩展类的类型(class Car extends Auto {$useTable = auto}table auto has field auto_type)相匹配需要额外的工作,所以没有收益。

同样,观点没有任何好处。如果您有class Truck extends Auto {$autoType = 'truck'}然后class AutoController extends AppController { function displayListing()},则可以致电class TruckController extends AutoController,但除非您将操作告知TruckController->display_listing(),否则您需要在$this->render('Auto/display_listing')中创建视图的副本如果你执行覆盖,那么/View/Truck/display_listing.ctp中的视图必须有许多if语句来呈现特定于Truck或Car的视图部分,所以再次没有增益。