使用laravel呈现站点地图时出错

时间:2014-11-25 09:03:26

标签: php xml laravel laravel-4

我在使用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是应该责备的,但我真的不知道从哪里看

1 个答案:

答案 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打开标记之前,模型文件只有一个空行。

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