- 投稿日:2020-07-02T18:07:45+09:00
DockerでLaravelの開発環境を構築する方法
本記事ではLaradockを使わずにできるだけシンプルにLaravelの環境構築を行っていきます。
任意の場所にディレクトリを作成
$ mkdir myproject $ cd myprojectdocker-compose.ymlファイルの作成
docker-compose.ymlversion: '3.7' services: php: build: context: . dockerfile: Dockerfile container_name: php volumes: - ./src:/var/www/html ports: - "9000:9000" mysql: image: mysql:5.7 container_name: mysql ports: - "3306:3306" volumes: - ./db:/var/lib/mysql - ./my_conf:/etc/mysql/conf.d environment: MYSQL_ROOT_PASSWORD: password MYSQL_DATABASE: laravel nginx: image: nginx:stable-alpine container_name: nginx ports: - "8080:80" volumes: - ./src:/var/www/html - ./nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - php - mysqlDockerfileの作成
DockerfileFROM php:7.4-fpm-alpine RUN docker-php-ext-install pdo pdo_mysqlVolumesの作成
$ mkdir db $ mkdir my_confmy_confディレクトリにmysql5.7.cnfを作成し、日本語対応できるように文字コードの設定を行います。
mysql5.7.cnf[mysqld] character-set-server=utf8mb4 [client] default-character-set=utf8mb4Nginxの設定ファイルを作成
$ mkdir nginxnginxディレクトリにdefault.confを作成します。
default.confserver { listen 80; index index.php index.html; server_name localhost; error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; root /var/www/html/public; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { try_files $uri = 404; 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; } }コンテナの作成
$ docker-compose up -dコンテナのステータスを確認
$ docker-compose ps -aLaravelのインストール
$ docker run --rm -v /src:/app composer create-project --prefer-dist laravel/laravel .データベースへの接続
srcディレクトリ内にある.envファイルを下記の通り編集してください。
.envDB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD=password.envファイルの設定が終わったら、下記のコマンドを実行してデータベースにテーブルが作成されるか確認します。
$ docker-compose exec php php artisan migrate開発サーバの起動
$ docker exec -it php php artisan serve --host=0.0.0.0 --port=8000上記のコマンドを実行後、ブラウザで127.0.0.1:8080にアクセスするとLaravelのスタートページが表示されます。
これでLaravelにNginx経由でアクセスし、MySQLデータベースへのデータの登録まで行えることを確認しました。
- 投稿日:2020-07-02T16:46:23+09:00
Cloud9でLaravelの開発環境を構築する方法
AWSマネジメントコンソールからCloud9を選択
Create environmentを選択
プロジェクト名を入力し、Next stepを選択
ここではlaravel_projectとします。
特にこだわりがなければデフォルトのままNext stepを選択
設定に変更がなければCreate environmentを選択
すると画面が切り替わってCloud9が起動しますので、操作できるようになるまでしばらく待ちます。
PHPをアップデート
$ sudo yum -y update $ sudo yum -y install http://rpms.famillecollet.com/enterprise/remi-release-6.rpm $ sudo yum -y install php73 php73-mbstring php73-pdo php73-mysqlnd // PHP7.3をインストール $ sudo unlink /usr/bin/php // リンクがPHP5.6に貼られているので解除 $ sudo ln -s /etc/alternatives/php7 /usr/bin/php // リンクをPHP7.3に張り替え $ php -vバージョンを確認して下記のように表示されればリンク設定まで完了です。
PHP 7.3.17 (cli) (built: May 7 2020 21:04:09) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.17, Copyright (c) 1998-2018 Zend TechnologiesComposerをインストール
ComposerはPHPのライブラリ管理ツールです。RubyでいうところのGemに該当します。
$ curl -sS https://getcomposer.org/installer | php // composer.pharが自動で生成される $ sudo mv composer.phar /usr/local/bin/composer // composer.pharを移動させるComposerが正常にインストールされたか、下記のコマンドにて確認します。
$ composer「Composer」という文字の、大きなアスキーアートが表示されれば完了です。
スワップファイルを作成
現時点でLaravelプロジェクトを作成しようとすると、メモリ不足で失敗します。そこでスワップファイルを作成します。
$ sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024 $ sudo /sbin/mkswap /var/swap.1 $ sudo /sbin/swapon /var/swap.1Laravelプロジェクトを作成
$ composer create-project laravel/laravel ./myapp --prefer-distディレクトリ内にmyappが作成されます。
Laravelサーバの起動
$ cd myapp $ php artisan serve --port=8080上記のコマンドを実行後、次のように表示されれば起動は完了です。
$ Laravel development server started: http://127.0.0.1:8080Cloud9画面上のメニューのPreviewを押し、「Preview Running Application」を実行すると下の画面のように表示されます。
無事Cloud9にLaravelを導入することができました。
- 投稿日:2020-07-02T15:33:59+09:00
LaravelアプリをHerokuにデプロイする方法
HerokuやGitがない方は事前にインストールしておいてください。
Laravelプロジェクトの作成
$ laravel new myappHerokuにローカルからログイン
$ heroku loginHerokuにリポジトリを作成
$ heroku create リポジトリ名 --buildpack heroku/phpLaravelアプリのソースコードをHerokuにプッシュ
$ git init $ heroku git:remote -a リポジトリ名 $ git add . $ git commit -m "initial commit" $ git push heroku masterLaravelプロジェクト直下にProcfileを作成
$ touch Procfile $ echo 'web: vendor/bin/heroku-php-apache2 public' >> ProcfileProcfileをHerokuにプッシュ
$ git add . $ git commit -m "add Procfile" $ git push heroku masterHerokuにPostgreSQLを導入
$ heroku addons:create heroku-postgresql:hobby-devデータベース接続に必要な情報を確認
$ heroku config:get DATABASE_URL // コマンドを実行すると下記のように表示されます postgres://ユーザー名:パスワード@ホスト名:5432/データベース名Herokuに設定を追加
$ heroku config:set\ DB_CONNECTION=pgsql\ DB_USERNAME=ユーザー名\ DB_PASSWORD=パスワード\ DB_HOST=ホスト\ DB_DATABASE=データベース名\マイグレーションの実行
$ heroku run php artisan migrateインターネット上で閲覧できるように設定を追加
$ heroku config:set DEBUGBAR_ENABLED=true $ heroku config:set APP_KEY=$(php artisan key:generate --show)ブラウザで確認
$ heroku openブラウザで何の問題もなく表示されればデプロイ成功です。
- 投稿日:2020-07-02T12:40:40+09:00
【Laravel】自作ヘルパー
ヘルパーを自作する
ページのタイトル名を返すヘルパーを例にヘルパーの作り方を説明してみる
手順は以下のとおり1. helpers.phpを作成
2. composer.jsonへの追加
3. composer dump-autoload コマンドの実行手順1
appフォルダ以下にhelper.phpを作って、作りたいヘルパーを定義
app/helper.php<?php function full_title($title=null) { $app_name = config('app.name', 'Laravel'); if ($title != null) { return $title . ' - ' . $app_name ; } return $app_name; } ?>手順2
composer.jsonのautoloadの項目にヘルパーを定義したファイルのパスを追加
composer.json"autoload": { ...(省略)... "files": [ "app/helpers.php" ] }手順3
composer.jsonにパスを追加しただけでは機能しない
以下のコマンドを実行% composer dump-autoload使用例
<title>full_title('Home')</title>上の例では「Home - Laravel」といったタイトルになる
おわり
簡単でしたね
Laravel側で用意しているヘルパーがたくさんあるので、Readoubleを一読してみてはどうかな?
- 投稿日:2020-07-02T09:30:06+09:00
Vue.js・Laravel・OpenBDで本の画像を表示!書籍管理アプリで表紙の画像が表示できるようになりました。 #BookMark
どうも、たかふみです。
Vue.jsを使って本の画像表示をやってみました。
結果、これがこうなりまして、本の詳細画面に遷移した時に書籍画像が表示されるようになっています。Vue.js・Laravelでの画像表示については⬇︎こちらのチュートリアルのお陰でできました!
段階的に書かれていて分かりやすかったです!■Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう
https://www.hypertextcandy.com/vue-laravel-tutorial-introduction/画面
コード
■blade(該当部分のみ)
show.blade.php<div class="card-header">詳細</div> <book-image-component></book-image-component>■VueComponent
BookImageComponent.vue<template> <div v-if="photoUrl" class="photo-detail bookimage"> <figure class="photo-detail__pane photo-detail__image"> <img :src="photoUrl" alt=""> </figure> </div> </template> <script> export default { data () { return { photoUrl: null } }, methods: { // URLから特定のパラメータを取得 getParam(name, url) { if (!url) url = window.location.href; name = name.replace(/[\[\]]/g, "\\$&"); var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"), results = regex.exec(url); if (!results) return null; if (!results[2]) return ''; return decodeURIComponent(results[2].replace(/\+/g, " ")); }, // isbnコードから画像URLを取得 async fetchPhoto () { const isbn =this.getParam('isbn'); const response = await axios.get('https://api.openbd.jp/v1/get?isbn='+isbn) if(response.data[0] == null){ this.photoUrl = null } else { this.photoUrl = response.data[0].summary.cover; } } }, watch: { $route: { async handler () { await this.fetchPhoto() }, immediate: true } } } </script>コード説明
詳細画面
手順
1.どうやって画像表示するか考える
2.書籍の画像を表示するためのVueコンポーネントを作る
3.確認1.どうやって画像表示するか考える
今回、画像表示をするためにOpenBDという書籍情報取得APIを使いました。
このAPIではISBNコード(書籍のIDみたいなもの)をリクエストに書籍情報を取得することができます。レスポンス内に画像URLがあるので、これを使って画面に書籍画像を表示します。
※OpenBDについては後ほど記載します。ISBNコードはURL内のパラメータを取得してリクエストすることにしました。
2.書籍の画像を表示するためのVueコンポーネントを作る
書籍画像以外の情報についてはLaravelの方で実装を行っていたので、画像の部分だけコンポーネント化しています。
BookImageComponent.vue<template> <div v-if="photoUrl" class="photo-detail bookimage"> <figure class="photo-detail__pane photo-detail__image"> <img :src="photoUrl" alt=""> </figure> </div> </template> <script> export default { data () { return { photoUrl: null } }, methods: { // URLから特定のパラメータを取得 getParam(name, url) { if (!url) url = window.location.href; name = name.replace(/[\[\]]/g, "\\$&"); var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"), results = regex.exec(url); if (!results) return null; if (!results[2]) return ''; return decodeURIComponent(results[2].replace(/\+/g, " ")); }, // isbnコードから画像URLを取得 async fetchPhoto () { const isbn =this.getParam('isbn'); const response = await axios.get('https://api.openbd.jp/v1/get?isbn='+isbn) if(response.data[0] == null){ this.photoUrl = null } else { this.photoUrl = response.data[0].summary.cover; } } }, watch: { $route: { async handler () { await this.fetchPhoto() }, immediate: true } } } </script>■URLから特定のパラメータを取得
URLからISBNコードを取得する必要があったので、下記のサイトで紹介されていたメソッドを使いました。
■Javascript でURLのパラメータを取得する方法
http://www-creators.com/archives/4463URLから特定のパラメータを取得getParam(name, url) { if (!url) url = window.location.href; name = name.replace(/[\[\]]/g, "\\$&"); var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"), results = regex.exec(url); if (!results) return null; if (!results[2]) return ''; return decodeURIComponent(results[2].replace(/\+/g, " ")); }■isbnコードから画像URLを取得
上のメソッドを使い、ISBNコードを変数isbnへ入れてから、openBDのAPIへリクエストを行います。
response.data[0].summary.cover
で画像urlがレスポンスされるのでthis.photUrl
へ入れます。openBDへリクエストasync fetchPhoto () { const isbn =this.getParam('isbn'); const response = await axios.get('https://api.openbd.jp/v1/get?isbn='+isbn) if(response.data[0] == null){ this.photoUrl = null } else { this.photoUrl = response.data[0].summary.cover; } }■photUrlをvindして画像を表示
上のメソッドで画像urlがphotUrlへ入るので、画面上に書籍画像が表示されます。
photUrlをvindして画像を表示<figure class="photo-detail__pane photo-detail__image"> <img :src="photoUrl" alt=""> </figure>3.確認
表示されていれば成功です。
OpenBDとは
書籍情報の取得ができるAPIです。
書籍APIにはAmazonや楽天のAPIもあるのですが、「会員登録が不要・レスポンスが高速・レスポンスに画像URLを含んでいる」ことからOpenBDに決めました。■openBD
https://openbd.jp/まとめ:チュートリアルの復習にもなって良かった。
画像が表示できたことで見たい本が探しやすくなりました。
今回の実装でこちらのサイトを参考にしました。チュートリアルの復習にもなったので良かったです。本記事の書籍管理アプリ「BookMark」は引き続き開発中です!
⬇︎こちらから実際の画面を確認できます。
https://bookmark-tm.herokuapp.com/それでは!
参考URL
■Laravel + Vue での画像表示について
・Vue + Vue Router + Vuex + Laravelで写真共有アプリを作ろう
https://www.hypertextcandy.com/vue-laravel-tutorial-introduction/■書籍APIについて
・書籍検索APIのリクエストパラメータ・取得値考察
https://qiita.com/kanary/items/5ec45bbc01efd4388fdb・国立国会図書館サーチが提供する書影API
https://iss.ndl.go.jp/information/api/api-lists/thumbnail_info/
- 投稿日:2020-07-02T09:07:47+09:00
Laravel Log singleログとdailyログを同時に出力する
目的
- Laravelのログ出力にて二種のログを同時出力する方法をまとめる
実施環境
- MacのローカルにLaravelの環境を構築して実施する。環境構築手順の記事はリンクを後述する。
- ハードウェア環境
項目 情報 OS macOS Catalina(10.15.5) ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) プロセッサ 2 GHz クアッドコアIntel Core i5 メモリ 32 GB 3733 MHz LPDDR4 グラフィックス Intel Iris Plus Graphics 1536 MB
- ソフトウェア環境
項目 情報 備考 PHP バージョン 7.4.3 Homwbrewを用いて導入 Laravel バージョン 7.0.8 commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする 前提条件
- 下記、または下記に準ずる方法でLaravelの環境構築がされていること。
前提情報
- ログの出力に関して若干の知識がある物として説明を行う。おそらく一旦ログの出力を経験した方が理解が早いかもしれない。下記にログ出力方法の最短方法を記載した記事のリンクを記載する。
- 今回説明する方法を応用すればdailyログとerrorログを別ファイルに出力することも可能になる考える。
- 説明の便宜上、アプリ作成部分から記載するが各の環境に沿って読み飛ばしていただきたい。
読後感
- singleログを
アプリ名ディレクトリ/storage/logs/
直下のsingle.logsファイルに、dailyログをアプリ名ディレクトリ/storage/logs/
直下のdaily-YYYY-MM-DD.logファイルに[YYYY-MM-DD HH:MM:SS] local.DEBUG: test
と言う文字列を出力することができる。singleログとdailyログ
※singleログとdailyログはログチャンネル(ログを行う設定の種類)の名前である。
- singleログ
- Laravelアプリのログを
アプリ名ディレクトリ/storage/logs/
直下のlaravel.logファイルに出力するログのチャンネルのこと。(一個のログファイルのみにログを出力する方法と思っていただきたい。)- デフォルトではこのチャンネルが有効になっている。
- dailyログ
- Laravelアプリのログを
アプリ名ディレクトリ/storage/logs/
直下のlaravel-YYYY-MM-DD.logに日毎に分けて出力するログのチャンネルのこと。(singleログを日毎に分けた物と思っていただきたい。)- デフォルト設定では14日経過したdailyログは削除される。
概要
- アプリ作成
- ルーティングの記載
- UserHomeController作成と記載
- singleログ出力確認
- ログの設定変更
- 確認
詳細
アプリ作成
アプリを作成する任意のディレクトリに移動して下記コマンドを実行して「test」と言う名前のアプリを作成する。
$ laravel new testルーティングの記載
testディレクトリで下記コマンドを実行してルーティングファイルを開く。
$ routes/web.php開いたルーティングファイルに下記の一行を記載する。
routes/web.phpRoute::get('/user_home', 'UserHomeController@index');記載後のルーティングファイルの内容を下記に記載する。
routes/web.php<?php use Illuminate\Support\Facades\Route; /* |-------------------------------------------------------------------------- | Web Routes |-------------------------------------------------------------------------- | | Here is where you can register web routes for your application. These | routes are loaded by the RouteServiceProvider within a group which | contains the "web" middleware group. Now create something great! | */ Route::get('/', function () { return view('welcome'); }); Route::get('/user_home', 'UserHomeController@index');保存して閉じる。
UserHomeController作成と記載
testディレクトリで下記コマンドを実行してUserHomeController.phpを作成する。
$ php artisan make:controller UserHomeController下記コマンドを実行して先のコマンドで作成したUserHomeController.phpを開く。
$ vi app/Http/Controllers/UserHomeController.php開いたUserHomeController.phpを下記の様に修正する。
test/app/Http/Controllers/UserHomeController.php<?php namespace App\Http\Controllers; use Illuminate\Http\Request; //下記を追記する、下記の宣言がないとエラーになる use Illuminate\Support\Facades\Log; class UserHomeController extends Controller { //下記を追記する public function index() { //Log::debug('ログとして出力したい文字列')の様に記載する Log::debug('test'); return redirect('/'); } //上記までを追記する。 }保存して閉じる。
singleログ出力確認
testディレクトリで下記コマンドを実行してまだlogファイルが存在していないことを確認する。「No such file or directory」が出力されればsingle.logファイルとdaily.logは存在しない。
$ ls storage/logs/laravel.log >ls: storage/logs/laravel.log: No such file or directorytestディレクトリで下記コマンドを実行してローカルサーバを起動する。
$ php artisan serveブラウザからtestアプリにアクセスする。デフォルトだとhttp://127.0.0.1:8000/にアクセスするとブラウザでtestアプリが表示できる。
下記画面が表示されていることを確認する。
http://127.0.0.1:8000/user_homeにアクセスしてみる。(アクセスしても何も起こらず、先の画像と同じLaravelのトップページが表示されると思うがその動作は期待する動作である。)
testディレクトリで下記コマンドを実行してログファイルを開く。
$ less storage/logs/laravel.log下記の一行が記載されていることを確認する。(YYYY-MM-DD HH:MM:SSはみなさんがhttp://127.0.0.1:8000/user_homeにアクセスした時間が入る。)
test/storage/logs/laravel.log[YYYY-MM-DD HH:MM:SS] local.DEBUG: testログの設定変更
testディレクトリで下記コマンドを実行してログの設定ファイルを開く。
$ vi config/logging.php開いた設定ファイルを下記の様に修正する。
test/config/logging.php<?php use Monolog\Handler\NullHandler; use Monolog\Handler\StreamHandler; use Monolog\Handler\SyslogUdpHandler; return [ /* |-------------------------------------------------------------------------- | Default Log Channel |-------------------------------------------------------------------------- | | This option defines the default log channel that gets used when writing | messages to the logs. The name specified in this option should match | one of the channels defined in the "channels" configuration array. | */ 'default' => env('LOG_CHANNEL', 'stack'), /* |-------------------------------------------------------------------------- | Log Channels |-------------------------------------------------------------------------- | | Here you may configure the log channels for your application. Out of | the box, Laravel uses the Monolog PHP logging library. This gives | you a variety of powerful log handlers / formatters to utilize. | | Available Drivers: "single", "daily", "slack", "syslog", | "errorlog", "monolog", | "custom", "stack" | */ 'channels' => [ 'stack' => [ 'driver' => 'stack', //下記修正・追記する 'channels' => [ 'single', 'daily', ], 'ignore_exceptions' => false, ], 'single' => [ 'driver' => 'single', //下記を修正する 'path' => storage_path('logs/single.log'), 'level' => 'debug', ], 'daily' => [ 'driver' => 'daily', //下記を修正する 'path' => storage_path('logs/daily.log'), 'level' => 'debug', 'days' => 14, ], 'slack' => [ 'driver' => 'slack', 'url' => env('LOG_SLACK_WEBHOOK_URL'), 'username' => 'Laravel Log', 'emoji' => ':boom:', 'level' => 'critical', ], 'papertrail' => [ 'driver' => 'monolog', 'level' => 'debug', 'handler' => SyslogUdpHandler::class, 'handler_with' => [ 'host' => env('PAPERTRAIL_URL'), 'port' => env('PAPERTRAIL_PORT'), ], ], 'stderr' => [ 'driver' => 'monolog', 'handler' => StreamHandler::class, 'formatter' => env('LOG_STDERR_FORMATTER'), 'with' => [ 'stream' => 'php://stderr', ], ], 'syslog' => [ 'driver' => 'syslog', 'level' => 'debug', ], 'errorlog' => [ 'driver' => 'errorlog', 'level' => 'debug', ], 'null' => [ 'driver' => 'monolog', 'handler' => NullHandler::class, ], 'emergency' => [ 'path' => storage_path('logs/laravel.log'), ], ], ];確認
testディレクトリで下記コマンドを実行してまだlogファイルが存在していないことを確認する。「No such file or directory」が出力されればsingle.logファイルとdaily.logは存在しない。
$ ls storage/logs/single.log >ls: storage/logs/single.log: No such file or directory $ ls storage/logs/daily* >ls: storage/logs/daily*: No such file or directorytestディレクトリで下記コマンドを実行してローカルサーバを起動する。
$ php artisan serveブラウザからtestアプリにアクセスする。デフォルトだとhttp://127.0.0.1:8000/にアクセスするとブラウザでtestアプリが表示できる。
下記画面が表示されていることを確認する。
http://127.0.0.1:8000/user_homeにアクセスしてみる。(アクセスしても何も起こらず、先の画像と同じLaravelのトップページが表示されると思うがその動作は期待する動作である。)
testディレクトリで下記コマンドを実行してログファイルを開く。
$ less storage/logs/single.log二つのファイルに下記の一行が記載されていることを確認する。(YYYY-MM-DD HH:MM:SSはみなさんがhttp://127.0.0.1:8000/user_homeにアクセスした時間が入る。)
test/storage/logs/laravel.log[YYYY-MM-DD HH:MM:SS] local.DEBUG: test正常に書き込まれていた場合作業完了となる。
- 投稿日:2020-07-02T01:22:38+09:00
【Laravel】配列のバリデーション
フォームのフィールドが配列の場合のバリデーションについてのメモです。
ドット記法
配列に対してバリデーションを行うためにはドット記法を使い、
.
で配列の階層を表します。また*
で配列内すべてを表します。//photos[profile]フィールドを指定 $validator = Validator::make($request->all(), [ 'photos.profile' => 'required|image', ]); //keywordフィールドすべてを指定 $validator = Validator::make($request->all(), [ 'keyword.*' => 'required|max:20', ]);エラーメッセージの取得
Illuminate\Support\ViewErrorBag { #bags: array:1 [ "default" => Illuminate\Support\MessageBag { #messages: array:2 [ "keyword.0" => array:1 [ 0 => "キーワードは、20文字以下で指定してください。" ] "keyword.1" => array:1 [ 0 => "キーワードは、20文字以下で指定してください。" ] "keyword.2" => array:1 [ 0 => "キーワードは、20文字以下で指定してください。" ] ] #format: ":message" } ] }配列にバリデーションを設定した場合、エラーメッセージも配列で返ってくるため、取得もドット記法で行います。
foreach ($errors->get('keyword.*') as $messages) { foreach ($messages as $message){ // } }