PHP
Git
Heroku
laravel

HerokuにHeroku Postgresを導入してアプリケーションを動かしてみる1

参考文献

Laravelアプリをherokuで動かすチュートリアル
今回も上記のリンク先を参考にしてデプロイした。

PostgreSQLを導入する

command
heroku addons:create heroku-postgresql:hobby-dev
command
Creating heroku-postgresql:hobby-dev on ⬢ sholovelaravel... free
Database has been created and is available
 ! This database is empty. If upgrading, you can transfer
 ! data from another database with pg:copy

一応うまくいってる?

●参考文献
【Heroku Postgresql】アドオンを追加し、テーブル操作を行う
どうもここではHeroku Postgresアドオンが自分のHerokuページに載るらしい。

スクリーンショット 2018-10-11 7.17.40.png

アドオンがあるからOKみたい!次は設定。

●参考文献
Laravel + Heroku + HerokuPostgres でDB設定をサクッと環境変数に突っ込む
これをみるとDBの設定も一瞬でできるらしい。

command
php -r 'preg_match("/^postgres:\/\/(.+?):(.+?)@(.+?):(.+?)\/(.*?)$/", `heroku config:get DATABASE_URL`, $matches); `heroku config:set DB_CONNECTION=pgsql DB_HOST=$matches[3] DB_PORT=$matches[4] DB_DATABASE=$matches[5] DB_USERNAME=$matches[1] DB_PASSWORD=$matches[2]`;'
実行結果
Setting DB_CONNECTION, DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD and restarting sholovelaravel... done, v7

おっできた。何か適当にアプリを作ってマイグレーションしてみよう。

マイグレーションの作成

command
php artisan make:migration create_boards_table

まずローカルでマイグレーションファイルを作成して、

マイグレーションファイル
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateBoardsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('boards', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('person_id');
            $table->string('title');
            $table->string('message');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('boards');
    }
}

herokuへデプロイする。ちなみにgithubに連携するとgithubへpushすると同時にherokuにもpushするのでとても便利。

command
heroku run 'php artisan migrate'
実行結果
Running php artisan migrate on ⬢ sholovelaravel... up, run.6720 (Free)
**************************************
*     Application In Production!     *
**************************************

 Do you really wish to run this command? (yes/no) [no]:
 > y

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
Migrating: 2018_10_10_223310_create_boards_table
Migrated:  2018_10_10_223310_create_boards_table

テーブルできたー!!

モデルの作成

command
php artisan make:model Board

コマンドプロンプトかターミナルで実行してBoardモデルを作成する。(Board.phpの名前で作成される)

モデル内は下記の内容に書き換える。

Board.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Board extends Model
{
    protected $guarded = array('id');

    public static $rules = array(
        'person_id' => 'required',
        'title' => 'required',
        'message' => 'required'
    );

    public function getData()
    {
        return $this->id . ': ' . $this->title;
    }
}

BoardControllerの作成

command
php artisan make:controller BoardController

コマンドプロンプトかターミナルで実行してBoardコントローラーを作成する。(BoardController.phpの名前で作成される)

コントローラー内は下記の内容に書き換える。

BoardController
<?php

namespace App\Http\Controllers;

use App\Board;
use Illuminate\Http\Request;

class BoardController extends Controller
{
    public function index(Request $request)
    {
        $item = Board::all();
        return view('board.index', ['items' => $items]);
    }

    public function add(Request $request)
    {
        return view('board.add');
    }

    public function create(Request $request)
    {
        $this->validate($request, Board::$rules);
        $board = new Board;
        $form = $request->all();
        unset($form['_token']);
        $board->fill($form)->save();
        return redirect('/board');
    }
}

テンプレートの作成

./resources/views/board内に「index.blade.php」を作成する。(boardディレクトリは各自作成する。)

index.blade.php
@extends('layouts.helloapp')

@section('title', 'Board.index')

@section('menubar')
    @parent
    ボード・ページ
@endsection

@section('content')
    <table>
        <tr><th>Data</th></tr>
        @foreach ($items as $item)
            <tr>
                <td>{{$item->getData()}}</td>
            </tr>
        @endforeach
    </table>
@endsection

@section('footer')
copyright 2017 shochang
@endsection

ルート情報の記述

routesディレクトリ直下のweb.phpを更新する。
Route::get('board', 'BoardController@index');を追加する。

web.php
<?php

Route::get('board', 'BoardController@index');

Route::get('/', function () {
    return view('welcome');
});

これで「heroku open」でboardに接続すると。。。

スクリーンショット 2018-10-12 7.18.20.png

あれ出ない。。。

とっとりあえず長くなってきたので今日はここまで。次回はこの続きから