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



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

A)这是个好主意吗?

B)我怎么做?我试着把它添加到控制器目录,但是cake没有找到它。

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

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

  1. 创建你的ThingsController并把它放到app/controllers/things_controller.php中
  2. 在您的派生控制器中,在类定义上方添加App::import('Controller', 'Things');
  3. 正确定义类:class TestController extends ThingsController {}

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

扩展类对数据库中的表没有任何帮助…一旦扩展了模型,扩展的模型名就是cake将在数据库中查找的表名。您不能将公共字段存储在公共表中,而将扩展字段存储在扩展类表中。为此,无论如何都需要模型关联,因此在cakePHP中扩展模型和控制器没有多大意义。要让多个模型处理同一个表,您可以使用$useTable覆盖模型在模型定义中使用的表,但我无法想象除了您的项目需要与您不能重命名的表对话之外还有什么意义。

所以在你的情况下,我会说Automobile extends AppModel, Car extends AppModel, Truck extends AppModel,(正常蛋糕模型)Truck $belongsTo Automobile, Car $belongsTo Automobile。把你常用的属性和方法放在Automobile中,就像你要从Automobile扩展一样,而不是继承这些方法,你通过模型关联来访问它们,就像在$this->Truck->Automobile->vin中使用对象表示法一样,而不是用$this->Truck->vin,这是你想用继承来做的。

换句话说,您不会通过扩展cakePHP中的模型来接近数据库规范化——这是通过模型关联完成的。你从AppModel和AppController继承,以便获得基本的方法,如find(), save()等和回调,如beforeFilter()和afterRender()等。WRT您的问题,当您在扩展类中覆盖beforeFilter()等回调时,您必须在方法内部调用parent::beforeFilter(),否则事情会中断。

我假设你可以有一个表的所有字段的扩展属性(表汽车与字段年,vin和box_length, trunk_l),然后从基类扩展模型和覆盖表,扩展模型使用使用基类表名(class Car extends Auto {$useTable = auto}),但这留下了很多空字段在表中,不是一个适当的规范化的表结构。这将是一种方式,可以说,VIN是所有扩展类中唯一的字段,而不需要太多的努力。不确定在这种情况下,ID的auto_increment是如何工作的。但是需要额外的工作来从给定类型的公共表记录中提取与扩展类类型(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中创建一个视图的副本,如果你做覆盖,那么View/Auto/display_listing.ctp中的视图将不得不有许多if语句来渲染特定于卡车或汽车的视图部分,所以再次没有收益。

最新更新