【问题标题】:In CakePHP, how to add a controller file to the /app/controllers/ directory, extending this class from a controller in the /core/cake/ directory?在 CakePHP 中,如何将控制器文件添加到 /app/controllers/ 目录,从 /core/cake/ 目录中的控制器扩展这个类?
【发布时间】:2020-05-20 19:04:27
【问题描述】:

core\cake\libs\controller\images_controller.php,我有这个类:

<?php
class ImagesController extends AppController
{
    ....................
    function view()
    {
        ....................
    }
    ....................
}
?>

问题是我需要修改ImagesController::view() 的行为,但为了做到这一点,我直接修改了core\cake\libs\controller\images_controller.php。修改core\cake\ 不是一个好习惯。我应该将代码添加到app\,而不是覆盖 CakePHP 中的类。我打算做的是恢复我对core\cake\libs\controller\images_controller.php 所做的更改,特别是对ImagesController::view() 方法的更改。然后,我打算将一个名为images_controller.php 的控制器文件添加到/app/controllers 目录中。此类将扩展core\cake\libs\controller\images_controller.php 中的ImagesController,只需添加新的view() 函数,该函数将覆盖核心中的view() 函数。我认为在app\core\cake\ 中使用相同的类名是可以的,但我不确定。我可以试试。在/app/controllers 中,我所有的课程都从AppController 扩展而来。例如:

class UsersController extends AppController{
    ....................
}

但现在,在我看来,在 /app/controllers 中,我必须创建一个这样的类:

class ImagesController extends ImagesController{
    ....................
}

基本上,我试图在/app/controllers 中创建的ImagesController 类应该从我在core\cake\libs\controller\images_controller.php 中拥有的ImagesController 类扩展,这意味着从core\cake\libs\controller\images_controller.php 中的此类扩展/继承:

<?php
class ImagesController extends AppController
{
    ....................
    function view()
    {
        ....................
    }
    ....................
}
?>

class ImagesController extends ImagesController 对我来说看起来不正确,因为我不确定 CakePHP 是否会理解我想说我在/app/controllers 中的班级名称将是ImagesController 并且我正在尝试扩展它来自 core\cake\libs\controller\images_controller.php 中定义的名为 ImagesController 的类。你怎么能做到这一点?谢谢。

【问题讨论】:

  • CakePHP 核心中没有图像控制器之类的东西,也就是说,无论你在那里做什么,都已经有一个修改过的核心。
  • @ndm 换句话说,class ImagesController extends AppController 本来就不应该写在core\cake\libs\controller\images_controller.php 中。我所要做的就是将class ImagesController extends AppControllercore/cake/libs/controller/images_controller.php 移动到/app/controllers/images_controller.php,对吗?
  • 理论上应该可行,是的,但我不确定创建文件的人在这样做时的想法,以及他们可能做了哪些其他事情可能会阻止这种情况发生在职的。理想情况下,该应用程序已被测试用例正确覆盖,因此您可以简单地尝试查看。
  • @ndm 你是对的。它按照您的建议工作,只需将文件从core/cake/... 移动到app/...。谢谢你。请写下您的评论作为答案,以便我接受并将此问题标记为最佳答案。

标签: php inheritance cakephp cakephp-1.3 cakephp-1.2


【解决方案1】:

如 cmets 中所述,CakePHP 核心不附带 ImagesController 类,这意味着核心已被修改,文件不应该放在首位。

只要这是一个简单的错误,并且不受依赖于核心文件夹中存在的文件的其他修改的约束,应该可以简单地将其移动到应用程序级别的 controllers 文件夹中,即app/controllers/images_controller.php

【讨论】:

    【解决方案2】:

    要解决您的问题中涉及扩展同名类的部分,您可以执行以下操作:

    namespace App\Controller
    
    use Foreign\Namespace\Controller\SameNameController as DifferentName
    
    class SameNameController extends DifferentName {
    
    //code here
    
    }
    
    [more details here][https://www.php.net/manual/en/language.namespaces.importing.php]
    
    
    
    

    【讨论】:

    • 这是在 CakePHP 框架中实现的方式,还是您提出的解决方案是扩展同名类的通用 PHP 方式?我知道 CakePHP 也是 PHP 但它是一个框架,所以我想知道您是遵循框架规则还是仅在没有 CakePHP 框架的情况下提供一种通用的 PHP 做事方式。
    • 这是 通用 PHP 解决方案。我不知道您可以在 CakePHP 中专门使用任何其他方法。
    • CakePHP 1.x 不支持或使用命名空间。
    • 我的建议是通用的 php 语法。而且,您会发现 Cake 实际上并没有建立额外的 php 工作方法,而是与 php 标准和最佳实践保持一致。
    • @ndm, use as 无论所讨论的类是否在命名空间中都应该可以工作?
    猜你喜欢
    • 2012-09-11
    • 2015-07-19
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    相关资源
    最近更新 更多