我想要一个扩展AppController的ThingsController。我的个人控制器将扩展ThingsController。每个模型的功能都是重复的,每个模型都有自己的冗余控制器。
A)这是个好主意吗?
B)我该怎么办?我尝试将它添加到controllers目录中,但是蛋糕没找到它。
c)我应该如何在beforeFilter和beforeRender中编码?这包括Auth。
答案 0 :(得分:10)
它会正常工作。控制器只不过是php类,你可以让它们以你喜欢的方式继承,只要Cake可以找到它们。
App::import('Controller', 'Things');
。class TestController extends ThingsController {}
过滤器将像往常一样继承。
答案 1 :(得分:1)
现在您可以使用App::uses('ClassName', 'Folder/Subfolder')
扩展类对数据库中的表没有任何作用...只要扩展模型,扩展模型名称就是蛋糕在数据库中查找的表名。您不能将公共字段存储在公用表中,也不能将扩展字段存储在扩展类表中。为此你无论如何都需要模型关联,所以在cakePHP中扩展模型和控制器并没有什么意义。要让多个模型处理同一个表,你可以使用$ useTable覆盖模型在模型定义中使用的表,但我无法想象除了你的项目需要与表格交谈之外重命名。
所以在你的情况下我会说Automobile extends AppModel
,Car extends AppModel
,Truck extends AppModel
,(普通蛋糕模型)Truck $belongsTo Automobile
,Car $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的视图部分,所以再次没有增益。