Symfony5/Twig渲染DomCrawler爬取链接时报数组转字符串错误
问题原因排查
两个报错的核心是linkMetaInfos的数组结构不符合预期:
- 直接输出
{{ linkMetaInfos.link }}报数组转字符串错误,说明你把所有链接、文本分别存在了linkMetaInfos['link']和linkMetaInfos['text']两个独立的一维索引数组里,link字段本身是数组,不能直接作为字符串输出 - 遍历
linkMetaInfos时提示link键不存在,说明你遍历的是一维的link/text子数组,每个遍历项是字符串类型的链接/文本,自然没有link键
解决方案
控制器端修正数组结构
原错误写法大概率是将链接和文本分开存储,调整为每个元素都包含link、text键的二维数组即可:
// 原错误写法示例 // $linkMetaInfos = [ // 'link' => [], // 'text' => [] // ]; // $crawler->filter('h2 a')->each(function (Crawler $node) use (&$linkMetaInfos) { // $linkMetaInfos['link'][] = $node->attr('href'); // $linkMetaInfos['text'][] = $node->text(); // }); // 修正后的写法 $linkMetaInfos = []; $crawler->filter('h2 a')->each(function (Crawler $node) use (&$linkMetaInfos) { $linkMetaInfos[] = [ 'link' => $node->attr('href'), 'text' => $node->text() ]; }); // 传递给模板的逻辑不变 return $this->render('你的模板路径.html.twig', [ 'linkMetaInfos' => $linkMetaInfos ]);
Twig模板端正确遍历
修正数组结构后直接遍历即可,不会再出现键不存在的报错:
{% for linkMetaInfo in linkMetaInfos %} <a href="{{ linkMetaInfo.link }}">{{ linkMetaInfo.text }}</a> {% endfor %}
如果不想修改控制器原有结构,也可以用索引匹配的方式遍历原始的一维数组:
{% for index in linkMetaInfos.link|keys %} <a href="{{ linkMetaInfos.link[index] }}">{{ linkMetaInfos.text[index] }}</a> {% endfor %}
如果需要单独输出某一条链接,指定索引访问即可,比如输出第一条链接:{{ linkMetaInfos[0].link }},避免数组转字符串报错。
内容的提问来源于stack exchange,提问作者Paquito Uman
相关产品推荐
相关产品推荐

