覆盖 Pimcore 的核心控制器

· 1 分钟阅读

我从事 Pimcore 项目已经有一段时间了,从来没有接触过 PHP 和 Symfony,所以这是一个巨大的挑战。

该文档很棒,我的意思是,说真的,它很棒,但看起来它不是为语言/框架的初学者制作的,所以我所做的一切都必须记下来。

在了解到可以使用捆绑包扩展 Pimcore 后,我花了很多时间尝试覆盖控制器、javascript 方法和更多东西。

因此,在这篇文章中,我将解释我如何设法覆盖控制器。如何覆盖 javascript 文件将在稍后介绍 😎。

创建包

首先,我们需要为其创建一个包,这非常简单,因为它记录在 Pimcore 文档 中,我们只需要在项目文件夹上运行 bin/console pimcore:generate:bundle --namespace=EmiDemo/EmiDemoBundle 即可。

它会提示一些问题,但无需担心。

它将在 src 文件夹下创建一个新文件夹,其中包含我们之前声明的命名空间,其中我们将拥有该包的所有必需文件。

此外,该插件将被 Pimcore 管理站点检测到,但它将被禁用,您必须启用它才能开始使用它。

重写控制器中的方法

要覆盖控制器中的方法,首先显然您需要找到要更新的操作,这看起来很简单,但我会按照我通常的方式向您提供(从我的队友 Cesar 那里学习)。

首先进入您认为控制器采取操作的页面,在我的例子中,我想检查打开资产时加载的页面

图片来自 Gyazo

然后只需打开控制台并进入网络选项卡,再次执行相同的步骤并尝试查找操作

图片来自 Gyazo

通过此信息,您可以看到加载资产的操作是 http://localhost/admin/asset/get-data-by-id?_dc=1607601778450&id=2&type=image。由此我们可以看到控制器操作是get-data-by-id

找到核心控制器中的action

对我来说,最简单的方法就是在 Visual Studio Code 中的所有文件中查找

图片来自 Gyazo

可能它会找到多个,所以您必须看一下并决定哪一个是那个,在我们的例子中,我们正在使用资产,所以很明显我们想要使用 AssetController.php

修改核心控制器

这取决于开发人员,我通常不这样做,因为覆盖控制器并从那里开发会更快。但我建议首先更新核心包中的控制器,看看您的更改是否有效。

在我们的例子中,我只会在方法的开头返回一条消息来检查它是否有效。

return $this->adminJson(['success' => false, 'message' => "Overriding the getDataByIdAction in the core!!"]);

图片来自 Gyazo

然后让我们重新加载资产并检查网络选项卡

图片来自 Gyazo让我们保留其中的内容,以便稍后我们知道我们正在使用捆绑消息而不是核心消息。

现在,让我们将其复制到临时文件中以跟踪我们所做的事情。

将这些更改移至捆绑包

现在为了将这些更改转移到我们的包中,但首先我们需要来自核心控制器的一些内容:

  • 命名空间
  • 进口
  • 控制器名称

图片来自 Gyazo

显然,方法 getDataByIdAction 是我们想要重写的方法。

暴露控制器

我们需要公开控制器,为了做到这一点,您需要进入文件 /src/EmiDemo/EmiDemoBundle/Resources/config/pimcore/routing.yml 并添加

options:
        expose: true

此外,我们需要将 prefix 更改为我们要覆盖的控制器,在我们的例子中为 admin 控制器。

所以最后 ti 看起来像这样

emi_demo_emi_demo:
    resource: "@EmiDemoEmiDemoBundle/Controller/"
    type:     annotation
    prefix:   /admin
    options:
        expose: true

默认控制器.php

在我们的文件中,我们将添加导入并使用我们将覆盖的控制器扩展控制器

图片来自 Gyazo

然后,我们只需从核心控制器复制方法,并在我们的例子中更新我们返回的消息。

图片来自 Gyazo

如果你还记得的话,我们已经在核心控制器中有一条消息:Overriding the getDataByIdAction in the core!!,现在我们应该看到Overriding the getDataByIdAction in the bundle!!

图片来自 Gyazo

让我们不返回任何内容,看看我们现在可以像以前一样看到页面

图片来自 Gyazo

注释掉return语句并重新加载

图片来自 Gyazo

就是这样

通过这个小演示,您可以看到重写现有 Pimcore 核心控制器是多么容易。您必须遵循一些步骤,但这并不难。只需确保在进行更改时公开控制器并不时清除缓存,有时它会被缓存,并且您会认为它不起作用并且只是缓存了。

如果您想知道如何覆盖 javascript 文件,它将出现在另一个教程中 😁。