- 投稿日:2020-01-20T23:54:27+09:00
Laravel で バリデーションルールに Twitter のTweetのルールを使う
やりたいこと
Twitter連携アプリを作成しており、入力をフロントで
twitter-text.js
を使ってバリデーションしましたが、サーバー側でも行いたい。公式からはPHP向けのが公開されていませんが、PHP向けのを公開していただけている方がいるので、ありがたく使わせていただきます。
メンテンナンス頻度も高いです。インストール
composer require nojimage/twitter-text-phpLaravelで独自ルール作成
php artisan make:rule TwitterTextRuleTwitterTextRule<?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できません。'; } }あとはバリデーションルールに指定する
- 投稿日:2020-01-20T20:54:40+09:00
Docker MySQLのバージョン変更する方法
はじめに
Docker MySQLのバージョンを 8.0 から 5.7 に下げる際に苦戦したので、一連の流れをまとめました。
Laradockを用いてDocker上でLaravelを動かす環境を作成しました。
MySQLバージョンを変更する一連の流れ
laradockにあるファイルのMySQLのバージョンを 5.7 に変更します。
.env### MYSQL ################################################# MYSQL_VERSION=5.7コンテナを停止し、status が exited になっているのを確認。
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最後に status が up になっているか。
なっていれば mysql のバージョンを確認し 5.7系になっていればOK。$ docker ps -a $ docker-composer exec mysql mysql --version以上で、動くはずです。
Dockerを勉強し始めたばかりで、説明が大雑把なので
わかりにくい箇所や、疑問点など。
また、勉強する上で参考になったサイトや技術書など教えていただけると幸いです。
- 投稿日:2020-01-20T19:46:35+09:00
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にインストールし、地道に開発環境を仮想マシン上に手作業で構築する方法で落ち着きました。
- 投稿日:2020-01-20T18:37:29+09:00
Laradockを使ってLaravel環境を試した
はじめに
今更にはなりますが、 流行りの
Laravel
をLaradock
を用いて立ててみました。
Qiitaだけでも漁るといっぱい記事が出てくる内容にはなりますが、ご了承くださいm(_ _)mLaradockとは?
こちら になります。
dockerでLaravelを動かすために開発されたプロジェクトです。
様々なPHPのバージョン、DB、ミドルウェアをチョイスすることが出来るようです。前提
下記モジュールがインストールされていること。
それぞれ参考記事を確認いただければ、サクッとインストール可能です。
- Docker
参考記事: DockerをMacにインストールする- git
参考記事: 購入直後のMacでGitコマンドを使えるようになるまでLaradockのインストール
プロジェクト用ディレクトリ作成
まずは下記コマンドで、プロジェクト用のディレクトリを作成します。
% mkdir ~/workspace/laravel_sample % cd ~/workspace/laravel_samplegithubからの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=beanstalkddockerコンテナの実行
これでコンテナを起動する設定が完了したため、任意のコンテナを実行します。
今回の例では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/cachenginxのドキュメントルートの設定
このままだと
nginx
が別のディレクトリを参照しているため、
laradockディレクトリ内のdefault.conf
を修正して、ドキュメントルートを設定します。vim /var/www/laradock/nginx/sites/default.conf13行目あたりにある、
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
にアクセスし、下記画面が表示されることを確認します。
これでLaravelが立ち上がりました!簡単!
まとめ
Laradock
を使用すると、Laravel
の開発環境、
また必要な各種モジュールを簡単にインストールすることができます。今回の記事では触れませんでしたが、
ホストのLaravel
プロジェクトとDocker
内のLaravel
プロジェクトをマウントすることで、
ホスト側を修正するとLaravel
プロジェクトに即時反映する環境を作ることができます。
下記ページが参考になるかと。。
【Docker】Dockerでホストのディレクトリをマウントする
Docker
便利なので、どんどん使って慣れていきたいですね!
読んで頂きありがとうございました!
- 投稿日:2020-01-20T18:37:29+09:00
Laradockを使ってLaravel環境を構築した
はじめに
今更感満載ですが、 流行りの
Laravel
をLaradock
を用いて立ててみました。
Qiitaだけでも漁るといっぱい記事が出てくる内容にはなりますが、ご了承くださいm(_ _)mLaradockとは?
こちら になります。
dockerでLaravelを動かすために開発されたプロジェクトです。
様々なPHPのバージョン、DB、ミドルウェアをチョイスすることが出来るようです。前提
下記モジュールがインストールされていること。
それぞれ参考記事を確認いただければ、サクッとインストール可能です。
- Docker
参考記事: DockerをMacにインストールする- git
参考記事: 購入直後のMacでGitコマンドを使えるようになるまでLaradockのインストール
プロジェクト用ディレクトリ作成
まずは下記コマンドで、プロジェクト用のディレクトリを作成します。
% mkdir ~/workspace/laravel_sample % cd ~/workspace/laravel_samplegithubからの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=beanstalkddockerコンテナの実行
これでコンテナを起動する設定が完了したため、任意のコンテナを実行します。
今回の例では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/cachenginxのドキュメントルートの設定
このままだと
nginx
が別のディレクトリを参照しているため、
laradockディレクトリ内のdefault.conf
を修正して、ドキュメントルートを設定します。vim /var/www/laradock/nginx/sites/default.conf13行目あたりにある、
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
にアクセスし、下記画面が表示されることを確認します。
これでLaravelが立ち上がりました!簡単!
まとめ
Laradock
を使用すると、Laravel
の開発環境、
また必要な各種モジュールを簡単にインストールすることができます。今回の記事では触れませんでしたが、
ホストのLaravel
プロジェクトとDocker
内のLaravel
プロジェクトをマウントすることで、
ホスト側を修正するとLaravel
プロジェクトに即時反映する環境を作ることができます。
下記ページが参考になるかと。。
【Docker】Dockerでホストのディレクトリをマウントする
Docker
便利なので、どんどん使って慣れていきたいですね!
読んで頂きありがとうございました!共に働くWebエンジニアを募集しています!
不動産SHOPナカジツでは自社サービスを作っていく仲間を募集しています。
詳しくはWantedlyからお問い合わせください。
お待ちしております!
- 投稿日:2020-01-20T18:21:39+09:00
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);
- 投稿日:2020-01-20T16:50:58+09:00
LaravelでIPアドレスを元にロケール判別する
MaxMindのGeoLite2を使ってIPアドレスからロケール情報を取得するLaravelパッケージを使ってみます。
試すのはこちら。
danielme85/laravel-geoip2この記事の説明はパッケージのリポジトリのREADMEとほぼ同じ内容ですが、Laravel6での説明が無かったので確認したものです。
以下Laravel6.2で動作確認しています。
概要
以下のような流れです。
- パッケージインストール
- ライセンスキー取得、設定
- configのコピー
- GeoIPデータのダウンロード
- 動作確認
成功すると以下のようなコードで国コードが取得できます。
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-geoip2GeoLite2のライセンスキー取得
下記サイトからMaxMindのアカウントを作成、ダッシュボードからライセンスキーを取得します。
無料です。
GeoLite2 Free Downloadable Databases « MaxMind Developer Site画面付きのライセンスキー取得の説明は以下。
LaravelでIPアドレスを元にロケール判別する – mrkmyki@フリーランスブログ.envにGEOIP2のライセンスキーを設定する
Laravelの.envに取得したライセンスキーを設定します。
.envGEOIP2_LICENSE=XXXXXconfigファイルの配置
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アドレスを元にロケール判別する
- 投稿日:2020-01-20T13:56:09+09:00
自分メモ:バリデーションを行うのはサーバー側?クライアント側?両方??
結論:サーバー側、クライアント側の両方行います。
(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でバリデーションを行います。
- 投稿日:2020-01-20T10:09:23+09:00
【作業効率アップ】Visual Studio CodeでLaravel開発する時にワークスペースを少し見やすくする設定
Laravelに限りませんが、VisualStudioCodeなどを使って開発する時に普段触らないファイルやディレクトリが沢山表示されてワークスペースが見にくくなります。
これを解消するための設定例を書きます。
課題
普段触るのは
app
,config
,resources
,routes
,tests
,.env
あたりでしょうか。それ以外はファイルを探す時の邪魔になるのでワークスペースに表示しないようにします。
settingsファイルを配置
ワークスペースの直下に
.vscode/settings.json
というファイルを作ります。
非表示にするファイルを指定
.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 } }ファイルを保存すると設定がすぐに反映されます。
結果
これでファイルが探しやすくなった。
設定はお好みで変えましょう。
以上です。