【问题标题】:Override Cakephp 3 core class覆盖 Cakephp 3 核心类
【发布时间】:2016-03-08 20:33:04
【问题描述】:

我想重写存在于 CakePHP 3 核心中的一个函数(更具体地说是Cake\Database\ValueBinder)。

我怎样才能做到这一点?我尝试将类复制到 src/Database/ 并将命名空间从 Cake 更改为 App。我使用了AppController 中的课程,但没有运气。

提前致谢

阿德里安

【问题讨论】:

  • 对我来说,这听起来好像你真的不知道你真正想要做什么。如果您通过“覆盖核心类”来描述您试图解决的实际问题,您很可能会得到更好的帮助
  • @ndm 感谢您的回答,但我有一个用例,我确实需要覆盖这个特定的类。可悲的是,您的回答既没有帮助也没有回答我的问题。
  • 我很确定您实际上不需要这样做(自定义/扩展值绑定器可以分配给开箱即用的查询对象)。但是,无论如何,您都应该解释您的用例,以便任何人都能给您正确的答案。
  • @ndm 听起来更像。我没有在 CakePHP Book / API 中找到使用自己的值绑定器的选项。这个怎么做?我可以将自己的值绑定器设置为默认值绑定器吗?
  • 是的,您可以通过创建一个扩展的 Query 类来覆盖 valueBinder() 方法。可以通过重写 Table::query() 将自定义查询类设为默认值。如果您也需要影响较低级别的访问权限,则需要创建(并使用)扩展数据源 Connection 类并覆盖 Connection::newQuery()。

标签: cakephp cakephp-3.x cakephp-3.2


【解决方案1】:

ndm 在这方面帮助了我很多(请参阅我的问题的 cmets),但由于他没有发布答案,我现在正在这样做。


可以通过在我的查询中设置ValueBinder 来使用自己的$this->Table->find()->valueBinder(myOwnValueBinder)

为了使我自己的代码中的默认值绑定器(在大多数情况下足够),可以使用例如一个 AppTable,从 CakePHP 2 中得知,它扩展到 Table 并使所有其他 *Table 类扩展 AppTable。现在只需要创建以下方法:

public function query() {
    return parent::query()->valueBinder(myOwnValueBinder);
}

如果需要所有代码都使用自定义ValueBinder,则必须创建(并使用)扩展数据源连接类。在此类中,Connection::newQuery() 必须被覆盖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多