Laravel 5.5 : データベースに接続してJSONで値を返すまで

スポンサーリンク

今回利用するLaravelのバージョンが 5.5 だったので、ここから先は 5.5 についてMEMOしていきます。インストールについては、

Laravel 6.0 : Laravel Homestead のセットアップ
Laravelの開発環境をMac上に構築した際のMEMOです。Laravelをインストールした後、Macのローカル環境でPHPやLarave...

で、「バージョンを指定してプロジェクトを作成する場合」の「Laravel のバージョン5.5のプロジェクトを作成」で作成したプロジェクトを使って、データベース接続してみます。動作環境は、Vagrant上のLaravel Homestead 仮想システム環境です(VirtualBoxで制御)。

データベース(MySQL)接続設定

PHPフレームワーク、Laravel5.5で簡単なシステムを作ってみます。CRUDを一回り作ってみるチュートリアルです。前提PHP、Laravelはすでにインストール済みでblogというプロジェクトが生成されている状態から

こちらのチュートリアルが非常にわかりやすかったので、この通りにやってみますが、注意すべき点は、動作環境が仮想システム上であるため、MySQLやlocalhostそのものが、このチュートリアルとは状況が異なります。

まず、mysqlのデータベース設定は、 config/database.php に記述がありますが(mysql記述部分だけ取り出して書くとこんな感じ)、

'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'strict' => true,
    'engine' => null,
]

このファイルはこのままで、.env というファイルの値に従うように書かれているので、内容を修正するとしたら、 .env の方になります。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

ただ、Laravel Homesteadのセットアップを行なったので、Laravel Homestead 仮想システム環境では、上記のdatabaseやユーザ情報のままでいけるはずです。 使われるデータベースもデフォルトの「mysql」です。

仮想システム環境にログイン

このチュートリアルとは若干異なり、ここでは、この先のコマンドは、Macのローカル環境ではなく、仮想システム内で実行する感じになります。そうしないと、下記のテーブル作成などが、Macのローカル上のMySQLにアクセスすることになり、接続しようとするlocalhostなどが意図する場所と異なってしまいます。Macのターミナルで

vagrant ssh

をしてログインし、以下の作業に進みます。

$ vagrant ssh
Welcome to Ubuntu 18.04.3 LTS (GNU/Linux 4.15.0-64-generic x86_64)

Thanks for using 
 _                               _                 _ 
| |                             | |               | |
| |__   ___  _ __ ___   ___  ___| |_ ___  __ _  __| |
| '_ \ / _ \| '_ ` _ \ / _ \/ __| __/ _ \/ _` |/ _` |
| | | | (_) | | | | | |  __/\__ \ ||  __/ (_| | (_| |
|_| |_|\___/|_| |_| |_|\___||___/\__\___|\__,_|\__,_|

* Homestead v9.2.2 released
* Settler v8.2.0 released

0 packages can be updated.
0 updates are security updates.


vagrant@laraveltest2:~$ ls
code
vagrant@laraveltest2:~$ cd code
vagrant@laraveltest2:~/code$

ログイン後、codeというディレクトリに移動します。ここがプロジェクトのルートです。(Homestead.yamlで指定されています)ログアウトする場合は、exit を実行すれば通常のターミナルに戻ります。

vagrant@laraveltest2:~/code$ exit
Connection to 127.0.0.1 closed.

また、phpファイルの修正は、通常通りMacのエディタでプロジェクトフォルダ内のファイルを修正すればOKです。(上記の例では、「laraveltest2」という名前で仮想システムを実行しています)

テーブル作成

チュートリアルの通り、マイグレーションという機能を使って半自動的にテーブルを作成させます。マイグレーションを作成すると、 database/migrations にphpファイルが作成されますが、homesteadセットアップ後に、サンプル的に「2014_10_12_000000_create_users_table.php」と「2014_10_12_100000_create_password_resets_table.php」が入っていますので、これをひとまず、別の場所に移動しておきます(削除してもいいのですが一応)。

次に、プロジェクトフォルダ直下で、以下のコマンドを実行。「Created Migration:」と結果が表示され、マイグレーション用のファイルが生成されます。

vagrant@laraveltest2:~/code$ php artisan make:migration create_articles_table
Created Migration: 2019_11_01_015811_create_articles_table

エディタでこのファイルを修正し、チュートリアルの通り、「title」と「body」を追加します。

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

マイグレーションを実行し、MySQLのデータベース上にテーブルを作成します。vagrantにログインして実行していますので、仮想システム内のMySQLデータベース「homestead」に「id」「title」「body」とタイムスタンプ用のフィールドが「articles」というテーブルが生成されたことになります。

vagrant@laraveltest2:~/code$ php artisan migrate
Migration table created successfully.
Migrating: 2019_11_01_015811_create_articles_table
Migrated:  2019_11_01_015811_create_articles_table

モデル作成

テーブル「articles」用のモデル「Article」を作成するとのことですが、やはり複数形のテーブル名に対し、その単数形のモデル名ということですかね。

vagrant@laraveltest2:~/code$ php artisan make:model Article
Model created successfully.

App/Article.php が生成されましたね。

仮データをスクリプトで入れる(シーディング)

仮データを入れるためのコード、「シーダー」を生成し、実行することで、テスト用のデータを素早くデータベースに入れておくことができるようです。

まずシーダー生成

vagrant@laraveltest2:~/code$ php artisan make:seeder ArticlesTableSeeder
Seeder created successfully.

database/seeds/ArticlesTableSeeder.php が生成されます。

シーダーの内容修正と実行

このファイルにシーダーを実行した際に行われる処理を書き込みます。これもこちらの通りに書いてみます。runが実行されるとfor文によりtitleとbodyの挿入が10回繰り返されるような処理です。これもファイルの修正は、通常のMacのエディタでArticlesTableSeeder.phpを編集すればOKです。 use App\Article; を追記して、

    public function run()
    {
        //
        for ($i = 1; $i <= 10;$i++) {
            $article = new Article;
            $article->title = '記事タイトル' . $i;
            $article->body = '記事本文' . $i;
            $article->save();
        }
    }

ファイルを保存したら、vagrant環境で実行します。

In ArticlesTableSeeder.php line 16:
Class 'Article' not found

と出たら、use App\Article; の記述を忘れてないかご確認を。

仮データの確認

シーダーによって、正しく仮データが挿入されたかを確認してみます。Navicatでの接続設定はこんな感じです。

00

「SSH」タブでsshトンネルをかますのかと思ったら、このままでいけました。パスワードはデフォルトの「secret」です。これは、 .env にもデフォルトで書かれています。

接続後、「homestead」というデータベースに「articles」テーブルが作られ、10アイテムの「記事タイトルx」というアイテムが入っていることが確認できます。

JSONでデータベースの値を返す

通常、この後は、HTMLによるViewの作り方の流れに入るのですが、その辺は、上記のチュートリアルの通りにやるとして、このMEMOでは、JSON型で値を返すところまでにしておきます。

コントローラーの作成

ArticleControllerを作成します。 ログインしてなかったら vagrant ssh でログインし、

vagrant@laraveltest2:~/code$ php artisan make:controller ArticleController
Controller created successfully.

で、app/Http/Controllers/ArticleController.php を作成します。 use App\Article; を追記し、index() メソッドを作っておきます。all() で全てを取得し、そっくりそのまま return する記述にしておきます。

public function index() {
        $articles = Article::all();
        return $articles;
    }

チュートリアルでは、ここで view( ) で ビューを指定してHTML指定を含む「見え方」をどうするかを指定する感じなのですが、今回はJSONでそのまま返すことを前提としているので、そっくりそのまま return ということをしています。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Article;

class ArticleController extends Controller
{
    //
    public function index() {
        $articles = Article::all();
//        return view('article.index', ['articles' => $articles]);
        return $articles;
    }
}

ルーティングの設定

ルーティングは、 routes/wab.php に追記します。

Route::get('/hoge', 'ArticleController@index');

とりあえず、これで、「http://homestead.test/hoge」というURLを叩くと、MySQLのarticlesテーブルにあるデータを全部JSONで返すことができました。(なんども書きますが、今回はMVCのVは省いています)

01

この後のMEMOで、これに対して新規データを入れたり、値を更新したり、削除したりといった動作(CRUD)を行い、他のテーブルとのリレーショナルな関係をモデリングすることをやってみようと思います。