【问题标题】:cakephp how to have a controller class that other controllers extendcakephp 如何拥有一个其他控制器扩展的控制器类
【发布时间】:2011-08-12 08:47:03
【问题描述】:

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

A) 这是个好主意吗?

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

c) 我应该如何在 beforeFilter 和 beforeRender 中编码?这包括身份验证。

【问题讨论】:

    标签: cakephp controller


    【解决方案1】:

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

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

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

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

    我想你可以有一个表,其中包含扩展属性的所有字段(表汽车,字段为 year、vin 以及 box_length、trunk_litres),然后从基类扩展模型并覆盖扩展模型的表使用基类表名(class Car extends Auto {$useTable = auto}),但这会在表中留下很多空字段,并且不是正确的规范化表结构。可以说,VIN 是所有扩展类中的一个独特领域,但无需付出太多努力。不过,不确定在这种情况下 ID 的 auto_increment 是如何工作的。但是从给定类型的公共表中提取与扩展类的类型(table auto has field auto_typeclass 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 语句才能呈现特定于卡车或汽车的视图部分,所以同样没有收获。

    【讨论】:

      【解决方案2】:

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

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

      过滤器将照常继承。

      【讨论】:

      • 现在如果使用 PHP 5.4+,你可以使用 Traits,它的优点是一个类可以有多个。在 PHP 中没有多重继承,试图将大量共享代码塞进继承树可能会变得复杂。见php.net/manual/en/language.oop5.traits.php
      • 按照上面的建议使用 App::import,以及按照 2.0 文档中的建议使用 App::uses,对我来说都产生了 Class not found 错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 2011-08-19
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 2014-08-20
      相关资源
      最近更新 更多