覆盖 Pimcore 的核心控制器
我从事 Pimcore 项目已经有一段时间了,从来没有接触过 PHP 和 Symfony,所以这是一个巨大的挑战。
该文档很棒,我的意思是,说真的,它很棒,但看起来它不是为语言/框架的初学者制作的,所以我所做的一切都必须记下来。
在了解到可以使用捆绑包扩展 Pimcore 后,我花了很多时间尝试覆盖控制器、javascript 方法和更多东西。
因此,在这篇文章中,我将解释我如何设法覆盖控制器。如何覆盖 javascript 文件将在稍后介绍 😎。
创建包
首先,我们需要为其创建一个包,这非常简单,因为它记录在 Pimcore 文档 中,我们只需要在项目文件夹上运行 bin/console pimcore:generate:bundle --namespace=EmiDemo/EmiDemoBundle 即可。
它会提示一些问题,但无需担心。

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

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

重写控制器中的方法
要覆盖控制器中的方法,首先显然您需要找到要更新的操作,这看起来很简单,但我会按照我通常的方式向您提供(从我的队友 Cesar 那里学习)。
首先进入您认为控制器采取操作的页面,在我的例子中,我想检查打开资产时加载的页面
然后只需打开控制台并进入网络选项卡,再次执行相同的步骤并尝试查找操作
通过此信息,您可以看到加载资产的操作是 http://localhost/admin/asset/get-data-by-id?_dc=1607601778450&id=2&type=image。由此我们可以看到控制器操作是get-data-by-id。
找到核心控制器中的action
对我来说,最简单的方法就是在 Visual Studio Code 中的所有文件中查找
可能它会找到多个,所以您必须看一下并决定哪一个是那个,在我们的例子中,我们正在使用资产,所以很明显我们想要使用 AssetController.php。
修改核心控制器
这取决于开发人员,我通常不这样做,因为覆盖控制器并从那里开发会更快。但我建议首先更新核心包中的控制器,看看您的更改是否有效。
在我们的例子中,我只会在方法的开头返回一条消息来检查它是否有效。
return $this->adminJson(['success' => false, 'message' => "Overriding the getDataByIdAction in the core!!"]);
然后让我们重新加载资产并检查网络选项卡
让我们保留其中的内容,以便稍后我们知道我们正在使用捆绑消息而不是核心消息。
现在,让我们将其复制到临时文件中以跟踪我们所做的事情。
将这些更改移至捆绑包
现在为了将这些更改转移到我们的包中,但首先我们需要来自核心控制器的一些内容:
- 命名空间
- 进口
- 控制器名称
显然,方法 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
在我们的文件中,我们将添加导入并使用我们将覆盖的控制器扩展控制器
然后,我们只需从核心控制器复制方法,并在我们的例子中更新我们返回的消息。
如果你还记得的话,我们已经在核心控制器中有一条消息:Overriding the getDataByIdAction in the core!!,现在我们应该看到Overriding the getDataByIdAction in the bundle!!
让我们不返回任何内容,看看我们现在可以像以前一样看到页面
注释掉return语句并重新加载
就是这样
通过这个小演示,您可以看到重写现有 Pimcore 核心控制器是多么容易。您必须遵循一些步骤,但这并不难。只需确保在进行更改时公开控制器并不时清除缓存,有时它会被缓存,并且您会认为它不起作用并且只是缓存了。
如果您想知道如何覆盖 javascript 文件,它将出现在另一个教程中 😁。









