我在使用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是应该责备的,但我真的不知道从哪里看
答案 0 :(得分:1)
好的,我会发布自己的答案,因为这很棘手而且花了我一天的时间,好处是我对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打开标记之前,模型文件只有一个空行。
删除该空行已解决了我的问题....