乃木坂で学ぶLaravelでRSSをパースしてAPIを作成する方法

## 概要

まとめサイトからRSSを使ってAPIを作成したいと思いました。  

対象のサイトは

[乃木坂46まとめブログ](http://ngzk46.livedoor.blog/) 
RSS: http://ngzk46.livedoor.blog/index.rdf

こちらのサイトのRSSを使います。ちなみにどのサイトのRSSでも問題ありません。  
よくあるXMLをパースしてJSONを吐き出すところまでを実装していきます。

## プロジェクトファイルのPathに移動する

```terminal
$ cd (プロジェクトのディレクトリ)
```

## Laravelプロジェクトファイルを作成

ディレクトリでLaravelをインストールする(今回はLaravel 5.5系で行う)

```terminal
$ composer create-project --prefer-dist laravel/laravel PracticeLaravel "5.5.*"
```

```terminal
$ cd PracticeLaravel
```

## Controllerを作成する

```terminal
$ php artisan make:controller ApiController

# Controller created successfully.
```

## ルーティングの設定を行う

```routes/web.php
// 初期設定はとりあえず削除する
//Route::get('/', function () {
//    return view('welcome');
//});

// ルートを設定する
Route::get('/', 'ApiController@index');
```

## ControllerでRSSのXMLを読み込んで連想配列に変換してJSONにして吐き出す

参考サイトはこちら  
- [PHPでXMLを解析するときに注意すること](https://qiita.com/Kzno/items/62cdf036625f146254d7)
- [simplexml_load_file(simplexml_load_string) を配列に変換する](https://qiita.com/ka_to/items/54fe4d5bb655841f85d8)

```ApiController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ApiController extends Controller
{
    public function index()
    {
        $xml = file_get_contents('http://ngzk46.livedoor.blog/index.rdf');
        $xmlObject = simplexml_load_string($xml);
        $xmlArray = json_decode( json_encode( $xmlObject ), TRUE );
        return $xmlArray;
    }
}
```

## ローカルサーバーを立ち上げる

```terminal
$ php artisan serve

# Laravel development server started: <http://127.0.0.1:8000>
```


## http://127.0.0.1:8000 にアクセスする

Jsonとして出力されることが確認できます。

<img width="1338" alt="スクリーンショット 2018-12-23 17.15.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/44392/b7d379ab-4aa2-a4d8-5069-c54b8b578854.png">

ただ、これだとどのパラメータをパースすればいいのかわからないので大抵はクロムの拡張機能を使って見やすいように修飾します。

[JSONView](https://chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc?hl=ja)

JSONViewをクロムに追加すると下記のようにJSONが綺麗になります。

<img width="1346" alt="スクリーンショット 2018-12-23 17.10.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/44392/5efd23da-36fe-deb4-0043-817671587f07.png">


## 実際にパラメータをパースする

- channel

```ApiController.php

class ApiController extends Controller
{
    public function index()
    {
        $xml = file_get_contents('http://ngzk46.livedoor.blog/index.rdf');
        $xmlObject = simplexml_load_string($xml);
        $xmlArray = json_decode( json_encode( $xmlObject ), TRUE );
        return $xmlArray["channel"];
    }
}
```

結果は

<img width="1120" alt="スクリーンショット 2018-12-23 17.20.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/44392/7731748c-ef80-2178-fd63-051d8ddf1fe7.png">

- item

```ApiController.php
class ApiController extends Controller
{
    public function index()
    {
        $xml = file_get_contents('http://ngzk46.livedoor.blog/index.rdf');
        $xmlObject = simplexml_load_string($xml);
        $xmlArray = json_decode( json_encode( $xmlObject ), TRUE );
        return $xmlArray['item'];
    }
}
```

<img width="1216" alt="スクリーンショット 2018-12-23 17.23.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/44392/b65237c2-f39e-d137-04ae-6e1e7ba29648.png">


- 一つ目のitem

```ApiController.php
class ApiController extends Controller
{
    public function index()
    {
        $xml = file_get_contents('http://ngzk46.livedoor.blog/index.rdf');
        $xmlObject = simplexml_load_string($xml);
        $xmlArray = json_decode( json_encode( $xmlObject ), TRUE );
        return $xmlArray['item'][0];
    }
}
```

<img width="1213" alt="スクリーンショット 2018-12-23 17.22.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/44392/ebd5e671-a08e-7fe0-aef4-de69f27b8090.png">


こんな感じの使い方になります。  
これでモバイルアプリの人も簡単にAPIを作成できますね。