20200208のlaravelに関する記事は18件です。

Laravel ダミーデータ登録(seeder, factory, faker)

ダミーデータの登録

  • seeder: ダミーデータを登録する
    • 少量のデータであればこれだけでOK
  • factory: ダミーデータを量産する装置
  • faker: 装置を使用してダミーデータを生成する

少数のデータ登録の場合

seederを作成し、データを直に入れる

$ php artisan make:seed UsersTableSeeder
UsersTableSeeder
public function run()
    {
        // $this->call(UsersTableSeeder::class);
        DB::table('depts')->insert([
        ['id' => '1',
        'name_id' => '1',
        'created_at' => date('Y-m-d H:i:s'),
        'updated_at' => date('Y-m-d H:i:s'),
        ],
        [
        'id' => '2',
        'name_id' => '2',
        'created_at' => date('Y-m-d H:i:s'),
        'updated_at' => date('Y-m-d H:i:s'),
        ]
    }   

モデルごとに作成したseederを紐付ける

DatabaseSeeder.php
public function run()
    {
          $this->call(UsersTableSeeder::class);
    }

登録

$ php artisan db:seed
$ php artisan db:seed --class=UsersTableSeeder
# データベース初期化する場合
$ php artisan migrate:refresh --seeder

多数のデータ登録の場合

factoryの作成

$ php artisan make:factory UserFactory

生成したfactoryファイルにfakerを使って生成する

生成したfactoryファイルのModelと書かれたところを、使用するModel名に変更する

UserFactory.php
$factory->define(User::class, function (Faker $faker) {
    return [
        'name' => $faker->name(),
        'email' => $faker->email,
        'password' => $faker->password, // password
        'created_at' => $faker->datetime($max = 'now', $timezone = date_default_timezone_get()),
        'updated_at' => $faker->datetime($max = 'now', $timezone = date_default_timezone_get())
    ];
});

seederを作成する

$ php artisan make:seed UsersTableSeeder

使用するfactoryと生成するダミーデータの個数を追記する

UsersTableSeeder
class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(User::class, 50)->create();
    }
}

モデルごとに作成したseederを紐付ける

DatabaseSeeder.php
public function run()
    {
          $this->call(DeptsTableSeeder::class);
    }

登録

$ php artisan db:seed
$ php artisan db:seed --class=UsersTableSeeder
# データベース初期化する場合
$ php artisan migrate:refresh --seeder

(補足)日本語のダミーデータを登録する

デフォルトでは英語のダミーデータが生成されが、設定すれば日本語のダミーデータが生成できるようになる

config/app.php
'faker_locale' => env('APP_FAKER_LOCALE', 'ja_JP')
.env
// 追記
APP_FAKER_LOCALE=ja_JP

上記2ファイルの設定が終わると、次のコマンドでキャッシュを更新して登録すれば日本で登録される

$ php artisan config:cache
# 次のコマンドを打つと壊れるので注意
$ php artisan config:clear

(補足)使えそうなfakerリスト

'name' => $faker->name(),
'email' => $faker->email,
'password' => $faker->password, // password
'created_at' => $faker->datetime($max = 'now', $timezone = date_default_timezone_get()),
'updated_at' => $faker->datetime($max = 'now', $timezone = date_default_timezone_get()),

$faker->sentence(rand(1,4)), // 1〜4つの単語で文章
$faker->realText(512), // 512文字の文章 
$faker->word() // 単語
$faker->sentence(n) //単語数指定した文章
$faker->text($max) //$max文字数までの文章
$faker->name() //名前 (日本語)
$faker->realText() //文字数指定した文章 デフォルトは200(日本語)
$faker->phoneNumber() //電話番号(日本語)
$faker->address() //住所(日本語)
$fake->company() //会社名(日本語)
$faker->randomElement(['男性', '女性'])

(補足)リレーション関係でのfaker

use App\User
'user_id' => factory(User::class)->create()->id,

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelでYoutubeAPIを使って特定チャンネルのタイトル一覧抽出

概要

この記事ではLaravelとYoutube Data api(v3)を用いて
Youtubeの特定チャンネルのtitleを抽出し、
ブラウザに表示する機能のサンプルを実装します。

参考ドキュメント

Youtube Data API

手順

事前準備

  • YoutubeのAPIを叩くためのアプリケーションキーを取得
  • Youtube APIを有効化

Google Youtube API 認証などで検索すれば出てくるはずです。

実施手順

インストール

$ composer create-project --prefer-dist laravel/laravel bollate "5.8.*"

起動確認

APPキーを生成

$ php artisan key:generate

起動確認

$ php artisan serve
laravel.png

いつものLaravel画面が表示できればOK

GoogleAPIをインストール

phpでGoogleのAPIを使うにあたり便利なライブラリが存在するので利用します(感謝)
google-api-php-client

公式の通りインストール
$ composer require google/apiclient:"^2.0"

GOOGLE_KEYを.envに設定

.env
GOOGLE_API_KEY = "YOURKEYXXXX"

Controller生成

$php artisan make:controller YoutubeController

以下はサンプルです。ライブラリが保持するクラスの関数やプロパティは
APIのリファレンスやライブラリのドキュメントを参照ください。

YoutubeController.php
<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Google_Client;
use Google_Service_YouTube;

class YoutubeController extends Controller
{
    const MAX_SNIPPETS_COUNT = 50;
    const DEFAULT_ORDER_TYPE = 'viewCount';

    public function getListByChannelId(string $channelId)
    {
        // Googleへの接続情報のインスタンスを作成と設定
        $client = new Google_Client();
        $client->setDeveloperKey(env('GOOGLE_API_KEY'));

        // 接続情報のインスタンスを用いてYoutubeのデータへアクセス可能なインスタンスを生成
        $youtube = new Google_Service_YouTube($client);

     // 必要情報を引数に持たせ、listSearchで検索して動画一覧を取得
        $items = $youtube->search->listSearch('snippet', [
            'channelId'  => $channelId,
            'order'      => self::DEFAULT_ORDER_TYPE,
            'maxResults' => self::MAX_SNIPPETS_COUNT,
        ]);

        // 連想配列だと扱いづらいのでcollection化して処理
        $snippets = collect($items->getItems())->pluck('snippet')->all();
        return view('youtube/index')->with(['snippets' => $snippets]);
    }
}

Routing生成

web.php
Route::get('youtube/channels/{id}'/titles, 'Api\YoutubeController@getListByChannelId');

View生成

index.blade.php
<!doctype html>
<html lang="ja">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Youtube</title>
    <link rel="stylesheet" href="/css/app.css">
    <link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
</head>
<body class="index">
    <div class="main">
        <div class="header">
            <div class="header__title">
                <h1 class="header__title__main">
                    Youtube Title List;
                </h1>
                <p class="header__title__sub">
                    This is Youtube Title GET;
                </p>
            </div>
        </div>
        <div class="content">
            <div class="content__body">
                @foreach ($snippets as $snippet)
                    <div class="content__body__videos">
                        <p>
                            {{ $snippet->title }}
                        </p>
                    </div>
                @endforeach
            </div>
        </div>
    </div>
</body>
</html>

実行

$ php artisan serve

http://127.0.0.1:8000/youtube/channels/UCutJqz56653xV2wwSvut_hQ/titles

チャネルのIDをURLで指定することで特定チャンネルの動画のタイトルリストを得ることができました。

スクリーンショット 2020-02-08 22.17.28.png

画像内容データ引用元:
【東海オンエア チャンネル】
https://www.youtube.com/channel/UCutJqz56653xV2wwSvut_hQ

他にも、動画をアップロード・再生リストの作成など、様々な操作を実行可能です。

よきAPIライフを:thumbsup:

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel CSRF対策について(検証中)

Laravelではこう書く

<form method="POST" action="/profile">
    @csrf
    ...
</form>

@csrf
webミドルウェアグループに含まれている、VerifyCsrfToken ミドルウェアが、リクエスト中のトークンとセッションに保存されているトークンが一致するか、確認しています。
https://readouble.com/laravel/6.x/ja/csrf.html

But ...しかしながらエラー

  • うまく遷移せず。。 トークン切れのエラーが出た。(詳細は再現できず)

threfore ...なので

<meta name="csrf-token" content="{{ csrf_token() }}">

これだと上手く表示された。
原因は今後分かりしだい追記。
備忘録

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

とりあえずLaradockで

対象者

とりあえずインフラとかDockerとか慣れてなくてよく分からないけど、手早くLaravelを動かせればいいやーって人向けです。

Laradockとは

公式サイトには「Laradockは、Dockerに基づく完全なPHP開発環境です。」とあります。

Laradock is a full PHP development environment based on Docker.

公式

https://laradock.io/

前提

  • パソコンがある
  • Wifiがある

※あとDockerのいんすとーるとかはやっといてくださーい、gitも要るよー。

手順

1. ローカルでディレクトリを作成

  • 任意のディレクトリ作成
$ mkdir laradock
$ cd laradock/

2. LaradockのリポジトリをClone

GithubからLaradockのリポジトリをクローン

$ git clone https://github.com/Laradock/laradock.git laradock-practice
$ cd laradock-practice/

laradock-practiceの部分は、好きに変えてください。
デフォルトでは「laradock」というディレクトリになりますが、引数に名前を渡すとオリジナルのものができあがります。名前はつけておいたほうがいいっすね。

3. 各種設定 (Laradock)

  • 設定ファイルのコピー作成
$ cp env-example .env

.env(設定ファイル)を開く

$ vi .env

以下の項目を探し、修正してください

修正前

APP_CODE_PATH_HOST=../

修正後

APP_CODE_PATH_HOST=../laradock-project

laradock-projectの部分はこれから作るLaravelプロジェクトの名前にしてください。
LaravelのWebサーバー上で同期するディレクトリを指定しています。
これをちゃんと指定してあげないとアクセス時404エラーになります。

※viコマンドはコマンドでファイルの編集ができます。編集したい箇所で「i」を入力するとインサートモードになり文字が打てるようになります。インサートモードを終了するには「esc」ボタンを入力します。その後、編集したファイルを保存し、終了するには「:」と「wq」を立て続けに入力してください。

修正前

MYSQL_VERSION=latest
MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root

修正後

MYSQL_VERSION=5.7(別に5.7じゃなくても)
MYSQL_DATABASE=このへんは
MYSQL_USER=じゆうに
MYSQL_PASSWORD=きめちゃってください
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root

※詳しく調べていませんが、mysqlのverをlatestで最新にするとセキュリティ上の問題でうまく接続できないらしいです。僕はちなみに、5.7にしているのにうまく動かない時があり、なぜだろうと思っていたら「5.7t」と記述しており、5.7トンという重さを指定してしまっていたことがありました。

  • laradock-practice/nginx/sites/default.confの変更

これはnginxに関する設定ファイルです。
nginx起動時に表示するファイルなどを指定できるのですが、パスの指定がうまくいっていない場合があるので、修正する必要があれば書き換えましょう。
着目してもらいたいのは一部分です。
以下のような修正前の状態になっていれば、修正してください。
laradock-projectの部分はそれぞれ作成されるLaravelプロジェクトの名前を指定してください。

修正前

root /var/www/public;

修正後

root /var/www/laradock-project/public;

4. コンテナ立ち上げ〜プロジェクトの作成

  • コンテナの立ち上げ
$ docker-compose up -d mysql nginx

docker-compose upコマンドはdocker-compose.ymlに書かれた情報をもとに処理を実行します(コンテナイメージの作成からコンテナの立ち上げなど。引数なしだと記述されている内容すべてが実行されるので、ひとまずDBサーバのmysqlとwebサーバのnginxを指定します。
※-dはデタッチモード(バックグラウンドで起動します)

  • コンテナの起動確認

以下のように立ち上がっていれば大丈夫です。

$ docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                            NAMES
82e444c0ae67        laradock_nginx       "/bin/bash /opt/star…"   6 seconds ago       Up 4 seconds        0.0.0.0:80-81->80-81/tcp, 0.0.0.0:443->443/tcp   laradock_nginx_1
bd531621d6a3        laradock_php-fpm     "docker-php-entrypoi…"   7 seconds ago       Up 6 seconds        9000/tcp                                         laradock_php-fpm_1
1665d8a83f3b        laradock_workspace   "/sbin/my_init"          8 seconds ago       Up 7 seconds        0.0.0.0:2222->22/tcp                             laradock_workspace_1
d8b22e74c28f        docker:dind          "dockerd-entrypoint.…"   10 seconds ago      Up 8 seconds        2375-2376/tcp                                    laradock_docker-in-docker_1
7af2df7ebe17        laradock_mysql       "docker-entrypoint.s…"   10 seconds ago      Up 8 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp                laradock_mysql_1
  • ワークスペースコンテナに入る

ワークスペースコンテナに入ります。exec、bashでそのコンテナに対してコマンドが叩けるようになります。

ワークスペースとはLaravelの開発を進めるにあたって必要なcomposerなどのツール類が用意された作業スペースみたいなところです。

デフォルトだとrootでワークスペースに入ることになるのですが、後ほどcomposerコマンドを実行した際に、怒られてしまうので、怒られるのが苦手な人は--user=laradockとかでlaradockユーザーとしてワークスペースに入ってください。

$ docker-compose exec --user=laradock workspace bash
.../var/www$
  • Laravelプロジェクトの作成

以下のコマンドで、Laravelのプロジェクトがlaradockディレクトリと同じ階層の中に作成されます。
この実行内容だと最新verのLaravelでプロジェクトが作られます。ver指定したい場合は調べてください。

.../var/www$ composer create-project laravel/laravel laradock-project
...以下略
Application key set successfully.
  • プロジェクト内へ移動

プロジェクト内に移動します。

.../var/www$ cd laradock-project/

5. 各種設定(Laravelプロジェクト)

  • 設定ファイルの修正
.../var/www$ vi .env

以下のように修正

修正前

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

修正後

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=このへんはさっきつくった
DB_USERNAME=Laradockの.envの内容と
DB_PASSWORD=合わせてください

.envの内容は先ほど作ったLaradockの方の内容と整合性が取れている必要がありますので合わせておいてください。

7. MySQLの確認

MySQLの設定がうまくいっているかを確認します。

  • MySQLコンテナへ入る

Ctl + dでワークスペースコンテナを出て、MySQLコンテナに入ります。

$ docker-compose exec mysql bash
  • MySQLへ接続

MySQLへ、接続します。defaultの部分は先ほど.envファイルで設定したユーザーネームを指定し、その後パスワードを聞かれるので、同じように.envで設定したパスワードを入力してください。うまくログインできればsqlコマンドが打てる画面に移り変わります。

# mysql -u default -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.27 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
  • データベースの確認

うまく設定できていれば、.envで設定したデータベースが作られているはずです

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| default            |
+--------------------+
2 rows in set (0.02 sec)
  • ユーザーの確認(rootで入った場合のみ行えます)

こちらも設定できていれば、.envで設定したユーザーが登録されていることが確認できますが、mysqlにroot権限で接続している必要があります。

mysql> select User from mysql.user;
+---------------+
| User          |
+---------------+
| default       |
| root          |
| mysql.session |
| mysql.sys     |
| root          |
+---------------+
5 rows in set (0.02 sec)
  • マイグレーションチェック

マイグレーションを実行し、データベースの接続が上手くいっているかを確認します。
Laravelにおけるマイグレーションとはデータベースのバージョン管理機能のことです。

MySQL確認の延長ですが、一旦MySQLコンテナから抜け、ワークスペースコンテナに入り、プロジェクト内に移動して以下のコマンドを実行します。

データベース接続がうまくいっていればマイグレーションが実行されます。

$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.07 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.06 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.03 seconds)

ここまでの流れで上手くいかない場合

  • Laradock、Laravelプロジェクトの各.envファイルの整合性が取れていない可能性

→.envファイルの設定がそれぞれ同じになっているかを確認し、合っていなければ合わせてください。

  • ストレージデータの影響

→laradockでDBを使用する際のストレージがデフォルトで、~/.laradock/dataに設定されています。~/.laradock/dataにmysqlというディレクトリが存在しているので一旦削除してやり直してみてください。

補足
デフォルトで~/.laradock/dataが設定されていると説明しましたが、これでは他にLaradockを使ってプロジェクトを作成した際に同じ場所を参照してしまうので変えた方がいいっぽいです。ここでは詳しく解説はしませんので詳細は調べてください。

  • .envの書き換え等が反映されていない可能性

コンテナを立ち上げたまま、.env等の設定を書き換えただけでは内容が反映されません。
一度、コンテナを起動させ直しましょう。

再起動

$ docker-compose restart

ダメなら停止と削除〜起動

$ docker-compose down
$ docker-compose up -d mysql nginx

8. プロジェクトの起動確認

  • localhostへアクセス

nginxのコンテナを立ち上がっている状態でlocalhostへアクセスします。うまくいっていれば、Laravelのトップページが表示されます。

スクリーンショット 2020-02-08 19.51.35.png

上手くいかない場合

  • Laradockの.envファイルのAPP_CODE_PATH_HOSTの設定が正しくできていない

→プロジェクトが存在するパスをちゃんと記述してあげてください。

  • nginxのdefault.confのパス指定が上手くできていない

 →上記に手順を記載していますので、やり直してください。

  • nginxコンテナが立ち上がっていない

 →docker psコマンドで確認し、立ち上がっていなければ、立ち上げてください。

ここまでくればとりあえずの環境構築は完了です!

あとは煮るなり焼くなり好きにしてください!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

とりあえずLaradock

対象者

とりあえずインフラとかDockerとか慣れてなくてよく分からないけど、手早くLaravelを動かせればいいやーって人向けです。

Laradockとは

公式サイトには「Laradockは、Dockerに基づく完全なPHP開発環境です。」とあります。

Laradock is a full PHP development environment based on Docker.

公式

https://laradock.io/

前提

  • パソコンがある
  • Wifiがある

※あとDockerのいんすとーるとかはやっといてくださーい、gitも要るよー。

手順

1. ローカルでディレクトリを作成

  • 任意のディレクトリ作成
$ mkdir laradock
$ cd laradock/

2. LaradockのリポジトリをClone

GithubからLaradockのリポジトリをクローン

$ git clone https://github.com/Laradock/laradock.git laradock-practice
$ cd laradock-practice/

laradock-practiceの部分は、好きに変えてください。
デフォルトでは「laradock」というディレクトリになりますが、引数に名前を渡すとオリジナルのものができあがります。名前はつけておいたほうがいいっすね。

3. 各種設定 (Laradock)

  • 設定ファイルのコピー作成
$ cp env-example .env

.env(設定ファイル)を開く

$ vi .env

以下の項目を探し、修正してください

修正前

APP_CODE_PATH_HOST=../

修正後

APP_CODE_PATH_HOST=../laradock-project

laradock-projectの部分はこれから作るLaravelプロジェクトの名前にしてください。
LaravelのWebサーバー上で同期するディレクトリを指定しています。
これをちゃんと指定してあげないとアクセス時404エラーになります。

※viコマンドはコマンドでファイルの編集ができます。編集したい箇所で「i」を入力するとインサートモードになり文字が打てるようになります。インサートモードを終了するには「esc」ボタンを入力します。その後、編集したファイルを保存し、終了するには「:」と「wq」を立て続けに入力してください。

修正前

MYSQL_VERSION=latest
MYSQL_DATABASE=default
MYSQL_USER=default
MYSQL_PASSWORD=secret
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root

修正後

MYSQL_VERSION=5.7(別に5.7じゃなくても)
MYSQL_DATABASE=このへんは
MYSQL_USER=じゆうに
MYSQL_PASSWORD=きめちゃってください
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=root

※詳しく調べていませんが、mysqlのverをlatestで最新にするとセキュリティ上の問題でうまく接続できないらしいです。僕はちなみに、5.7にしているのにうまく動かない時があり、なぜだろうと思っていたら「5.7t」と記述しており、5.7トンという重さを指定してしまっていたことがありました。

  • laradock-practice/nginx/sites/default.confの変更

これはnginxに関する設定ファイルです。
nginx起動時に表示するファイルなどを指定できるのですが、パスの指定がうまくいっていない場合があるので、修正する必要があれば書き換えましょう。
着目してもらいたいのは一部分です。
以下のような修正前の状態になっていれば、修正してください。
laradock-projectの部分はそれぞれ作成されるLaravelプロジェクトの名前を指定してください。

修正前

root /var/www/public;

修正後

root /var/www/laradock-project/public;

4. コンテナ立ち上げ〜プロジェクトの作成

  • コンテナの立ち上げ
$ docker-compose up -d mysql nginx

docker-compose upコマンドはdocker-compose.ymlに書かれた情報をもとに処理を実行します(コンテナイメージの作成からコンテナの立ち上げなど。引数なしだと記述されている内容すべてが実行されるので、ひとまずDBサーバのmysqlとwebサーバのnginxを指定します。
※-dはデタッチモード(バックグラウンドで起動します)

  • コンテナの起動確認

以下のように立ち上がっていれば大丈夫です。

$ docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                            NAMES
82e444c0ae67        laradock_nginx       "/bin/bash /opt/star…"   6 seconds ago       Up 4 seconds        0.0.0.0:80-81->80-81/tcp, 0.0.0.0:443->443/tcp   laradock_nginx_1
bd531621d6a3        laradock_php-fpm     "docker-php-entrypoi…"   7 seconds ago       Up 6 seconds        9000/tcp                                         laradock_php-fpm_1
1665d8a83f3b        laradock_workspace   "/sbin/my_init"          8 seconds ago       Up 7 seconds        0.0.0.0:2222->22/tcp                             laradock_workspace_1
d8b22e74c28f        docker:dind          "dockerd-entrypoint.…"   10 seconds ago      Up 8 seconds        2375-2376/tcp                                    laradock_docker-in-docker_1
7af2df7ebe17        laradock_mysql       "docker-entrypoint.s…"   10 seconds ago      Up 8 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp                laradock_mysql_1
  • ワークスペースコンテナに入る

ワークスペースコンテナに入ります。exec、bashでそのコンテナに対してコマンドが叩けるようになります。

ワークスペースとはLaravelの開発を進めるにあたって必要なcomposerなどのツール類が用意された作業スペースみたいなところです。

デフォルトだとrootでワークスペースに入ることになるのですが、後ほどcomposerコマンドを実行した際に、怒られてしまうので、怒られるのが苦手な人は--user=laradockとかでlaradockユーザーとしてワークスペースに入ってください。

$ docker-compose exec --user=laradock workspace bash
.../var/www$
  • Laravelプロジェクトの作成

以下のコマンドで、Laravelのプロジェクトがlaradockディレクトリと同じ階層の中に作成されます。
この実行内容だと最新verのLaravelでプロジェクトが作られます。ver指定したい場合は調べてください。

.../var/www$ composer create-project laravel/laravel laradock-project
...以下略
Application key set successfully.
  • プロジェクト内へ移動

プロジェクト内に移動します。

.../var/www$ cd laradock-project/

5. 各種設定(Laravelプロジェクト)

  • 設定ファイルの修正 .../var/www$ vi .env

以下のように修正

修正前

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

修正後

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=このへんはさっきつくった
DB_USERNAME=Laradockの.envの内容と
DB_PASSWORD=合わせてください

.envの内容は先ほど作ったLaradockの方の内容と整合性が取れている必要がありますので合わせておいてください。

7. MySQLの確認

MySQLの設定がうまくいっているかを確認します。

  • MySQLコンテナへ入る

Ctl + dでワークスペースコンテナを出て、MySQLコンテナに入ります。

$ docker-compose exec mysql bash
  • MySQLへ接続

MySQLへ、接続します。defaultの部分は先ほど.envファイルで設定したユーザーネームを指定し、その後パスワードを聞かれるので、同じように.envで設定したパスワードを入力してください。うまくログインできればsqlコマンドが打てる画面に移り変わります。

# mysql -u default -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.27 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
  • データベースの確認

うまく設定できていれば、.envで設定したデータベースが作られているはずです

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| default            |
+--------------------+
2 rows in set (0.02 sec)
  • ユーザーの確認(rootで入った場合のみ行えます)

こちらも設定できていれば、.envで設定したユーザーが登録されていることが確認できますが、mysqlにroot権限で接続している必要があります。

mysql> select User from mysql.user;
+---------------+
| User          |
+---------------+
| default       |
| root          |
| mysql.session |
| mysql.sys     |
| root          |
+---------------+
5 rows in set (0.02 sec)
  • マイグレーションチェック

マイグレーションを実行し、データベースの接続が上手くいっているかを確認します。
Laravelにおけるマイグレーションとはデータベースのバージョン管理機能のことです。

MySQL確認の延長ですが、一旦MySQLコンテナから抜け、ワークスペースコンテナに入り、プロジェクト内に移動して以下のコマンドを実行します。

データベース接続がうまくいっていればマイグレーションが実行されます。

$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.07 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.06 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.03 seconds)

ここまでの流れで上手くいかない場合

  • Laradock、Laravelプロジェクトの各.envファイルの整合性が取れていない可能性

→.envファイルの設定がそれぞれ同じになっているかを確認し、合っていなければ合わせてください。

  • ストレージデータの影響

→laradockでDBを使用する際のストレージがデフォルトで、~/.laradock/dataに設定されています。~/.laradock/dataにmysqlというディレクトリが存在しているので一旦削除してやり直してみてください。

補足
デフォルトで~/.laradock/dataが設定されていると説明しましたが、これでは他にLaradockを使ってプロジェクトを作成した際に同じ場所を参照してしまうので変えた方がいいっぽいです。ここでは詳しく解説はしませんので詳細は調べてください。

  • .envの書き換え等が反映されていない可能性

コンテナを立ち上げたまま、.env等の設定を書き換えただけでは内容が反映されません。
一度、コンテナを起動させ直しましょう。

再起動

$ docker-compose restart

ダメなら停止と削除〜起動

$ docker-compose down
$ docker-compose up -d mysql nginx

8. プロジェクトの起動確認

  • localhostへアクセス

nginxのコンテナを立ち上がっている状態でlocalhostへアクセスします。うまくいっていれば、Laravelのトップページが表示されます。

スクリーンショット 2020-02-08 19.51.35.png

上手くいかない場合

  • Laradockの.envファイルのAPP_CODE_PATH_HOSTの設定が正しくできていない

→プロジェクトが存在するパスをちゃんと記述してあげてください。

  • nginxのdefault.confのパス指定が上手くできていない

 →上記に手順を記載していますので、やり直してください。

  • nginxコンテナが立ち上がっていない

 →docker psコマンドで確認し、立ち上がっていなければ、立ち上げてください。

ここまでくればとりあえずの環境構築は完了です!

あとは煮るなり焼くなり好きにしてください!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelをインストールしたときにまずやること(ログ設定変更)

TL;DR

config/logging.phpの設定を確認すること。

stackのchannelsをdailyに変更

Laravelをインストールして、私がまずやるのはログの設定を変更することです。
ログの設定はconfig/logging.phpにまとめられています。
singledailyslackなどがあり、デフォルトはstackで、stackは複数のログをchannelsでまとめることができます。

最新のLaravel 6.12.0では、stackchannels['single']となっていました。
私はこのsingledailyに変更します。

config/logging.php
...

    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['daily'],
            'ignore_exceptions' => false,
        ],

...

古の昔(バージョン4時代)も今と同じくsingleだったのですが、最近はデフォルトでdailyの記憶があります。
調べたら、5.8.35ではstackのデフォルトはdaily
6.5.2までdaily、6.8.0でsingleに戻っていました。
何故に戻った。。。:sweat_smile:
singleのままだと、単一のログファイルにログが溜まっていき、巨大なログファイルを生成してしまいます。
しかも削除されません。
これがdailyだとログローテーションで一定期間後には削除されます。
膨大なログを想定しているなら、それ相応のロギングシステムを外部サービス含めて検討すべきですが、
とりあえずはdailyにしておくのが良策かなと思います:thumbsup:

php_sapi_nameでログファイルを分ける

さらにですが、Webアクセスとコンソールコマンドで出力先ログファイルを分けます。

config/logging.php
...
        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel-'.php_sapi_name().'.log'),
            'level' => 'debug',
            'days' => 14,
        ],
...

例えばartisanコマンドでエラーがログファイルに出力された後に、Webアクセスでエラーが発生した場合、ログファイルに書き込み権限がなくて書き込めないエラーが発生します:cry:
それが上記のように変更することで、artisanコマンドでのエラーはlaravel-cli-YYYY-MM-DD.log
Webアクセスからのエラーはlaravel-fpm-fcgi-YYYY-MM-DD.logに出力されます(Apacheだとapache2handlerになります)。
しかもログファイルによってエラー発生元が切り分けられて調査も楽になるので、皆さんも是非!!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelをインストールしたときにまずやること

TL;DR

config/logging.phpの設定を確認すること。

Laravelのログ設定

Laravelをインストールして、私がまずやるのはログの設定を変更することです。
ログの設定はconfig/logging.phpにまとめられています。
singledailyslackなどがあり、デフォルトはstackで、stackは複数のログをchannelsでまとめることができます。

最新のLaravel 6.12.0では、stackchannels['single']となっていました。
私はこのsingledailyに変更します。

config/logging.php
...

    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['daily'],
            'ignore_exceptions' => false,
        ],

...

古の昔(バージョン4時代)も今と同じくsingleだったのですが、最近はデフォルトでdailyの記憶があります。
調べたら、5.8.35ではstackのデフォルトはdaily
6.5.2までdaily、6.8.0でsingleに戻っていました。
何故に戻った。。。:sweat_smile:
singleのままだと、単一のログファイルにログが溜まっていき、巨大なログファイルを生成してしまいます。
しかも削除されません。
これがdailyだとログローテーションで一定期間後には削除されます。
膨大なログを想定しているなら、それ相応のロギングシステムを外部サービス含めて検討すべきですが、
とりあえずはdailyにしておくのが良策かなと思います:thumbsup:

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

mysqlのデフォルト値の設定

やりたいこと

デフォルトのプロフィール画像を設定したい。

マイグレーションでのデフォルト値設定

カラムにデフォルト値を設定するには->default('[値]')をつけるだけです。

    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->string('profile_image')->nullable()->comment("プロフィール画像")->default('default_icon.jpeg');
        });
    }

profile_imageカラムにdefault_icon.jpegをデフォルト値を設定しました。

あとはストレージにdefault_icon.jpegを置いとくだけ。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelのインストールやデプロイの自分用メモ

まじで自分用のメモ。

メモだけどおかしいところは突っ込んでもらえたらよろこびます。
パーミッション関係に自信がない・・・

サーバの初期設定

$ yum-config-manager --enable remi-php71をしている状態です
$ yum install --enablerepo=remi,remi-php71,remi-php73 php-zip
$ yum -y install php-zip
$ composer global require laravel/installer

パスの登録
macOSとGNU/Linuxディストリビューション:

$ HOME/.composer/vendor/bin
~/.bash_profile に下記を追加
PATH=$PATH:$HOME/.composer/vendor/bin
                        PATH=$PATH:$HOME/.config/composer/vendor/bin かも
  source ~/.bash_profile

apahceのmod_rewriteを有効にする

 find / -name 'mod_rewrite.so'
 find / -name 'httpd.conf'

 下記をhttpd.confの一番下とかに追加する
 LoadModule rewrite_module modules/mod_rewrite.so
 httpd.confのAllowOverride NoneをすべてAllowOverride Allにかきかえる

Laravel最新版を使う場合はmariaDBのバージョンもふさわしく新しくする必要あり
https://www.petitmonte.com/linux/mariadb_install.html

プロジェクトの初期設定
htaccessをいじる

開発作業

laravel new [プロジェクト名]

デプロイ作業

Laravelプロジェクトをgithubからダウンロードした直後にやること

https://blog.capilano-fw.com/?p=289#i-4
.envファイルの設定
config/app.phpの'timezone' => 'UTC'を'timezone' => 'Asia/Tokyo'とする
# composer install --no-dev
# php artisan storage:link
# sudo chmod 777 storage -R
# sudo chown -R apache:apache storage //ログ書き込みエラーで失敗する対策
# sudo chmod 777 bootstrap/cache -R
# php artisan key:generate
# npm install
# npm run prod
# mysql -u 'ユーザ名' -p'パスワード'
mysql> CREATE DATABASE example CHARACTER SET utf8mb4;
mysql> CREATE USER 'ユーザー名'@'ホスト名' IDENTIFIED BY 'パスワード';
mysql> GRANT ALL PRIVILEGES ON `dbname`.* TO 'username'@'hostname'  IDENTIFIED BY 'password';

(キューを使う場合は)キューの非同期処理

プロセス生成
/etc/supervisord.conf に設定を追加
supervisorの設定をする
https://readouble.com/laravel/5.5/ja/queues.html を参照すること

# sudo supervisorctl reread
# sudo supervisorctl update
# sudo supervisorctl start laravel-worker:*
失敗時のテーブル生成(これはmigrationファイルがGitに登録されているはずなので不要)
# php artisan queue:failed-table()
# php artisan migrate

DBのバックアップを定期的に取る

下記を参考にする
試しにバックアップとリストアをして、DBが復旧できることを確認する。
https://centosinstall.com/centos/database/mysql-backup
https://qiita.com/macer_fkm/items/d920ff77f0f5ae5484f9

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【LaravelDB.com】新機能 ”テーブル定義をパッと見で理解する!” 「Newテーブル一覧表示機能」

New!2月8日 [Newテーブル一覧表示機能] について解説

DEMO動画(初めての人はこちらから)

【 YouTubeリンク>> LaravelDB.com の操作方法 】

LaravelDB.comについて詳しく知りたい人はこちらもどうぞ!!
https://qiita.com/daisu_yamazaki/items/068595670bdc2b6fe3fc
en.jpg

1. ER図画面から 「 ER図のLoad/Save 」ボタンをクリック

https://laraveldb.com
注意)テーブル定義(データ)が表示されてることを確認してください。

2. 「 MIGRATION/TABLE 」ボタンをクリック

3.ダウンロードしてフォルダを開く

ZIP圧縮ファイルをダウンロードします。
フォルダ内の「 table_design.html 」HTMLファイルをダブルクリックで開きます。

4.「テーブル一覧」を解りやすく表示


更に詳しく ↓↓↓↓↓↓

5.外部キー制約がある場合は以下のように表示されます。


これまた、わかりやすいですね。
カラム名・型・コメント、外部キーまで一覧で見れます!!

これでTeamメンバーやお客さま、他の人にもテーブル情報を共有可能ですね!!

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【LaravelDB.com】〜機能解説〜 テーブル定義をHTML で”見やすく!”表示(機能アップデート)

LaravelDB.comの新機能[テーブル定義一覧(HTML)]について解説

en.jpg

DEMO動画(初めての人はこちらから)

【 YouTubeリンク>> LaravelDB.com の操作方法 】

LaravelDB.comについて詳しく知りたい人はこちらもどうぞ!!
https://qiita.com/daisu_yamazaki/items/068595670bdc2b6fe3fc

1. ER図画面から 「 ER図のLoad/Save 」ボタンをクリック

https://laraveldb.com
注意)テーブル定義(データ)が表示されてることを確認してください。

2. 「 MIGRATION/TABLE 」ボタンをクリック

3.ダウンロードしてフォルダを開く

ZIP圧縮ファイルをダウンロードします。
フォルダ内の「 table_design.html 」HTMLファイルをダブルクリックで開きます。

4.「テーブル一覧」を解りやすく表示


更に詳しく ↓↓↓↓↓↓

5.外部キー制約がある場合は以下のように表示されます。


これまた、わかりやすいですね。
カラム名・型・コメント、外部キーまで一覧で見れます!!

これでTeamメンバーやお客さま、他の人にもテーブル情報を共有可能ですね!!

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravelでバリデーションを使ってみた

まず最初に

まず最初に。
初心者なので違ったことを書いている場合があるかもしれませんので、
その時はご指摘いただければと思います。

現在、laravelでCRUDを勉強中。

今回はバリデーションを使ってみたんですが、少し戸惑うこともありましたが取りあえず完成しました。
今回はlaravel公式サイトの日本語訳サイトのバリデーションのドキュメントを参考にしました。

Laravel 6.x バリデーション

MIT lisence
/**
Copyright (c) 2019 Taylor Otwell(Original) and Hirohisa kawase(Translation)
This software is released under the MIT License.
http://opensource.org/licenses/mit-license.php
*/

バリデーションエラーを表示

バリデーションエラーを表示できるようにviewファイルに以下のコードを追加しました。

create.blade.php
@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

スクリーンショット 2020-02-08 11.12.45.png
表示のイメージは上記のような感じとなります。
ちなみにのエラーメッセージは後ほどカスタイズできるので便宜上”error message”としています。

バリデータの生成

バリデータの生成を使うにはまずバリデータを使うコントローラーにValidatorファサードを使えるように次のコードを追加する必要があります。
こういうコードって忘れがちなんで気をつけていただければと思います。

UserController.php
<?php
namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator; //この行を追加

次にUseControllerクラスのstore関数に次のコードを追加します。

UserController.php
class UserController extends Controller
{
    public function store(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'title' => 'unique:users',
        ]);
        if ($validator->fails()) {
            return redirect('users/create')
                        ->withErrors($validator)
                        ->withInput();
        }
    }
}

まずmakeメソッドの第1引数の$request->all()はバリデーションを行うデータでリクエストの全てを取得しています。
第2引数はそのデータに適用するバリデーションのルールです。titleに適用するルールは'unique:users'となっていて
unique:usersはusersテーブルに使われているtitleは重複不可と言う意味です。
次にバリデーションでエラーが生じた場合のコードがif文から書いてありますが、私もよくわからないのでこういうものだということにしておきます。

先程のコードで出てきたバリデータは3つに引数があります。

$validator = Validator::make($input, $rules, $messages);

第1引数と第2引数は上記で説明した通りで、最後の第3引数はエラーメッセージのカスタムメッセージを渡します。
最初に出てきたエラーメッセージ”error message”を日本語にしてみたいと思います。

以下のようなコードでカスタムエラーメッセージを指定することができます。

$messages = [
    'title.unique' => 'titleが重複しています。',
];

バリデータのまとめ

以上のバリデータのコードを利用してバリデータをまとめたい思います。

$input = $request->all(); //第1引数:バリデーションを行うデータ

$rules = ['title' => 'unique:users']; //第2引数:そのデータの適用するルール

$messages = ['title.unique' => 'titleが重複しています。']; //第3引数:カスタムエラーメッセージを指定する

$validator = Validator::make($input, $rules, $messages);

わかりやすくするためにルールを1つにしたことでコードをすっきりすることができたと思います。
上記のように3つの引数を完全に分けて考えたほうが、複雑になってもメンテナンスしやすいんじゃないでしょうか?
私も見直すために投稿しているのでわかりやすくしたつもりなので、皆様の参考になればと思います。

License

MIT

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerを使ったLaravelの環境構築

はじめに

最近は現場でも、Docker環境下でLaravleを触ることが増えて少しは知見も溜まってきたかと思いますので、忘れないように忘備録として残しておきます

ここでは、dockerdocker-composeのインストールに関しては触れませんので、まだの方はこちらの記事がわかりやすかったので参考にしてみてください

記事内の不備や、もっとこうした方がいいいよというアドバイスがございましたらコメントお願いします

構成

任意のディレクトリにSampleProjectを作成して下記のディテクトり構成で環境を構築します

SampleProject
  ├── docker-compose.yml
  ├── docker
  │   ├── php
  │   │    ├── Dockfile
  │   │    └── php.ini
  │   └── nginx
  │        └── default.conf
  └── src
      └──  Laravelのプロジェクトファイル

docker-compose.ymlの中身

docker-compose.ymlは複数のコンテナを同時に動かすためのツールである、Docker Composeを利用するために使用するYAMLファイルです

docker-compose.yml
version: '3'

services:
  php:
    container_name: php-1
    build: ./docker/php
    volumes:
      - ./src:/var/www

  nginx:
    image: nginx
    container_name: nginx-1
    ports:
      - 80:80
    volumes:
      - ./src:/var/www
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php

  db:
    image: mysql:5.7
    container_name: db-host-1
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: sample_project
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./docker/db/data:/var/lib/mysql
      - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
      - 3306:3306

  node:
    image: node:12.13-alpine
    tty: true
    volumes:
      - ./src:/var/www
    working_dir: /var/www

Dockerfileの中身

DockerfileとはDocker上で動作させるコンテナの構成情報を記述するためのファイルです

FROM php:7.2-fpm
COPY php.ini /usr/local/etc/php/

RUN apt-get update \
  && apt-get install -y zlib1g-dev mariadb-client \
  && docker-php-ext-install zip pdo_mysql

#Composer install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin


WORKDIR /var/www

RUN composer global require "laravel/installer"

php.iniの中身

php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

default.confの中身

default.confはngninxの設定情報を記述するためのファイルです

default.conf
server {
  listen 80;
    index index.php index.html;
    root /var/www/public;

  location / {
    try_files $uri $uri/ /index.php?$query_string;
    }

  location ~ \.php$ {

    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
  }
 }

環境構築の手順

はじめに任意の場所にSampleProjectを作成する

~/ $ mkdir SampleProject

docker-compose.ymlファイルを作成して、中身は冒頭で紹介したdocker-compose.ymlの内容をコピペする

~/SampleProject $ touch docker-compose.yml

Dockerfilephp.iniを作成して、中身は冒頭で紹介したそれぞれのファイルの内容をコピペする

~/SampleProject/docker/php $ touch Dockerfile
~/SampleProject/docker/php $ touch php.ini

defalt.confファイルを作成して、中身は冒頭で紹介したdefault.confの内容をコピペする

~/SampleProject/nginx $ touch default.conf

docker-compose.ymlファイルがあるディレクトリ内で下記コマンドを実行してdockerを起動させる

~/SampleProject $ docker-compose up -d

Creating php                ... done
Creating db-host            ... done
Creating sampleproject_node ... done
Creating nginx              ... done

phpのコンテナ内に入る

~/SampleProject $ docker-compose exec php bash

phpコンテナ内でLaravelプロジェクトを作成する

root@7eb4359bf51c:/var/www# laravel new

phpコンテナを抜ける

root@7eb4359bf51c:/var/www# exit

これでSampleProject/src内にLaravelのプロジェクトファイルが作成され、
http://localhost/ にアクセスするとおなじみのWelcomeページが表示されます

スクリーンショット 2020-02-01 23.33.35.png

MySQLコンテナに入る

~/SampleProject $ docker-compose exec db bash

MySQLコンテナ内でMySQLにログイン

root@630fbaf32806:/# mysql -u root -proot

今回のプロジェクトで使用するデータベースを作成する
データベース名はdocker-compose.ymlで指定した、MYSQL_DATABASEと合わせる必要があります

mysql> mysql> CREATE DATABASE sample_project;

Query OK, 1 row affected (0.01 sec) 

Laravelのプロジェクトファイル内の.envファイルを下記に修正する

.env
DB_CONNECTION=mysql
DB_HOST=db # docker-compose.ymlに記載したDBのサービス名
DB_PORT=3306
DB_DATABASE=sample_project # 使用するDB名
DB_USERNAME=root
DB_PASSWORD=root

phpコンテナに入る

~/SampleProject $ docker-compose exec php bash

phpコンテナ内でマイグレーションを実行する

root@7eb4359bf51c:/var/www# php artisan migrate

Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table (0.06 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table (0.04 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated:  2019_08_19_000000_create_failed_jobs_table (0.02 seconds)

マイグレーションが無事に実行されれば成功です!!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【個人開発】読みたい本を秒で見つける!会社の技術書管理アプリケーション「BookMark」を一般公開しました!

bookmark_qiita.png

個人開発した会社の書籍管理アプリケーション「BookMark」を一般公開しました!
下記URLから見ることができます。(PC推奨)
URL:https://bookmark-tm.herokuapp.com/
GitHub:https://github.com/wallkickers/bookApplication

情報は入力済みなのでログインをクリックするとログインできます。
■ユーザー側
ログインURL:https://bookmark-tm.herokuapp.com/login
■管理側
ログインURL:https://bookmark-tm.herokuapp.com/admin/login

本記事では作ったアプリケーションの概要や機能の紹介など書いております。良かったら使っていただいて感想などもらえると嬉しいです。

■なぜ作ったか

アプリ開発きっかけ.png

まず、本棚に自分の見たい本があるのか分からない。会社にはたくさんの技術書があるのですが、ジャンル分けなどされていないので本を探すときには本棚の端から端まで見る必要がありました。

次に、書籍貸し出しが紙で管理されている。
会社で本を借りるときには書籍貸し出しリストに名前を書いて管理部の人に署名をもらう必要がありました。そのため、管理部の人が帰宅していると本を借りることができません。そもそもこれは紙で管理する必要があるのかという疑問がありました。

そこで作ろうと思い立ったのが今回の「BookMark(書籍管理アプリケーション)」です。

■BookMarkとは

トップ.png
BookMarkは書籍の管理と貸し出し申請をウェブ上で行うことができるアプリケーションです。ユーザーは書籍名での検索、ワンクリックで書籍の貸し出し申請ができます。管理者は書籍情報のcsvをアップロードすることで書籍の登録ができたり、貸し出し申請があった際のslackへの通知設定ができたりします。

■主な機能

BookMarkにはユーザー側の画面と管理側の画面があります。

ユーザー側

1. 会員登録
2. 書籍の検索
3. 貸し出し申請

1. 会員登録

会員登録.png

会員登録は必須です。会員登録には「名前」「メールアドレス」「パスワード」の設定が必要です。

2. 書籍の検索

検索.png

書籍名をカタカナで検索できます。

3. 貸し出し申請

申請.png

書籍の詳細画面から貸し出し申請画面に遷移できます。

管理側

1. 書籍の登録
2. 利用ユーザーの一覧表示
3. 書籍の一覧表示
4. 貸し出しがあった際の通知設定

1. 書籍の登録

csvファイル取得.png

書籍の登録に必要なCSVファイルは「蔵書マネージャー」というスマホアプリと、クラウドにデータを保存できる「Dropbox」を使用すると簡単に作成できます。蔵書マネージャーで書籍のバーコードを読み取り、Dropbox経由でパソコンにcsvファイルをダウンロードしてBookMarkへcsvファイルをアップロードするという流れです。

準備

準備1. スマホに蔵書マネージャーアプリをインストールする
■蔵書マネージャー
・Androidはこちら:https://play.google.com/store/apps/details?id=com.bsy_web.bookmanager&hl=ja
・iPhone:https://apps.apple.com/jp/app/%E8%94%B5%E6%9B%B8%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC-%E6%9B%B8%E7%B1%8D%E7%AE%A1%E7%90%86-%E6%96%B0%E5%88%8A%E6%A4%9C%E7%B4%A2-%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%A7%E3%81%AE%E6%95%B4%E7%90%86/id1071740625

準備2. Dropboxのアカウントを作成する
下記URLからDropBoxのアカウント登録を行います。
URL:https://www.dropbox.com/

1-1. 蔵書マネージャーとDropBoxを連携する

クラウド選択.png
蔵書マネージャー内のメニューからバックアップ(クラウド)を選択し、DropBoxにログインを行います。「蔵書マネージャーがアプリへのアクセスを許可するか」という質問をされるので、許可をクリックします。

1-2. 書籍のバーコードを読み取る

バーコード.png
蔵書マネージャーで「登録」→「カメラでバーコード」をクリックするとカメラが起動してバーコードの読み取り状態になります。カメラで書籍のバーコードを写すと自動で書籍の情報を読み取り、アプリ内に保存してくれます。

1-3. 書籍情報をDropboxにアップロードする

csv.png
再びメニューから「バックアップ(クラウド)」を選択して、「DropBoxへのバックアップ」画面に遷移します。DropBoxと連携ができていれば→「Dropboxでの基本の保管場所」にDropBoxのアカウントが表示されます。表示されていない場合はDropBoxとの連携ができていないので1-1の手順から確認をお願いします。

問題なければ「開始」をクリックしてDropboxへcsvファイルのアップロードを行います。(wi-fi環境での実行がオススメです。)

1-4. Dropboxからcsvファイルをダウンロードする

dropbox.png

Dropboxにログインします。「/アプリ/蔵書マネージャー」から「dat_book.csv」を選択し、ダウンロードをクリックします。csvファイルがダウンロードされたら成功です。

1-5. 管理画面からcsvファイルをインポートする。

書籍csvインポート.png
書籍情報インポート_ファイル選択.png
書籍情報インポート_csv完了.png

管理画面にログインを行い、メニューから「import」を選択します。「ファイルを選択」をクリック後、先ほどダウンロードしたcsvファイル「dat_book.csv」を選択します。「CSV登録が完了しました。」というメッセージが表示されれば成功です。

2. 利用ユーザーの一覧表示

利用ユーザー一覧.png

管理画面のトップ、もしくはメニューから「ユーザー一覧」をクリックするとユーザーの一覧を表示します。

ユーザー詳細.png
ユーザーをクリックすることで、現在ユーザーが借りている書籍を見ることができます。ユーザーを削除したい場合、ユーザーが書籍を借りている状態だと削除できないようになっているので、書籍を返却してもらってから削除してください。

3. 書籍の一覧表示

書籍一覧.png
メニューから「書籍一覧」をクリックすることで登録されている書籍の一覧を表示できます。貸し出し状態では無い書籍は削除することができます。

書籍詳細_ユーザー.png
貸し出し状態の書籍の詳細画面では書籍を借りているユーザーを見ることができます。

4. 貸し出しがあった際の通知設定

通知.png
ユーザーから貸し出し申請があった際にslack通知を行うことができます。

準備

Slackのアカウント作成を行う。
下記URLからSlackのアカウント登録を行います。
URL:https://slack.com/get-started#/

4-1. Webhook URLを取得する。

webhookURL.png
下記URLにアクセスしてWebhook URLを取得します。Slackにログインすると通知を送りたいワークスペースとチャンネルの選択をすることができます。

URL:https://slack.com/services/new/incoming-webhook

画像ではワークスペース「森山Dev」のチャンネル「#general」へ通知設定を行うという想定で設定しています。「Incoming Webhookインテグレーションの追加」をクリックするとWebhook URLが作成されます。

4-2. 通知設定を行う

slack通知設定.png

Slack Name:通知するアカウント名
Slack Icon:通知するアイコン
Slack Channel:通知先チャンネル名
Slack URL:発行したWebhook URL

管理画面のメニューから通知設定をクリックすると「通知アカウント名」「通知アイコン」「チャンネル名」「webhook URL」を設定する画面が表示されます。先ほど作成したWebhook URLは「Slack URL」へ入力してください。

■環境構築方法

環境構築の方法はgithubのREADME.mdに記載しました。
個人で利用したい方、会社で使いたい方はREADME.mdを参照してください。

GitHub:https://github.com/wallkickers/bookApplication

■今後

今後は自社で使ってもらってフィードバックをもらい、さらなる改善をしたいと思っています。

機能追加の要望や不具合、ソースコードのレビュー等いただけると、とても嬉しいです!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【個人開発】読みたい本を秒で見つける!会社の技術書管理アプリケーション「BookMark」を一般公開しました!

bookmark_qiita.png

個人開発した会社の書籍管理アプリケーション「BookMark」を一般公開しました!
下記URLから見ることができます。(PC推奨)
URL:https://bookmark-tm.herokuapp.com/
GitHub:https://github.com/wallkickers/bookApplication

情報は入力済みなのでログインをクリックするとログインできます。
■ユーザー側
ログインURL:https://bookmark-tm.herokuapp.com/login
■管理側
ログインURL:https://bookmark-tm.herokuapp.com/admin/login

本記事では作ったアプリケーションの概要や機能の紹介など書いております。良かったら使っていただいて感想などもらえると嬉しいです。

■なぜ作ったか

アプリ開発きっかけ.png

まず、本棚に自分の見たい本があるのか分からない。会社にはたくさんの技術書があるのですが、ジャンル分けなどされていないので本を探すときには本棚の端から端まで見る必要がありました。

次に、書籍貸し出しが紙で管理されている。
会社で本を借りるときには書籍貸し出しリストに名前を書いて管理部の人に署名をもらう必要がありました。そのため、管理部の人が帰宅していると本を借りることができません。そもそもこれは紙で管理する必要があるのかという疑問がありました。

そこで作ろうと思い立ったのが今回の「BookMark(書籍管理アプリケーション)」です。

■BookMarkとは

トップ.png
BookMarkは書籍の管理と貸し出し申請をウェブ上で行うことができるアプリケーションです。ユーザーは書籍名での検索、ワンクリックで書籍の貸し出し申請ができます。管理者は書籍情報のcsvをアップロードすることで書籍の登録ができたり、貸し出し申請があった際のslackへの通知設定ができたりします。

■主な機能

BookMarkにはユーザー側の画面と管理側の画面があります。

ユーザー側

1. 会員登録
2. 書籍の検索
3. 貸し出し申請

1. 会員登録

会員登録.png

会員登録は必須です。会員登録には「名前」「メールアドレス」「パスワード」の設定が必要です。

2. 書籍の検索

検索.png

書籍名をカタカナで検索できます。

3. 貸し出し申請

申請.png

書籍の詳細画面から貸し出し申請画面に遷移できます。

管理側

1. 書籍の登録
2. 利用ユーザーの一覧表示
3. 書籍の一覧表示
4. 貸し出しがあった際の通知設定

1. 書籍の登録

csvファイル取得.png

書籍の登録に必要なCSVファイルは「蔵書マネージャー」というスマホアプリと、クラウドにデータを保存できる「Dropbox」を使用すると簡単に作成できます。蔵書マネージャーで書籍のバーコードを読み取り、Dropbox経由でパソコンにcsvファイルをダウンロードしてBookMarkへcsvファイルをアップロードするという流れです。

準備

準備1. スマホに蔵書マネージャーアプリをインストールする
■蔵書マネージャー
・Android:https://play.google.com/store/apps/details?id=com.bsy_web.bookmanager&hl=ja
・iPhone:https://apps.apple.com/jp/app/%E8%94%B5%E6%9B%B8%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC-%E6%9B%B8%E7%B1%8D%E7%AE%A1%E7%90%86-%E6%96%B0%E5%88%8A%E6%A4%9C%E7%B4%A2-%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%A7%E3%81%AE%E6%95%B4%E7%90%86/id1071740625

準備2. Dropboxのアカウントを作成する
下記URLからDropBoxのアカウント登録を行います。
URL:https://www.dropbox.com/

1-1. 蔵書マネージャーとDropBoxを連携する

蔵書マネージャー内のメニューからバックアップ(クラウド)を選択し、DropBoxにログインを行います。
「蔵書マネージャーがアプリへのアクセスを許可するか」という質問をされるので、許可をクリックします。

連携できている場合は「Dropboxでの基本の保管場所」にDropBoxのアカウントが表示されます。

1-2. 書籍のバーコードを読み取る

蔵書マネージャーで「登録」→「カメラでバーコード」をクリックするとカメラが起動してバーコードの読み取り状態になります。カメラで書籍のバーコードを写すと自動で書籍の情報を読み取り、アプリ内に保存してくれます。

1-3. 書籍情報をDropboxにアップロードする

「バックアップ(クラウド)を選択」→「開始」をクリックしてDropboxへファイルのアップロードを行います。(wi-fi環境での実行がオススメです。)

1-4. Dropboxからcsvファイルをダウンロードする

Dropboxの「/アプリ/蔵書マネージャー」から「dat_book.csv」を選択し、ダウンロードをクリックします。csvファイルがダウンロードされたら成功です。

1-5. 管理画面からcsvファイルをインポートする。

書籍csvインポート.png
書籍情報インポート_ファイル選択.png
書籍情報インポート_csv完了.png

管理画面にログインを行い、メニューから「import」を選択します。「ファイルを選択」をクリック後、先ほどダウンロードしたcsvファイル「dat_book.csv」を選択します。「CSV登録が完了しました。」というメッセージが表示されれば成功です。

2. 利用ユーザーの一覧表示

利用ユーザー一覧.png

管理画面のトップ、もしくはメニューから「ユーザー一覧」をクリックするとユーザーの一覧を表示します。

ユーザー詳細.png
ユーザーをクリックすることで、現在ユーザーが借りている書籍を見ることができます。ユーザーを削除したい場合、ユーザーが書籍を借りている状態だと削除できないようになっているので、書籍を返却してもらってから削除してください。

3. 書籍の一覧表示

書籍一覧.png
メニューから「書籍一覧」をクリックすることで登録されている書籍の一覧を表示できます。貸し出し状態では無い書籍は削除することができます。

書籍詳細_ユーザー.png
貸し出し状態の書籍の詳細画面では書籍を借りているユーザーを見ることができます。

4. 貸し出しがあった際の通知設定

通知.png
ユーザーから貸し出し申請があった際にslack通知を行うことができます。

準備

Slackのアカウント作成を行う。
下記URLからSlackのアカウント登録を行います。
URL:https://slack.com/get-started#/

4-1. Webhook URLを取得する。

webhookURL.png
下記URLにアクセスしてWebhook URLを取得します。Slackにログインすると通知を送りたいワークスペースとチャンネルの選択をすることができます。

URL:https://slack.com/services/new/incoming-webhook

画像ではワークスペース「森山Dev」のチャンネル「#general」へ通知設定を行うという想定で設定しています。「Incoming Webhookインテグレーションの追加」をクリックするとWebhook URLが作成されます。

4-2. 通知設定を行う

slack通知設定.png

Slack Name:通知するアカウント名
Slack Icon:通知するアイコン
Slack Channel:通知先チャンネル名
Slack URL:発行したWebhook URL

管理画面のメニューから通知設定をクリックすると「通知アカウント名」「通知アイコン」「チャンネル名」「webhook URL」を設定する画面が表示されます。先ほど作成したWebhook URLは「Slack URL」へ入力してください。

■環境構築方法

環境構築の方法はgithubのREADME.mdに記載しました。
個人で利用したい方、会社で使いたい方はREADME.mdを参照してください。

GitHub:https://github.com/wallkickers/bookApplication

■今後

今後は自社で使ってもらってフィードバックをもらい、さらなる改善をしたいと思っています。

機能追加の要望や不具合、ソースコードのレビュー等いただけると、とても嬉しいです!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】authorizeResourceを使いつつ未ログインユーザーに特定のアクションを許可する

authorizeResourceメソッドとは

authorizeResourceメソッドを使うと、コントローラーのCRUDアクションに対して、一括してポリシーによる認可制御を適用できます。

app/Http/Controllers/ArticleController/php
<?php

namespace App\Http\Controllers;

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

class ArticleController extends Controller
{
    public function __construct()
    {
        $this->authorizeResource(Article::class, 'article');
    }
    // 略
}

authorizeResourceメソッドと未ログインユーザー

authorizeResourceメソッドは便利ではあるのですが、認可されるにはユーザーが認証済みであることが必須であるため、アプリケーションの要件によっては使いづらい場合があります。

例えば、Qiitaでは未登録・未ログインユーザーでも各記事を参照できますが、このように参照系であるindexアクションやshowアクションを未ログインユーザー(ゲストユーザー)でも実行させたいとします。

しかし、authorizeResourceメソッドを使っていると、たとえポリシー側の対応するメソッド(viewAny, view)で一律trueを返していたとしても、未ログインユーザーには403がレスポンスされます。

app/Policies/ArticlePolicy.php
<?php

namespace App\Policies;

use App\Article;
use App\User;
use Illuminate\Auth\Access\HandlesAuthorization;

class ArticlePolicy
{
    use HandlesAuthorization;

    public function viewAny(User $user)
    {
        return true; // 一律trueを返していても、未ログインユーザーは403になってしまう
    }

    public function view(User $user, Article $article)
    {
        return true; // 同上
    }
    // 略
}

認可の条件としてログイン済みを必須としない

認可の条件として、ログイン済みを必須としないようにするにはUserクラスの型宣言をnullable(?User)にします。

app/Policies/ArticlePolicy.php
// 略
    public function viewAny(?User $user)
    {
        return true;
    }
// 略

このようにすると、未ログインユーザーでも該当のアクションを実行できます。

なお、その場合もポリシーのメソッドは実行されますので、

app/Policies/ArticlePolicy.php
// 略
    public function viewAny(?User $user)
    {
        return false; 
    }
// 略

falseを返した場合、未ログインユーザーも403になります。

未ログインユーザーが無条件に認可されるわけではありませんので注意してください。

環境

Laravel 6.x

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel artisanコマンドを設定してスクリプト実行

コマンド作成

下記コマンドでartisanコマンドを作成するためのファイルが生成される

$ php artisan make:command コマンド名

app/Console/Commands配下にコマンド名.phpの形で下記ファイルが生成される

app/Console/Commands/コマンド名.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class Scraping extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:name';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //
    }
}

下記項目を追記する

  • $signatureにコマンド名を記述
  • $descriptionにコマンドの説明記述
  • public function handle()内に実行スクリプトを記述

追記してみたファイル

app/Console/Commands/コマンド名.php
<?php
namespace App\Console\Commands;

use Illuminate\Console\Command;

class Scraping extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'コマンド名';  // 追記

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'コマンド名を実行します。';  // 追記

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        echo 'スクリプトを実行しました。' . PHP_EOL;  // PHP_EOLの結合で改行が可能  // 追記
    }
}

public function handle()内を今回はサンプルでechoを実行しているが、関数のスクリプトを記述すれば複雑な処理も実行される

コマンドの確認

設定したコマンドが設定されているか確認可能

# 使用可能なコマンドを確認できる
$ php artisan list

# 出力結果 (Available commands項目)
Available commands:
  コマンド名              コマンド名を実行します  # ここに表示される
  clear-compiled       Remove the compiled class file
  down                 Put the application into maintenance mode
  dump-server          Start the dump server to collect dump information.
  env                  Display the current framework environment
  help                 Displays help for a command
  inspire              Display an inspiring quote
  list                 Lists commands
  migrate              Run the database migrations
  optimize             Cache the framework bootstrap files
  preset               Swap the front-end scaffolding for the application
  serve                Serve the application on the PHP development server
  tinker               Interact with your application
  up                   Bring the application out of maintenance mode

コマンドの実行

$ php artisan コマンド名

# 今回の場合の出力結果
スクリプトを実行しました

(参考)

https://tac-blog.tech/index.php/2018/11/24/web-scraping-1-make-artisan/

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

備忘録_レンタルサーバーにLaravelのプロジェクト作って、git管理する

Laravelのプロジェクトを作る

  1. composerが動く環境を用意する

    備忘録_レンタル共用サーバーでcomposerを使う 参照

  2. プロジェクトを作成する

    composer create-project --prefer-dist laravel/laravel ~/{プロジェクト名} "5.8.*"

  3. (動作確認用)

    ln -s {ドキュメントルート} ~/{プロジェクト名}/public

git管理する

  1. さっき作ったプロジェクトのディレクトリに移動

    cd ~/{プロジェクト名}

  2. リポジトリ作る(ついでに、開発用ブランチも作ったりする)

    git init
    git add -A
    git commin -m "init"
    
    git checkout -b developer
    
    mkdir ~/git_repo
    git clone --bare ~/{プロジェクト名} ~/git_repo/{プロジェクト名}.git
    
  3. ローカルに落とす

    git clone {レンタルサーバーのユーザー名}@{レンタルサーバーのSSHドメイン}:git_repo/{プロジェクト名}.git

いやーーーーー

「git clone」とかで調べてもよく分からず詰まってましたが、最終的にgit公式のドキュメントが全て解決してくれました。

【まずは、公式ドキュメントから読む】はマジで癖つけんとアカンです。。。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む