小丁的屋舍
Typecho | 记录一次升级 1.2.0 后的问题排查
2024-01-29
查看标签
0次浏览

问题复现

把 Typecho 升级到 1.2.1 后发现我的主页的最近文章和随机项目部分出现了下面的报错

Warning: Invalid argument supplied for foreach() in Root/Site/index.php on line 167

由于这部分我是采用自写接口文件,采用接口来获取这些数据,导致似乎新版本因为某些东西发生变动,无法正常读取数据。

当我去访问 Api.php 的时候这个文件果不其然的报错了!

Class 'Widget_Abstract_Contents' not found Error: Class 'Widget_Abstract_Contents' not found in Root/Site/var/Typecho/Widget.php:154 Stack trace: #0 Root/Site/Api.php(26): Typecho\Widget::widget() #1 {main}

尝试解决

当我发现这个问题后立马去 Typecho 官方站点查阅了 v1.2.0更新内容。仔细看就可以看到

升级到 PHP 7.2 后将给 Typecho 代码带来如下变化:

  1. 类名全部由下划线风格转向反斜线的 namespace 风格
// 之前的代码
new Typecho_Widget_Helper_Form();

// 之后的代码
use Typecho\Widget\Helper\Form;

new Form();
  1. 编码风格建议统一使用PSR-12
  2. 更强的类型约束,所有的接口参数和返回值都将加上类型约束,所以大家在使用的时候也要更加注意规范。
  3. 我们移除了大量过时/无用的代码。

$ 尝试一

是不是代码风格更改造成的代码不可用?所以我将 Api 文件中的 namespace 风格更换成了新版本要求的。当我运行代码后还是不奏效。

正当我苦恼的时候,定睛一看这段文字的后面 得益于新设计的自动加载系统,老的类命名和使用方法也将得到兼容,所以你不必担心之前的插件和主题用不了。

好像不是命名空间的问题 一脸懵逼 于是这个尝试就作废了!

$ 尝试二

我开始检查代码,一行一行的看,Widget_Abstract_Contents 这个类吸引了我的注意。

这一行代码是一个 Typecho 自带的组件代码,可以调用文章内容(可调教度肥肠高)这个好像使用了抽象的方法,我开始顺藤摸瓜去 Widget 里面找这个方法类,找了半天被找到。然后我就去 Github上面找。发现是有个地方写着一个全局变量 TYPECHO_CLASS_ALIASES

翻译过来就是类的别名的意思,我看到 Widget_Abstract_Contents 赫然指向了 \Widget\Base\Contents 又想到更新日志里面提到到,我果断的的把后者替换了前者,刷新页面!Binggo~ 成功返回了文章与作品的 Json 数据 ~

这里我附录以下最新版的别名,说不定以后会用到!

KeyValue
Typecho_Plugin_Interface\Typecho\Plugin\PluginInterface
Typecho_Widget_Helper_Empty\Typecho\Widget\Helper\EmptyClass
Typecho_Db_Adapter_Mysql\Typecho\Db\Adapter\Mysqli
Widget_Abstract\Widget\Base
Widget_Abstract_Contents\Widget\Base\Contents
Widget_Abstract_Comments\Widget\Base\Comments
Widget_Abstract_Metas\Widget\Base\Metas
Widget_Abstract_Options\Widget\Base\Options
Widget_Abstract_Users\Widget\Base\Users
Widget_Metas_Category_List\Widget\Metas\Category\Rows
Widget_Contents_Page_List\Widget\Contents\Page\Rows
Widget_Plugins_List\Widget\Plugins\Rows
Widget_Themes_List\Widget\Themes\Rows
Widget_Interface_Do\Widget\ActionInterface
Widget_Do\Widget\Action
AutoP\Utils\AutoP
PasswordHash\Utils\PasswordHash
Markdown\Utils\Markdown
HyperDown\Utils\HyperDown
Helper\Utils\Helper
Upgrade\Utils\Upgrade

问题反思

寻根法解决问题,这个问题鸽置了大半年了,今天终于是有时间来解决了QAQ,多看看 Github。