Jos*_*ada 3 php wordpress composer-php guzzle
我正在开发一个使用 composer.. 的插件,这意味着它在插件文件夹中有一个供应商文件夹,其中包含 Guzzle HTTP 依赖项
在我们安装了这个插件的 wordpress 网站上,有一个现有的插件有 Guzzle HTTP
现在,当我们激活这个插件时,我收到如下错误:
Fatal error: Cannot redeclare GuzzleHttp\uri_template() (previously declared in /nas/content/staging/project/wp-content/plugins/my-plugin/vendor/guzzlehttp/guzzle/src/functions.php:17) in /nas/content/staging/project/wp-content/plugins/other-plugin/includes/lib/aws-sdk/GuzzleHttp/functions.php on line 31
Run Code Online (Sandbox Code Playgroud)
我尝试安装插件加载顺序以强制“其他插件”在“我的插件”之前首先加载,当前错误发生在其他插件的资源上。这样,错误将在我们的自动加载中产生,我们可以捕获它。
不幸的是..插件加载顺序不起作用..
任何想法如何解决这个问题?
rob*_*006 13
欢迎来到 WordPress 地狱。我们有 2018 年,WordPress 仍然没有任何依赖管理,仍然没有注意到 Composer 的存在。
WordPress 生态系统仅依赖于假设,即插件/主题的函数/类名称应该是唯一的。显然,将流行的第 3 部分 Composer 库与您的插件/主题一起分发是自找麻烦——当其他插件做同样的事情时,很容易发生名称冲突。没有什么好的办法可以摆脱这种局面。
如果您想要独立插件的防弹解决方案,您应该vendor使用插件前缀为目录中每个包的命名空间添加前缀,例如myplygin\vendor. 然后GuzzleHttp\Client变为myplugin\vendors\GuzzleHttp\Client,因此不存在名称冲突的风险。这将需要一些工作来为此编写脚本(或者您可以使用一些现有的解决方案,例如humbug/php-scoper),并且您可能会得到许多重复的依赖项(10 个插件可能会带来 10 次相同的库,但具有不同的命名空间),但这是将现代工具和模式集成到过时软件中的成本。
如果您正在为自己编写此插件并控制最终安装,您可以尝试使用 Composer 来安装 WordPress 及其插件。如果 3rd 方插件捆绑了一些 Composer 库,您仍然可能需要修复它们(通过分叉),但从长远来看,它应该简化很多事情,并且您可以避免为每个插件复制库。
根据设计,PHP和Composer假设您在受控环境中开发和分发代码。但是,当您在WordPress上发布插件或在Joomla上发布模块时,您会将代码分发到您无法控制其他作者安装的系统上。这种情况可能会导致名称冲突,例如Cannot redeclare GuzzleHttp\uri_template()....
要为多供应商设置准备代码,您必须为PHP 代码添加前缀,以避免名称冲突或版本冲突(首先加载具有不同版本的相同库)。例如,Guzzle 是一个众所周知且广泛使用的库,因此如果您发布包含它的插件,则必须在分发之前添加前缀。
乍一看,您可能认为仅给名称空间添加前缀就可以完成工作。但其他命名元素(例如全局函数和特征)也必须带有前缀,以避免所有可能的错误类型。
为了给 PHP 代码添加前缀,有一些工具或服务来执行任务:
composer.json,您只需定义要应用的前缀,而不必担心具体细节。免责声明:我是 PHP-Prefixer 的主要开发人员。
| 归档时间: |
|
| 查看次数: |
1470 次 |
| 最近记录: |