20200120のlaravelに関する記事は9件です。

Laravel で バリデーションルールに Twitter のTweetのルールを使う

やりたいこと

Twitter連携アプリを作成しており、入力をフロントでtwitter-text.jsを使ってバリデーションしましたが、サーバー側でも行いたい。

公式からはPHP向けのが公開されていませんが、PHP向けのを公開していただけている方がいるので、ありがたく使わせていただきます。
メンテンナンス頻度も高いです。

インストール

composer require nojimage/twitter-text-php

Laravelで独自ルール作成

php artisan make:rule TwitterTextRule
TwitterTextRule
<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;
use Twitter\Text\Parser;

class TwitterTextRule implements Rule
{
    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        $parser = new Parser();
        $parse_result = $parser->parseTweet($value);
        //weightedLengthに文字数、validにツイートできるか
        return $parse_result->valid;
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return ':attributeはTweetできません。';
    }
}

あとはバリデーションルールに指定する

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

Docker MySQLのバージョン変更する方法

はじめに

Docker MySQLのバージョンを 8.0 から 5.7 に下げる際に苦戦したので、一連の流れをまとめました。

Laradockを用いてDocker上でLaravelを動かす環境を作成しました。

docker-image.png

MySQLバージョンを変更する一連の流れ

laradockにあるファイルのMySQLのバージョンを 5.7 に変更します。

.env
### MYSQL #################################################
MYSQL_VERSION=5.7

コンテナを停止し、statusexited になっているのを確認。
mysqlのコンテナを削除。

$ docker-compose stop
$ docker ps -a
$ docker rm コンテナID(mysql)

MYSQLのバージョンを変更する場合は、 DATA_PATH_HOST で設定したフォルダを削除して、イメージを作成し直す必要があるらしい。
そのフォルダは下記コマンドで参照出来る。

$ cat .env | grep DATA_PATH_HOST

DATA_PATH_HOST=~/.laradock-アプリ名/data (人によってバラバラ。)

そのフォルダを削除。

$ rm -rf ~/.laradock-アプリ名/data

次にイメージを削除するのだが、
「dataが削除されますがよろしいですか?」 的な確認文が恐らく出てくるので良ければ y で enter。

$ docker images
$ docker rmi イメージID(laradock_mysql) -f

キャッシュを消し再度ビルド。

$ docker-compose build --no-cache mysql

最後に statusup になっているか。
なっていれば mysql のバージョンを確認し 5.7系になっていればOK。

$ docker ps -a
$ docker-composer exec mysql mysql --version

以上で、動くはずです。

Dockerを勉強し始めたばかりで、説明が大雑把なので
わかりにくい箇所や、疑問点など。
また、勉強する上で参考になったサイトや技術書など教えていただけると幸いです。

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

Laravelの開発環境3つとそれぞれのメリット、デメリット

PHPのWebアプリケーションフレームワークであるLaravelを学習しようと思って調べた際の開発環境について記載します。
ローカル環境はMacOSを想定しています。

Laravel開発環境

Laradock

Laradockは、Laravelの開発環境をDocker Containerに閉じ込めた開発環境です。
公式: https://laradock.io/

メリット

Dockerなので、後に記載する仮想マシンとは違い実行時のオーバーヘッドが小さくなりマシンリソースを省力化出来パフォーマンスが良いです。
また、Docker上に全てを配置するためローカル環境を汚さずにクリーンに保てます。

デメリット

Dockerの扱いをある程度は把握していないと、おかしくなった開発環境を破棄して再構築するなどの操作が出来なくて困ると思いますので、Dockerの予習が必要な点に注意しましょう。

Homestead

Homesteadは、Laravelの開発環境をVagrant BOXとして配布されている開発環境です。
公式: https://laravel.com/docs/6.x/homestead

メリット

VirtualBox等の仮想マシンとして開発環境を構築するものの為、従来からある仮想化に慣れているならすぐにとっつきやすい面があるかなと思います。
Laradockと同じく仮想マシン上に全てを配置するためローカル環境を汚さずにクリーンに保てます。

デメリット

Vagrantの扱いをある程度は把握していないと、Laradockと同じく制御に困ることになると思います。
また、Laradockと違い仮想化するソリューションである為、仮想化によるオーバーヘッドが発生する為パフォーマンスは若干悪い事もデメリットかなと思います。

Valet

Valetは、Laravelの開発環境をローカル環境であるMacへhomebrewを用いて直接インストールする開発環境です。

メリット

Homesteadのように仮想化しないためオーバーヘッドが小さくなりパフォーマンスが良いです。
homebrewのみが分かれば良いので、敷居は比較的低いかと思います。

デメリット

ローカルに直接インストールするため、ローカル環境が汚れます。
LaradockやVagrantのように、環境を壊してしまった場合は環境を破棄して再構築ということが簡単には出来ず、丁寧にエラーを修正したり場合によっては再インストールが必要になります。

まとめ

どの方法も一長一短ありますが、個人的にはValetは避けたいかなと思いました。
やはりローカル環境が汚れてしまうのはよろしくないかなと思っています。
LaradockとHomesteadは優れたソリューションだと思いますが、Laravelの開発環境構築は理解しておりその後の開発そのものを学習したい場合に良いソリューションだと判断しました。
私自身に関してで恐縮ですが、Laravelの開発環境構築そのもののプロセスから学びたいという気持ちがあり、ここをショートカットしたくはなかったので、上記ソリューションを調べつつも結局はどれも採用せず、Vagrant経由でUbuntuをVirtualBoxにインストールし、地道に開発環境を仮想マシン上に手作業で構築する方法で落ち着きました。

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

Laradockを使ってLaravel環境を試した

はじめに

今更にはなりますが、 流行りの LaravelLaradock を用いて立ててみました。
Qiitaだけでも漁るといっぱい記事が出てくる内容にはなりますが、ご了承くださいm(_ _)m

Laradockとは?

こちら になります。
dockerでLaravelを動かすために開発されたプロジェクトです。
様々なPHPのバージョン、DB、ミドルウェアをチョイスすることが出来るようです。

前提

下記モジュールがインストールされていること。
それぞれ参考記事を確認いただければ、サクッとインストール可能です。

Laradockのインストール

プロジェクト用ディレクトリ作成

まずは下記コマンドで、プロジェクト用のディレクトリを作成します。

% mkdir ~/workspace/laravel_sample
% cd ~/workspace/laravel_sample

githubからのclone

下記コマンドで、githubから Laradock をダウンロードします。

% git clone https://github.com/Laradock/laradock.git
Cloning into 'laradock'...
remote: Enumerating objects: 10007, done.
remote: Total 10007 (delta 0), reused 0 (delta 0), pack-reused 10007
Receiving objects: 100% (10007/10007), 8.99 MiB | 3.30 MiB/s, done.
Resolving deltas: 100% (5432/5432), done.

.envファイルの修正

クローンした Laradock ディレクトリ内にある、 env-example をコピーして 設定定義用の .env を作成します。

% cd laradock
% cp env-example .env
% ls -l .env
-rw-r--r--  1 member group  27511  1 20 17:35 .env

その後、 .env ファイルに、下記を追加します。

DB_HOST=mysql
REDIS_HOST=redis
QUEUE_HOST=beanstalkd

dockerコンテナの実行

これでコンテナを起動する設定が完了したため、任意のコンテナを実行します。
今回の例では nginx mysql redis を実行しています。
サポートされているミドルウェアについては、 公式ページ をご確認ください。

docker-compose up -d nginx mysql redis workspace

dockerコンテナの起動確認

下記コマンドでコンテナが起動していることを確認します。

% docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                      NAMES
359efff2066b        laradock_nginx       "/bin/bash /opt/star…"   2 minutes ago       Up 2 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   laradock_nginx_1
e920c68c0061        laradock_php-fpm     "docker-php-entrypoi…"   2 minutes ago       Up 2 minutes        9000/tcp                                   laradock_php-fpm_1
192ebe58ccea        laradock_workspace   "/sbin/my_init"          2 minutes ago       Up 2 minutes        0.0.0.0:2222->22/tcp                       laradock_workspace_1
84fbc83b3730        docker:dind          "dockerd-entrypoint.…"   2 minutes ago       Up 2 minutes        2375-2376/tcp                              laradock_docker-in-docker_1
28c432f44127        laradock_mysql       "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        0.0.0.0:3306->3306/tcp, 33060/tcp          laradock_mysql_1
1722ae0554b7        laradock_redis       "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        0.0.0.0:6379->6379/tcp                     laradock_redis_1

このまま http://localhost にアクセスすると、nginxの404ページが表示されると思います。

Laravelプロジェクトの作成

まずは下記コマンドを実行し、 laradock_workspace のイメージから作られたコンテナの中に入ります。

docker exec -it laradock_workspace_1 bash
root@192ebe58ccea:/var/www#

プロジェクト作成

下記コマンドで Laravel プロジェクトを実際に作成します。

composer create-project laravel/laravel laravel_sample

権限変更

webサーバーから書き込みを許可するために、権限を変更する必要があるため、
下記コマンドを storage bootstrap/cache に対して実行します。

cd laravel_sample
chmod 766 storage
chmod 766 bootstrap/cache

nginxのドキュメントルートの設定

このままだと nginx が別のディレクトリを参照しているため、
laradockディレクトリ内の default.conf を修正して、ドキュメントルートを設定します。

vim /var/www/laradock/nginx/sites/default.conf

13行目あたりにある、 root の部分を、
laravel プロジェクトの public ディレクトリに修正します。

 12     server_name localhost;
 13     root /var/www/laravel_sample/public; # この部分を修正。laravel_sampleはプロジェクト名。
 14     index index.php index.html index.htm;

ここまで全て完了したら、dockerコンテナから出ます。

root@192ebe58ccea:/var/www# exit
exit

設定の反映

設定を反映するために、下記コマンドを実行し、コンテナの再起動を行います。
(コンテナIDは laradock_nginx のものを指定します。)

docker  restart 359efff2066b

起動確認

ブラウザから http://localhost にアクセスし、下記画面が表示されることを確認します。
スクリーンショット 2020-01-20 18.31.42.png

これでLaravelが立ち上がりました!簡単!

まとめ

Laradock を使用すると、 Laravel の開発環境、
また必要な各種モジュールを簡単にインストールすることができます。

今回の記事では触れませんでしたが、
ホストの Laravel プロジェクトと Docker 内の Laravel プロジェクトをマウントすることで、
ホスト側を修正すると Laravel プロジェクトに即時反映する環境を作ることができます。
下記ページが参考になるかと。。
【Docker】Dockerでホストのディレクトリをマウントする

Docker 便利なので、どんどん使って慣れていきたいですね!
読んで頂きありがとうございました!

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

Laradockを使ってLaravel環境を構築した

はじめに

今更感満載ですが、 流行りの LaravelLaradock を用いて立ててみました。
Qiitaだけでも漁るといっぱい記事が出てくる内容にはなりますが、ご了承くださいm(_ _)m

Laradockとは?

こちら になります。
dockerでLaravelを動かすために開発されたプロジェクトです。
様々なPHPのバージョン、DB、ミドルウェアをチョイスすることが出来るようです。

前提

下記モジュールがインストールされていること。
それぞれ参考記事を確認いただければ、サクッとインストール可能です。

Laradockのインストール

プロジェクト用ディレクトリ作成

まずは下記コマンドで、プロジェクト用のディレクトリを作成します。

% mkdir ~/workspace/laravel_sample
% cd ~/workspace/laravel_sample

githubからのclone

下記コマンドで、githubから Laradock をダウンロードします。

% git clone https://github.com/Laradock/laradock.git
Cloning into 'laradock'...
remote: Enumerating objects: 10007, done.
remote: Total 10007 (delta 0), reused 0 (delta 0), pack-reused 10007
Receiving objects: 100% (10007/10007), 8.99 MiB | 3.30 MiB/s, done.
Resolving deltas: 100% (5432/5432), done.

.envファイルの修正

クローンした Laradock ディレクトリ内にある、 env-example をコピーして 設定定義用の .env を作成します。

% cd laradock
% cp env-example .env
% ls -l .env
-rw-r--r--  1 member group  27511  1 20 17:35 .env

その後、 .env ファイルに、下記を追加します。

DB_HOST=mysql
REDIS_HOST=redis
QUEUE_HOST=beanstalkd

dockerコンテナの実行

これでコンテナを起動する設定が完了したため、任意のコンテナを実行します。
今回の例では nginx mysql redis を実行しています。
サポートされているミドルウェアについては、 公式ページ をご確認ください。

docker-compose up -d nginx mysql redis workspace

dockerコンテナの起動確認

下記コマンドでコンテナが起動していることを確認します。

% docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS                                      NAMES
359efff2066b        laradock_nginx       "/bin/bash /opt/star…"   2 minutes ago       Up 2 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   laradock_nginx_1
e920c68c0061        laradock_php-fpm     "docker-php-entrypoi…"   2 minutes ago       Up 2 minutes        9000/tcp                                   laradock_php-fpm_1
192ebe58ccea        laradock_workspace   "/sbin/my_init"          2 minutes ago       Up 2 minutes        0.0.0.0:2222->22/tcp                       laradock_workspace_1
84fbc83b3730        docker:dind          "dockerd-entrypoint.…"   2 minutes ago       Up 2 minutes        2375-2376/tcp                              laradock_docker-in-docker_1
28c432f44127        laradock_mysql       "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        0.0.0.0:3306->3306/tcp, 33060/tcp          laradock_mysql_1
1722ae0554b7        laradock_redis       "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes        0.0.0.0:6379->6379/tcp                     laradock_redis_1

このまま http://localhost にアクセスすると、nginxの404ページが表示されると思います。

Laravelプロジェクトの作成

まずは下記コマンドを実行し、 laradock_workspace のイメージから作られたコンテナの中に入ります。

docker exec -it laradock_workspace_1 bash
root@192ebe58ccea:/var/www#

プロジェクト作成

下記コマンドで Laravel プロジェクトを実際に作成します。

composer create-project laravel/laravel laravel_sample

権限変更

webサーバーから書き込みを許可するために、権限を変更する必要があるため、
下記コマンドを storage bootstrap/cache に対して実行します。

cd laravel_sample
chmod 766 storage
chmod 766 bootstrap/cache

nginxのドキュメントルートの設定

このままだと nginx が別のディレクトリを参照しているため、
laradockディレクトリ内の default.conf を修正して、ドキュメントルートを設定します。

vim /var/www/laradock/nginx/sites/default.conf

13行目あたりにある、 root の部分を、
laravel プロジェクトの public ディレクトリに修正します。

 12     server_name localhost;
 13     root /var/www/laravel_sample/public; # この部分を修正。laravel_sampleはプロジェクト名。
 14     index index.php index.html index.htm;

ここまで全て完了したら、dockerコンテナから出ます。

root@192ebe58ccea:/var/www# exit
exit

設定の反映

設定を反映するために、下記コマンドを実行し、コンテナの再起動を行います。
(コンテナIDは laradock_nginx のものを指定します。)

docker  restart 359efff2066b

起動確認

ブラウザから http://localhost にアクセスし、下記画面が表示されることを確認します。
スクリーンショット 2020-01-20 18.31.42.png

これでLaravelが立ち上がりました!簡単!

まとめ

Laradock を使用すると、 Laravel の開発環境、
また必要な各種モジュールを簡単にインストールすることができます。

今回の記事では触れませんでしたが、
ホストの Laravel プロジェクトと Docker 内の Laravel プロジェクトをマウントすることで、
ホスト側を修正すると Laravel プロジェクトに即時反映する環境を作ることができます。
下記ページが参考になるかと。。
【Docker】Dockerでホストのディレクトリをマウントする

Docker 便利なので、どんどん使って慣れていきたいですね!
読んで頂きありがとうございました!

共に働くWebエンジニアを募集しています!

不動産SHOPナカジツでは自社サービスを作っていく仲間を募集しています。
詳しくはWantedlyからお問い合わせください。
お待ちしております!

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

Laravel Excelで数値文字列が指数表示されてしまう

  • PHP 5.6
  • Laravel 5.4
  • Laravel Excel 2.1

Laravel Excelを利用して、Excel形式でファイルを生成~出力した際に
特定環境下のみで出力されたExcelファイルの数値文字列(12桁)が指数表記されてしまう問題に直面した。

セルの書式を確認したところ、「標準」となっており、
またExcelの仕様を調べたところ、12桁以上の数字は指数表記されてしまうとのことだった。

そこで、対象の数値文字列を「文字列」として出力する必要があったため、調べたところ、
以下の記述が必要であるというものを見つけた。

// キーで指定された列の書式を「文字列」へ変更
$sheet->setColumnFormat(["A" => "@"]);

こちらを記述した上で試したところ、確かにセルの書式は「文字列」に変更されているが、
にもかかわらずセルの値は指数表記されたままであった。

さらに調べたところ、Laravel Excelではセルの書式設定を無視して書き込みが行われる設定があるようだった。
row()の第3引数 $explicit がdefaultでfalseに指定されているため、
第3引数にtrueを渡すことで明示的に数値文字列を文字列として出力できるようになった

$sheet->row($targetRow, $values, true);

参考
https://github.com/Maatwebsite/Laravel-Excel/issues/613

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

LaravelでIPアドレスを元にロケール判別する

MaxMindのGeoLite2を使ってIPアドレスからロケール情報を取得するLaravelパッケージを使ってみます。

試すのはこちら。
danielme85/laravel-geoip2

この記事の説明はパッケージのリポジトリのREADMEとほぼ同じ内容ですが、Laravel6での説明が無かったので確認したものです。

以下Laravel6.2で動作確認しています。

概要

以下のような流れです。

  1. パッケージインストール
  2. ライセンスキー取得、設定
  3. configのコピー
  4. GeoIPデータのダウンロード
  5. 動作確認

成功すると以下のようなコードで国コードが取得できます。

use danielme85\Geoip2\Facade\Reader;

$reader = Reader::connect();
$result = $reader->city('xxx.xxx.xxx.xxx'); // グローバルIPを指定
echo $result->country->isoCode; // 「JP」「US」などが出力される

パッケージインストール

composerでインストールします。

> composer require danielme85/laravel-geoip2

GeoLite2のライセンスキー取得

下記サイトからMaxMindのアカウントを作成、ダッシュボードからライセンスキーを取得します。
無料です。
GeoLite2 Free Downloadable Databases « MaxMind Developer Site

画面付きのライセンスキー取得の説明は以下。
LaravelでIPアドレスを元にロケール判別する – mrkmyki@フリーランスブログ

.envにGEOIP2のライセンスキーを設定する

Laravelの.envに取得したライセンスキーを設定します。

.env
GEOIP2_LICENSE=XXXXX

configファイルの配置

laravel-geoip2のconfigを自分のプロジェクトにコピーします。

> php artisan vendor:publish --provider="danielme85\Geoip2\Geoip2ServiceProvider"

GeoIPデータのダウンロード

IPアドレスのデータベースファイルをダウンロードします。
ダウンロードファイルは30MB、解凍後のファイルは60MBほどあります。

> php artisan geoip:download

storage/app/geoip2/GeoLite2-City.mmdbにファイルがダウンロードされます。

実際に運用する際には定期的にどこかでダウンロードしておいてWebサーバに配置する感じでしょうか。

動作確認

以上で動くようになりました。

use danielme85\Geoip2\Facade\Reader;

$reader = Reader::connect();
$result = $reader->city('xxx.xxx.xxx.xxx'); // グローバルIPを指定
echo $result->country->isoCode; // 「JP」「US」などが出力される

国コードの他に、都道府県、市区町村、郵便番号などが取得できます。
精度は完璧ではありませんが、市区町村まではほぼ合ってそうです。

アクセス制限やマーケティングデータの収集、ロケールごとの言語やページの切り替えに使えると思います。

以上です。


他、ロケール判別について調べた事を少し書いています。
LaravelでIPアドレスを元にロケール判別する

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

自分メモ:バリデーションを行うのはサーバー側?クライアント側?両方??

結論:サーバー側、クライアント側の両方行います。

(twitter引用:https://twitter.com/saya1001kirinn/status/1191950370328715264)

例えばLaravelで最小値0を指定するバリデーションの場合、Controllerのバリデーションにmin:0って書くのか、viewでinputタグ内にmin="0"を書くのか。

例:サーバー側対応

Controller.php
$request->validate([
    'total' => ['required', 'min:0'],
]);

例:クライアント側対応

create.blade.php
<input type="number" min="1" value="{{ old('total') }}">

サーバー側はデータの整合性を担保するため、クライアント側はUXを向上するためと考えます。
サーバー側の対応は必須です。

時間がない場合はサーバー側のみの対応でもいいかと思いますが、
可能であれば両方対応が良さそうです。
クライアント側はHTMLバリデーションまたはjsでバリデーションを行います。

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

【作業効率アップ】Visual Studio CodeでLaravel開発する時にワークスペースを少し見やすくする設定

Laravelに限りませんが、VisualStudioCodeなどを使って開発する時に普段触らないファイルやディレクトリが沢山表示されてワークスペースが見にくくなります。

このように。
image.png

これを解消するための設定例を書きます。

課題

普段触るのはapp,config,resources,routes,tests,.envあたりでしょうか。

それ以外はファイルを探す時の邪魔になるのでワークスペースに表示しないようにします。

settingsファイルを配置

ワークスペースの直下に.vscode/settings.jsonというファイルを作ります。
image.png

非表示にするファイルを指定

.vscode/settings.jsonに以下のように記述します。

.vscode/settings.json
{
    "files.exclude": {
        "**/.git": true,
        "**/.vscode": false,
        "**/bootstrap": true,
        "**/database": true,
        "**/public": true,
        "**/storage": true,
        "**/vendor": true,
        "**/xdebug_log": true,
        "**/.env.example": true,
        "**/.editorconfig": true,
        "**/.gitattributes": true,
        "**/.gitignore": true,
        "**/.styleci.yml": true,
        "**/artisan": true,
        "**/composer.json": true,
        "**/composer.lock": true,
        "**/package-lock.json": true,
        "**/package.json": true,
        "**/phpunit.xml": true,
        "**/README.md": true,
        "**/server.php": true,
        "**/webpack.mix.js": true
    }
}

ファイルを保存すると設定がすぐに反映されます。

結果

スッキリしました。
image.png

これでファイルが探しやすくなった。

設定はお好みで変えましょう。

以上です。


「VS CODE」カテゴリーアーカイブ – mrkmyki@フリーランスブログ

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