使用 Laravel 渲染站点地图时出错


error rendering a sitemap with laravel

我在用laravel渲染站点地图时遇到问题。生成的xml似乎没问题,但是当我尝试从chrome或Firefox调用url时,我遇到了错误

 error on line 2 at column 6: XML declaration allowed only at the start of the document

事实上,文档的第 1 行为空,xml 声明从第 2 行开始

这是我的代码:

 return Response::view('sitemap.index', ['agences' => $agences])->header('Content-Type', 'application/xml');

我也尝试了这种语法:

 $xml = View::make('sitemap.index', ['agences' => $agences]);
 return Response::make($xml, 200)->header('Content-Type', 'application/xml');

这样我就可以做到

 dd($xml->render()); 

并意识到返回的字符串没有空的第一行。所以我猜 Response::make 是罪魁祸首,但我真的不知道从那里看哪里

好的,

我要发布我自己的答案,因为这很棘手,花了我一天的时间,好消息是我对 laravel 的了解略有增加。

所以我的xml站点地图以空行开头,这在浏览器上创建了一个错误。XML 最初是使用边栏选项卡模板生成的。由于它不起作用,我决定使用RoumenDamianoff/laravel-sitemap

但我也有同样的问题。所以最后我决定使用SimpleXmlElement再次自己生成Xml,它没有任何改变。

那时,我开始深入研究Laravel的内部,看看这个空行在请求生命周期中可能来自哪里。

基本上我的站点地图非常简单:

$urlset = new SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:image="http://www.google.com/schemas/sitemap-image/1.1" /><!--?xml version="1.0" encoding="UTF-8"?-->');
datas = MyModel::All();
foreach($datas as $index=>$data){
// generate sitemap
}
$dom = new DomDocument();
$dom->loadXML($urlset->asXML());
$dom->formatOutput = true;
//output xml
$xml = $dom->saveXML();
$response = Response::make($xml, 200, ['Content-Type' => 'application/xml']);

只是为了测试,我决定更改我请求的模型,然后我的 xml 生成没有第一个空行。所以我决定调查模型本身并找到错误。模型文件在 php 开始标记之前只有一个空行。

删除该空行解决了我的问题....