のぐそんブログ

暗いおじさんがシコシコ書くブログです。

LaravelでAPIを作る為のメモ

Laradockで開発環境を構築したら、次はAPIを作ってみたいと思います。

メモレベルなので、分かりづらいかもしれません。

Controllerを作る

コマンドでコントローラーを追加する。 コントローラーの命名規則として複数形にする必要がある。

今回はAPIを作るのが目的なので、app/Http/Controllers/Apiにコントローラーを作成する。

controllerを作る

一番シンプルなコントローラーを作る。

php artisan make:controller Api/ContentsController

◎app/Http/Controllers/ContentsController.php

<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;

class ContentsController extends Controller
{
    //
}

Resourcefulなcontrollerを作る

Resourcefulなcontrollerを作るには-rをつける。

php artisan make:controller Api/ContentsController -r

◎app/Http/Controllers/ContentsController.php

<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;

class ContentsController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }
}

Modelを作成する

コマンドでモデルを追加する。 オプションに-mを付けることで、マイグレーションファイルも合わせて追加することもできる。

php artisan make:model Content -m

◎app/Article.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Content extends Model
{
    //
}

マイグレーションファイルを編集

DBのテーブルにカラムを追加する為、先程モデルを追加したときに、作成した以下のマイグレーションファイルを編集します。 database/migrations/2019_01_20_133119_create_contents_table.php

titleとbodyのカラムを追加します。

    public function up()
    {
        Schema::create('contents', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->text('body');
            $table->timestamps();
        });
    }

マイグレーションを実行する。

php artisan migrate

contentsテーブルが作成される。

+-------------------+
| Tables_in_default |
+-------------------+
| contents          |
| migrations        |
| password_resets   |
| users             |
+-------------------+

ルーティングの設定

routes/api.phpAPIのルーティングを設定する。

<?php
Route::group(['middleware' => ['api']], function(){
  Route::resource('contents', 'Api\ContentsController');
});

不要なアクションは、メソッド、ルーティング共に削除しておく

ルーティングからの削除は、ホワイトリストを設定する方法と、ブラックリストを設定する方法がある。

// ホワイトリスト
Route::resource('contents', 'ContentsController', ['only' => ['index', 'show', 'update','store', 'destroy']]);

// ブラックリスト
Route::resource('contents', 'ContentsController', ['except' => ['edit','create']]);

コントローラーを修正

合わせてコントローラーも修正する。

use App\Content;を追加してモデルを読み込む。

◎ app/Http/Controllers/Api/ContentsController.php
<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\Content;
use App\Http\Controllers\Controller;

コントローラーにアクションを追加

function method api params
index GET http://localhost/api/contents/  
create GET http://localhost/api/contents/  
show GET http://localhost/api/contents/{content}  
edit GET http://localhost/api/contents/{content}/edit  
store POST http://localhost/api/contents/ {“title”:“タイトル“,”body”:“本文“}
update PUT http://localhost/api/contents/{content} {“title”:“タイトル“,”body”:“本文“}
delete DELETE http://localhost/api/contents/{content}  
<?php

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\Content;
use App\Http\Controllers\Controller;

class ContentsController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $Contents = Content::all();
        return $Contents;
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $Content = new Content;
        $Content->title = $request->title;
        $Content->body = $request->body;
        $Content->save();
        return redirect('api/Contents');
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        $Content = Content::find($id);
        return $Content;
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
        public function update(Request $request, $id)
    {
        $Content = Content::find($id);
        $Content->title = $request->title;
        $Content->body = $request->body;
        $Content->save();
        return redirect("api/Contents/".$id);
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        $Content = Content::find($id);
        $Content->delete();
        eturn $article;
    }
}

APIを実行してみる。

ツールを利用してAPIを実行してみます。 DBの情報が取得できるのが確認できます。

※ダミーのデータを入れている前提(シーディングしたり))

f:id:nogson2:20190123173115j:plain