見出し画像

RESTfulなサービス作成を通じてLaravelを学ぶ

「フォームから入力した値をデータベースに登録し、JSONで返す」というシンプルなものを作ってLaravelを学びたいと思います〜!

完成物はこちら!この続きに関しては、別のnoteにまとめたいと思います。

画像6

これは、「PHPフレームワーク Laravel入門 」を参考に作成したので気になる方はぜひ買ってみてください😊

マイグレーションの作成

データベースを生成するために作成するのが「マイグレーション」と「シーディング」です。

◎マイグレーションとは?
データベースを移行などしたときも正しく動作するよう、現在使っているデータベースの構造をバージョン管理する仕組みです

PHPのスクリプトを使ってデータベースのテーブルを作成・削除・追加などができます

まずはマイグレーションを作成し、初期データを用意する準備をします。

$ php artisan make:migration create_restdata_table

これで、database/migrations/[日時]_create_restdata_table.php が出来ました。(upでテーブル生成、downでテーブル削除を行います)

テーブルの作成はScheme::createメソッドを使います。これでid, message, url, timestampsフィールドが作成されます。

    public function up()
   {
       Schema::create('restdata', function (Blueprint $table) {
           $table->bigIncrements('id');
           $table->string('message');
           $table->string('url');
           $table->timestamps();
       });

マイグレーションを実行します

$ php artisan migrate

モデルの作成

◎モデルとは?
Laravelには「Eloquent」(エロクアント)というORMが内臓されています。データベースとPHPの橋渡しをしてくれる仕組みです。

この仕組みのお陰で、データベースのレコードをPHPのクラスに変換して処理できるようになっているそう。

「Eloquent」モデルを作成してDBテーブル中のデータを扱います。

このコマンドを実行することでモデルの作成ができます。

$ php artisan make:model Restdata

これで、appフォルダ内にRestdata.phpが作成されています!$tableというメンバ変数を使って、restdataテーブルを指定します。

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Restdata extends Model
{
   protected $table = 'restdata';
   protected $guarded = array('id');
   public static $rules = array(
       'message' => 'required',
       'url' => 'required'
   );
}

シードの作成

テーブルの用意はできるようになったけど、レコードがまだ用意されていません。

そこで、初期状態にダミーのレコードを用意するための機能を「シーディング」といいます。

シーディングのためにスクリプトファイルを用意します。

$ php artisan make:seeder RestdataTableSeeder

これで、database/seeds/RestdataTableSeeder.php が作成されています。

初期データは、Google, Yahoo, MSNの情報を用意しておきます!

<?php
use Illuminate\Database\Seeder;
use App\Restdata;
class RestdataTableSeeder extends Seeder
{
   /**
    * Run the database seeds.
    *
    * @return void
    */
   public function run()
   {
       // 3つのレコードを
       $param = [
           'message' => 'Google Japan',
           'url' => 'https://www.google.co.jp',
       ];
       $restdata = new Restdata;
       $restdata->fill($param)->save();
       $param = [
           'message' => 'Yahoo Japan',
           'url' => 'https://www.yahoo.co.jp',
       ];
       $restdata = new Restdata;
       $restdata->fill($param)->save();
       $param = [
           'message' => 'MSN Japan',
           'url' => 'http://www.msn.com/ja-jp',
       ];
       $restdata = new Restdata;
       $restdata->fill($param)->save();
   }
}

このRestdataTableSeederクラスは作成しただけでは使えません。シーディングのコマンドで実際に実行されるDatabaseSeederに登録します。


class DatabaseSeeder extends Seeder
{
   public function run()
   {
       $this->call(RestdataTableSeeder::class);
   }
}

これで用意ができたので、早速シードを実行します!

$ php artisan db:seed

このときに、DatabaseSeederのrun()が実行され、用意しておいたダミーレコードがテーブルに登録されるわけですね。

データベースを確認すると、ちゃんと登録されています!🎉

スクリーンショット 2019-12-31 13.25.05

RESTコントローラの作成

作成したモデルを利用していきます!

まずは、--resourceオプションをつけてリソースコントローラーを作成します。

$ php artisan make:controller RestappController --resource

resourceオプションをつけると最初からコントローラーファイルに下記メソッドが用意されます。

一覧表示・・・index
新規作成・・・create, store
更新処理・・・edit, update
削除処理・・・destroy

このメソッドたちを使うには、routes/web.php にRoute::resourceするだけでOKです。

Route::resource('rest', 'RestappController');

リソースコントローラーは、CRUD(Create、Read、Update、Delete)のアクセスを一式用意してくれるわけですね。

index, showの作成

先ほど登録したデータをGET時にJSONで返ってくるようにRestappController.phpのindexとshowメソッドの処理を追加していきます!

    public function index()
   {
       $items = Restdata::all();
       return $items->toArray();
   }

    public function show($id)
   {
       $item = Restdata::find($id);
       return $item->toArray();
   }

これで、/rest にアクセスすると全レコードがjson配列として出力されるようになりました!😃

スクリーンショット 2019-12-31 13.40.40

また、showメソッドでRestdata::find($id)としたので、/rest/1 にアクセスするとid = 1のレコードが表示されるようになりました!

スクリーンショット 2019-12-31 13.41.20

実は、JSONデータを生成するために特別に作業は行っていません。

ただRestdata::allで取得したコレクションからtoArrayメソッドを使って配列の形でレコード情報を取り出し、それをreturnしただけです。

Larabelではアクションメソッドで配列をreturnすると自動的にその配列データをJSON形式に変換してくれるようになっているそうです!👀

レコードの追加

フォームから入力したデータがDBに登録されるようにしていきます!

まずはviews/rest/create.blade.php にフォームのテンプレートを作成します。

スクリーンショット 2019-12-31 18.18.29

このフォームは下記のように/restを指定し、POST /rest した際に入力内容を作成・保存する処理が実行されるようにしています。

<form action="/rest" method="post">

views/hello/rest.blade.phpファイルが実際に表示されるファイルなので、ここにフォームを埋め込みます。

このように、@includeディレクティブをbodyに書くことでviews/rest/create.blade.php ファイルを埋め込むことができるんですね!😮

<body>
   <h1>Rest</h1>
   @include('rest.create')
</body>

次に、@includeの中に書いたrest.createの部分とstoreアクションメソッドをRestappController.phpに追記します。

    public function create()
   {
       return view('rest.create');
   }
    public function store(Request $request)
   {
       $restdata = new Restdata();
       $form = $request->all();
       unset($form['_token']);
       $restdata->fill($form)->save();
       return redirect('/rest');
   }

これで、createアクションではviewを表示、storeアクションではフォームで入力した情報を保存する処理ができました。

さいごに

/hello/rest にアクセスしたときにフォームが表示されるようにしたいので、Http/Controllers/HelloController.phpにrestアクションメソッドを追記します。

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HelloController extends Controller
{
public function rest (Request $request) {

       return view('hello.rest');
   }
}

そして、routes/web.phpファイルにルートの情報を追加します。

Route::get('hello/rest', 'HelloController@rest')

これで完成です!試しに下記キャプチャのようにgithubを追加してみます。

スクリーンショット 2019-12-31 16.17.13

sendボタンを押したときに、データが保存され、/rest へリダイレクトされることで追加した結果が返ってくるようになりました!🙌

スクリーンショット 2019-12-31 16.17.08

参考


スキ頂けると嬉しいです〜