最近在寫串接功能時,遇到需要使用Laravel動態產生XML的功能,完成後做個筆記,除此之外也能拿來產生網站組織架構的Sitemap,讓Google等搜尋引擎能夠更有效率的爬你的網站頁面。
How
假設要使用Laravel產生如下的簡易產品清單XML:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <?xml version="1.0" encoding="UTF-8"?> <products> <Product> <Name>Product_1</Name> <Description>Product_Description</Description> <URL>https://mywebsite.com/Product_URL/</URL> <Price>1000</Price> </Product> <Product> <Name>Product_2</Name> <Description>Product_Description</Description> <URL>https://mywebsite.com/Product_URL/</URL> <Price>1500</Price> </Product> </products>
|
首先在 resources/views
裡建立一個 product_list.blade.php
視圖,用來顯示XML的內容 (“product_list”名稱可自訂)。
內容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13
| <?xml version="1.0" encoding="UTF-8"?> <products> @foreach($products as $product) <Product> <Name>{{ $product->name }}</Name> <Description>{{ $product->description }}</Description> <URL>{{ Request::root() }}/product/{{ $product->id }}</URL> <Price>{{ $product->price }}</Price> </Product> @endforeach </products>
|
然後建立一個Controller(名稱自訂,這裡範例使用ProductController,跟處理顯示商品同樣的控制器)。
在Controller裡建立Function用來取得資料並傳送給View裡的視圖顯示。
1 2 3 4 5 6
| public function productList() { $products = Product::orderBy('id', 'DESC')->get(); return response()->view('product_list', compact('products'))->header('Content-Type', 'text/xml'); }
|
最後在route/web.php
裡加上路徑
1
| Route::get('/product_list.xml', 'ProductController@productList');
|
到這邊大功告成,打上網域名+/product_list.xml
就可以查看XML所產生的XML了!
注意事項
如果像此方法利用Blade模板產生XML要注意在PHP的php.ini
設定中 Short Open Tag (<?) 選項要關閉,如果必須打開此選項的話可以改用以下寫法來產生XML Header:
1
| <?php echo '<?xml version="1.0" encoding="UTF-8"?>'; ?>
|
參考資料
Generate a Simple XML Sitemap Using Laravel
評論