php - Magento 1.7:SUPEE-10975 安全补丁后的严格通知警告
问题描述
在 Magento 1.7.0.2 中安装 SUPEE-10975 后,我收到了这个 PHP 通知:
Strict Notice: Declaration of Mage_Core_Controller_Request_Http::getBaseUrl() should be compatible with that of Zend_Controller_Request_Http::getBaseUrl() in app/code/core/Mage/Core/Controller/Request/Http.php on line 36
#0 app/code/core/Mage/Core/Controller/Request/Http.php(36): mageCoreErrorHandler(2048, 'Declaration of ...', '/kunden/12345_8...', 36, Array)
#1 lib/Varien/Autoload.php(93): include('/kunden/12345_8...')
#2 [internal function]: Varien_Autoload->autoload('Mage_Core_Contr...')
#3 app/code/core/Mage/Core/Model/App.php(1219): spl_autoload_call('Mage_Core_Contr...')
#4 app/code/core/Mage/Core/Model/Cookie.php(83): Mage_Core_Model_App->getRequest()
#5 app/code/core/Mage/Core/Model/Cookie.php(273): Mage_Core_Model_Cookie->_getRequest()
#6 app/code/core/Mage/Core/Model/App.php(568): Mage_Core_Model_Cookie->get()
#7 app/code/core/Mage/Core/Model/App.php(488): Mage_Core_Model_App->_checkCookieStore('website')
#8 app/code/core/Mage/Core/Model/App.php(349): Mage_Core_Model_App->_initCurrentStore('', 'store')
#9 app/Mage.php(683): Mage_Core_Model_App->run(Array)
#10 index.php(87): Mage::run('', 'store')
#11 {main}
似乎该代码在我的安装中可用两次:
app/code/core/Zend/Controller/Request/Http.php
=> 与 SUPEE-10975 一起引入lib/Zend/Controller/Request/Http.php
=> 在 Magento 1.7.0.2 的基本安装包中可用
这是 SUPEE-10975 的回归还是我的安装问题?
解决方案
更新:SUPEE-11219 似乎解决了这个问题,所以在应用 11219 补丁后我的下面的修复可能会被删除
原答案:
我已经看到了同样的问题,它看起来确实像 1.7 的 SUPEE-10975 补丁中的回归。
更改您的 PHP 配置以抑制严格模式通知会让您工作,但如果您更喜欢在严格模式下工作,也有一种修补补丁的方法。
正如您所观察到的,SUPEE-10975 添加了一个新类,该类扩展了位于新文件中的Mage_Core_Controller_Request_Http
新捆绑的 Zend 类。Zend_Controller_Request_Http
app/code/core/Zend/Controller/Request/Http.php
发出严格模式通知是因为方法签名与它扩展Mage_Core_Controller_Request_Http::getBaseUrl()
的新方法签名不正确匹配。Zend_Controller_Request_Http::getBaseUrl()
Mage_Core_Controller_Request_Http::getBaseUrl()
class Mage_Core_Controller_Request_Http extends Zend_Controller_Request_Http
...
public function getBaseUrl() //getBaseUrl has no parameters here
{
...
}
Zend_Controller_Request_Http::getBaseUrl()
class Zend_Controller_Request_Http extends Zend_Controller_Request_Abstract
...
public function getBaseUrl($raw = false) //getBaseUrl in the ancestor class has the parameter $raw
{
...
}
Mage_Core_Controller_Request_Http::getBaseUrl()
方法应该有一个参数$raw
来避免严格模式通知。这不是一个真正的错误,PHP 可以解决它,但理想情况下应该纠正它。
再次出发
在您的 PHP 配置中抑制严格模式通知允许代码运行忽略此错误,但如果代码可以在严格模式下运行会更好,不是吗?
这是修复它的方法,以便它将在严格模式下运行
将 复制app/code/core/Mage/Core/Controller/Request/Http.php
到本地代码池:(app/code/local/Mage/Core/Controller/Request/Http.php
请注意,我们正在本地文件夹中创建覆盖)
编辑app/code/local/Mage/Core/Controller/Request/Http.php
和更改行号 265 从
public function getBaseUrl()
至
public function getBaseUrl($raw = false)
如果您的代码已编译,并且编译器运行时没有出错,您可能需要清除编译后的版本才能看到您的更改。从 Magento 的 webroot 发出命令php shell/compiler.php clear
。
应用了 SUPEE-10975 补丁后,商店现在应该可以正常运行了。
这是做什么的
我们在本地代码文件夹中创建一个核心 Magento 文件的副本,Magento 在使用核心文件之前会尝试文件的本地副本,因此这个本地副本会覆盖原始文件。
我们对文件的编辑,使 getBaseUrl 的方法签名与祖先类匹配,抑制严格模式通知。
这样做是可以的,因为 Magento 1.7 代码$raw
无论如何都没有使用该参数,并且该方法的默认行为将与没有该参数的情况完全相同。
要撤消此更改,只需删除app/code/local/Mage/Core/Controller/Request/Http.php
我们刚刚制作的本地副本。Magento 将自动返回使用核心文件,尽管有严格模式通知。
唯一的问题是...
我们正在制造技术债务
下次发生安全补丁或升级时,如果原始文件被更改,我们制作的本地副本将不会得到补丁或更新。您需要检查是否仍需要此更改,如果需要,请将核心文件重新复制到本地文件夹并按上述方式重新修补文件。
推荐阅读
- c# - 如何在一个平台具有同步代码而另一个平台具有异步代码的情况下正确实现 DependencyService
- javascript - 如何仅从全局变量中获取值?
- javascript - 结合最新。出错后继续观察
- c# - .Net Core 3.1 swagger API 版本冲突命名空间 url
- javascript - 页脚在我的网站 HTML/CSS 中不可见
- javascript - 函数名 ({param1}) 中 param1 的数据类型
- pyspark - Hudi元数据表可以查询吗?
- php - 根据 WooCommerce 中的购物车项目小计将所有运输方式成本设置为零
- excel - 有没有一种方法可以遍历数组,根据单元格值隐藏列
- tcp - 使用 rsyslog 捕获多行事件并将它们存储到文件中