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

cakephp如何拥有其他控制器扩展的控制器类,cakephp,controller,Cakephp,Controller,我想要一个扩展AppController的ThingsController。我的个人控制器将扩展ThingsController。每个模型的功能都是重复的,每个模型都有自己的主要冗余控制器 A) 这是个好主意吗 B) 我该怎么做?我尝试将其添加到控制器目录,但cake没有找到它 c) 我应该如何在beforeFilter和beforeRender中编码?这包括Auth 它会很好用的。控制器只不过是php类,您可以让它们以任何方式继承,只要Cake可以找到它们 创建ThingsController

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

A) 这是个好主意吗

B) 我该怎么做?我尝试将其添加到控制器目录,但cake没有找到它


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

它会很好用的。控制器只不过是php类,您可以让它们以任何方式继承,只要Cake可以找到它们

  • 创建ThingsController并将其放置在app/controllers/things\u controller.php中
  • 在派生控制器中,添加
    App::import('controller','Things')在类定义上方
  • 正确定义类:
    class TestController扩展ThingsController{}

  • 过滤器将像正常情况一样继承。

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

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

    所以在你的例子中,我会说
    汽车扩展AppModel
    汽车扩展AppModel
    卡车扩展AppModel
    ,(普通蛋糕模型)
    卡车$belongstoautomobile
    汽车$belongstoautomobile
    。将通用属性和方法放在Automobile中,就像要从Automobile进行扩展一样,而不是继承这些方法,您可以通过模型关联来访问它们,如使用对象符号的
    $this->Truck->Automobile->vin
    ,而不是使用继承的
    $this->Truck->vin

    换句话说,通过在cakePHP中扩展模型,您不会更接近数据库规范化——这是通过模型关联实现的。您从AppModel和AppController继承,以获得find()、save()等基本方法以及beforeFilter()和afterRender()等回调。请回答您的问题,当您在扩展类中重写beforeFilter()等回调时,必须调用
    parent::beforeFilter()
    在方法内部,否则会出现问题

    我假设您可以有一个表,其中包含扩展属性的所有字段(表automobile包含字段year、vin以及box_length、trunk_lills),然后从基类扩展模型,并覆盖扩展模型使用基类表名的表(
    class Car extensed Auto{$useTable=Auto}
    ),但是这会在表中留下大量的空字段,并且不是一个正确的规范化表结构。这将是一种方式,可以说,在所有扩展类中,VIN是唯一的字段,而无需付出太多努力。但不确定在这种情况下ID的自动增量是如何工作的。但是,从给定类型的公共表中提取与扩展类类型匹配的记录需要额外的工作(
    table auto具有字段auto_type
    class Truck extensed auto{$autoType='Truck'}
    ),因此没有收益


    同样,视图也没有好处。如果您有
    类自动控制器扩展AppController{function displaying()}
    ,然后
    类TruckController扩展自动控制器
    ,您可以调用
    TruckController->display_listing()
    ,但除非您告诉操作
    $this->render('Auto/display_listing'))
    您需要在
    /view/Truck/display_listing.ctp
    中创建视图的副本,如果您执行覆盖,则
    view/Auto/display_listing.ctp
    中的视图必须有许多if语句来呈现特定于Truck或Car的视图部分,因此,没有收获。

    现在,如果你使用PHP5.4+,你可以使用Traits,它的优点是一个类可以有几个Traits。在PHP中没有多重继承,试图将大量共享代码塞进继承树可能会变得复杂。请参阅上面建议的使用App::import,以及2.0文档中建议的使用App::uses,这两种方法都会为我产生一个类未找到错误。