- 投稿日:2020-03-16T23:35:01+09:00
php artisan ui vue --authコマンドの恐怖
とある日僕はlaravelを使って作った自作アプリに、ログイン機能をつけようと思いついた。
よしよし、公式ドキュメントによると、このコード一発でログイン機能ができるらしい。。
チャカチャカ、ぽん!
php artisan ui vue --authブイーーん、種ドドドドー
laravelは唸りをあげ、ログイン機能、ユーザー登録機能を一瞬で作り上げ、同時に、resoureces/以下に書いていた僕のコードも見事に書き換えてしまった。
何してくれんだ、馬鹿野郎!laravelは言った、私は規則に従ったまでです。
何、規則だと!と、手渡されたドキュメントをよく読むと、(小さく)「このコマンドは新しくインストールしたアプリケーションでのみ実行すべきで、・・・」と書いてある。
いや、もっと早く言えよ。
僕は、laravelランドに暮れる夕日を眺めながら、吐息をついたのだった。
- 投稿日:2020-03-16T20:47:03+09:00
Laravelのbladeで分岐する場合
概要
@if
@elseif
@else
@endif
ディレクティブが使用できます。
ifの他に三項演算子も使用できます。使用例
@php $name = "太郎"; @endphp <p> @if ($name) {{ $name."さん" }} @else {{ "未設定" }} @endif </p>太郎さんが表示
@php $name = "太郎"; @endphp <p> {{ $name ? $name."さん" : "none" }} </p>太郎さんが表示
@php $name = null; @endphp <p> {{ $name ?? 'none' }} </p>noneが表示
@php $name = ""; @endphp <p> {{ $name ?: 'none' }} </p>noneが表示
nullの場合はUndefined variable
- 投稿日:2020-03-16T19:18:51+09:00
Laravel6.xの日本語化パッケージ
目的
Laravel6.xの日本語化を行い、その言語リソースをパッケージ化してみる。
日本語化について
設定
config/app.php
'locale' => 'en',英語→日本語
デフォルトでは次の4種類が用意されている。
- 認証(auth.php)
- ページネーション(pagination.php)
- パスワードリセット(passwords.php)
- バリデーション(validation.php)
resources/lang/en以下に対応するphpファイルがあるので、それを翻訳してresources/lang/ja以下へ置く。
パッケージ化について
毎回翻訳するのは大変なのでパッケージ化してみる。
ServiceProviderで作成した日本語化ファイルを公開できるようにする。
public function boot() { $this->publishes([ __DIR__.'/../resources/lang' => $this->app->resourcePath('lang/'), ], 'lang-ja'); }vendor:publishコマンドで公開できるようになる。
$ php artisan vendor:publish --tag=lang-ja作成した日本語化パッケージ
ほぼGoogle翻訳なので使いつつ調整していく予定。
- 投稿日:2020-03-16T15:21:11+09:00
Laradockをやる時にコンテナがdocker-composeでもなかなか立ち上がってくれなかった話
Laradockを使っての環境構築にチャレンジしてみました。
Windows10 homeを使っているので、Docker for Desktopは使えず、
かつInsider Previewには切り替えたくないなと思いましたので、
Docker Toolboxをインストール!https://docs.docker.com/toolbox/toolbox_install_windows/
こちらリンクですが、入ってみても分かる通り、非常にわかりにくいUIですが頑張ってインストールしましょう。
その際に、gitとvirtual boxがインストールしますかと選択肢がでますが、
すでにインストールしている人はダブルと不具合になるのでチェックは外しておきましょう。インストール完了するとDocker Quickstart Terminalgが使えるのでクリックして起動。
初回はけっこう時間がかかります。
終了したら、おなじみのクジラのAAとIPアドレスが採番されて完了です。実際にVirtual Boxを開いてみてみると、「default」というボックスが立ち上がっているのが見てわかります。
その後、任意のターミナル(せっかく開いているのでDocker Quickstart Terminalでよいかと)で
$ docker --versionと入力するとバージョンが返ってきたらインストール完了です。
続いて任意のディレクトリ(僕はいつもCフォルダ直下に作っています)で
/c$ mkdir docker-workspaceと打って作業用フォルダを作りましょう。
/c$ cd docker-workspaceでそこに移動して、Laradockをインストールします。
docker-workspace$ git clone https://github.com/Laradock/laradock.git $ ls > laradock $ cd laradock次にenvファイルの名前を書き換えます。
laradock$ cp env-example .envここまでできたら、いよいよコンテナを立ち上げていきます。
laradock$ docker-compose up -d nginx mysql phpmyadmin workspaceこちらもプロセスにかなりの時間が初回はかかります。
そして、ほとんどの方は問題なく終了するかと思いますが、
私の場合は、こんなエラーがでてきました。Starting phpmyadmin ... error ERROR: for phpmyadmin Cannot start service phpmyadmin: driver failed programming external coStarting phpmyadmin ... error 006): Bind for 0.0.0.0:8080 failed: port is already allocated ERROR: for workspaceCannot start service workspace: driver failed programming external connectivity on endpoint workspace(xxxxxxxxx): Bind for 0.0.0.0:8080 failed: port is already allocatedどうやら、ポートが被っている??
一旦、再起動してみたり、コンテナを削除して作り直しても無駄なうえ、
lsofコマンドができず、起動しているファイルをkillすることもできなかったので、
.envファイルを編集することにしました。.env### WORKSPACE ############################################# WORKSPACE_COMPOSER_GLOBAL_INSTALL=true WORKSPACE_COMPOSER_AUTH=false WORKSPACE_COMPOSER_REPO_PACKAGIST= WORKSPACE_NVM_NODEJS_ORG_MIRROR= WORKSPACE_INSTALL_NODE=true WORKSPACE_NODE_VERSION=node WORKSPACE_NPM_REGISTRY= WORKSPACE_INSTALL_YARN=true WORKSPACE_YARN_VERSION=latest WORKSPACE_INSTALL_NPM_GULP=true WORKSPACE_INSTALL_NPM_BOWER=false WORKSPACE_INSTALL_NPM_VUE_CLI=true WORKSPACE_INSTALL_NPM_ANGULAR_CLI=false WORKSPACE_INSTALL_PHPREDIS=true WORKSPACE_INSTALL_WORKSPACE_SSH=false WORKSPACE_INSTALL_SUBVERSION=false WORKSPACE_INSTALL_BZ2=false WORKSPACE_INSTALL_GMP=false WORKSPACE_INSTALL_XDEBUG=false WORKSPACE_INSTALL_PCOV=false WORKSPACE_INSTALL_PHPDBG=false WORKSPACE_INSTALL_SSH2=false WORKSPACE_INSTALL_LDAP=false WORKSPACE_INSTALL_SOAP=false WORKSPACE_INSTALL_XSL=false WORKSPACE_INSTALL_SMB=false WORKSPACE_INSTALL_IMAP=false WORKSPACE_INSTALL_MONGO=false WORKSPACE_INSTALL_AMQP=false WORKSPACE_INSTALL_CASSANDRA=false WORKSPACE_INSTALL_GEARMAN=false WORKSPACE_INSTALL_MSSQL=false WORKSPACE_INSTALL_DRUSH=false WORKSPACE_DRUSH_VERSION=8.1.17 WORKSPACE_INSTALL_DRUPAL_CONSOLE=false WORKSPACE_INSTALL_WP_CLI=false WORKSPACE_INSTALL_AEROSPIKE=false WORKSPACE_INSTALL_OCI8=false WORKSPACE_INSTALL_V8JS=false WORKSPACE_INSTALL_LARAVEL_ENVOY=false WORKSPACE_INSTALL_LARAVEL_INSTALLER=false WORKSPACE_INSTALL_DEPLOYER=false WORKSPACE_INSTALL_PRESTISSIMO=false WORKSPACE_INSTALL_LINUXBREW=false WORKSPACE_INSTALL_MC=false WORKSPACE_INSTALL_SYMFONY=false WORKSPACE_INSTALL_PYTHON=false WORKSPACE_INSTALL_POWERLINE=false WORKSPACE_INSTALL_SUPERVISOR=false WORKSPACE_INSTALL_IMAGE_OPTIMIZERS=false WORKSPACE_INSTALL_IMAGEMAGICK=false WORKSPACE_INSTALL_TERRAFORM=false WORKSPACE_INSTALL_DUSK_DEPS=false WORKSPACE_INSTALL_PG_CLIENT=false WORKSPACE_INSTALL_PHALCON=false WORKSPACE_INSTALL_SWOOLE=false WORKSPACE_INSTALL_TAINT=false WORKSPACE_INSTALL_LIBPNG=false WORKSPACE_INSTALL_IONCUBE=false WORKSPACE_INSTALL_MYSQL_CLIENT=false WORKSPACE_INSTALL_PING=false WORKSPACE_INSTALL_SSHPASS=false WORKSPACE_INSTALL_INOTIFY=false WORKSPACE_INSTALL_FSWATCH=false WORKSPACE_INSTALL_YAML=false WORKSPACE_INSTALL_MAILPARSE=false WORKSPACE_PUID=1000 WORKSPACE_PGID=1000 WORKSPACE_CHROME_DRIVER_VERSION=2.42 WORKSPACE_TIMEZONE=UTC WORKSPACE_SSH_PORT=2222 WORKSPACE_INSTALL_FFMPEG=false WORKSPACE_INSTALL_WKHTMLTOPDF=false WORKSPACE_INSTALL_GNU_PARALLEL=false WORKSPACE_INSTALL_AST=true WORKSPACE_AST_VERSION=1.0.3 WORKSPACE_VUE_CLI_SERVE_HOST_PORT=8008 #ここ、8080になってたので適当な番号に書き換えました! WORKSPACE_VUE_CLI_UI_HOST_PORT=8001 WORKSPACE_INSTALL_GIT_PROMPT=falseこれでコマンドをやり直したらできました!!
docker-compose upとだけやってしまうと、容量不足になってしまい、
ERROR: Service 'web' failed to build: failed to copy files: failed to copy directory: Error processing tar file(exit status 1): open /node_modules/hosted-git-info/CHANGELOG.md: no space left on deviceみたいな感じでエラーになってしまうので、立ち上げるコンテナを-dで指定しましょう。
立ち上げた後は、laradock$ docker-compose exec workspace bashと打ってワークスペースに接続します。ディレクトリがroot@var/wwwみたいな感じに変わったら成功。いつもやるようにプロジェクトをコマンドを打って作りましょう。
laradock$ composer create-project --prefer-dist laravel/laravel #アプリ名またこれで少しの間完了するまで放置します。
root@var/www$ ls >laradock #アプリ名できたらexitで接続を終了します。
laradock$ cd nginx/sites/最後にnginxの設定ファイルを編集します。
laradock/nginx/sites$ cp default.conf default.conf.backup $ cp laravel.conf.example default.conf $ vim default.confdefalut.confserver { listen 80; listen [::]:80; # For https # listen 443 ssl; # listen [::]:443 ssl ipv6only=on; # ssl_certificate /etc/nginx/ssl/default.crt; # ssl_certificate_key /etc/nginx/ssl/default.key; server_name laravel.test; root /var/www/laravel/#ここにアプリ名を入れる!/public; index index.php index.html index.htm;laradockに戻って $docker-compose restartをして、
Docker Quickstart Terminal起動時に出るIPアドレスをブラウザで入力すると、
Laravelトップページがでます。これで、環境構築は完了です!
- 投稿日:2020-03-16T15:09:14+09:00
AWSで作ったLaravelアプリケーションをXserverにデプロイする
はじめに
タイトル通りですが、LaravelアプリケーションのデプロイをXserverで試してみました。
AWSでアプリケーションは作成したのですが、
XAMPPで作成した方も以下のやり方でできると思います。まとめ
さっそくですがやり方を以下にまとめました。
※XAMPPでアプリケーションを作成した方は⑥以降を参考にしていただければと思います。
①AWSでLaravelアプリケーションを作成。
②作成したアプリケーションのフォルダをダウンロードしてXAMPP環境下(htdocs内)に保存する。
③XAMPPでphpMyAdminを起動。アプリケーション用のDB(DB名:laravel)を作成する。
④.envをXAMPP環境下でDBが使えるようにに編集。
.envDB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD=⑤コマンドプロンプトで同フォルダに移動してテーブル作成
$ cd 作成したアプリのフォルダ $ php artisan migrate//このコマンドでテーブルが作成されます。⑥FTP(FileZillaを使用しました)で転送したいドメイン内のpublic_htmlへ作成したアプリのpublic内のファイルをすべて転送
⑦publicフォルダ以外のファイルをまとめて新しく作ったフォルダに転送(public_htmlと同じ階層下)
⑧public_htmlに転送したindex.phpのrequire先を新しく作ったフォルダ先に変更
index.phprequire __DIR__.'/../laraveltest/vendor/autoload.php';//28行目 ~~ $app = require_once __DIR__.'/../laraveltest/bootstrap/app.php';//38行目⑨XAMPP環境下のphpMyAdminで同アプリ用に作ったテーブルをエクスポート(.sqlファイル)
⑩先ほどエクスポートしたsqlファイルをXserver環境下のphpMyAdminにインポートしてテーブル作成
⑪転送した.envを以下のように編集して保存
.envAPP_URL=http://独自ドメイン/ DB_connection=mysql DB_HOST=自身のサーバ名.xserver.jp DB_PORT=3306 DB_DATABASE=自身のデータベース名 DB_USERNAME=自身のユーザー名 DB_PASSWORD=自身で設定したパスワード⑫対象のドメインへアクセスして問題ないか確認。
実際にデプロイしたサイトは以下になります。
よければ覗いてみてください◎
https://craftbeers.site参考
参考にさせていただいた記事は以下です。
https://qiita.com/hitotch/items/5c8c2858c883e69cd507最後に
完全に個人的備忘録です。
もしかしたらかなり遠回りな方法でデプロイしているかもしれませんので、
他にも良い方法がありましたら教えていただけますと幸いです。
また、初投稿で書き方もあまりわからなかったのでかなり雑な記事になってしまいました。。。
- 投稿日:2020-03-16T12:37:50+09:00
【Laravel】クエリビルダは言いました。「find()とfirst()は同時に使わないようにね。」
書籍の管理と貸し出し申請をウェブ上で行うことができるアプリケーション「BookMark」。読み終わった本を返却しようとしたその時、本は返却済み扱いにはならずエラー画面に遷移してしまいました。
バグの原因は返却対象の書籍情報を取得するクエリビルダにありました。今回はこのクエリビルダがどんなSQLを実行しているのか見てみたいと思います。
■結論
主キーで取得するならfind()を。
それ以外ならwhere()&first()を使おう。■該当のソースコード
本の貸出状態は、booksテーブルの「user_id」カラムにユーザーIDがあるかないかで行っています。そのため、返却処理は「STEP1.リクエスト内の$bookIdからBookモデルを取得」「STEP2.user_idをnullで更新」で行っていました。
bookController.phppublic function destroy(Request $request) { $user = Auth::user(); $bookId = $request->application; // booksテーブルの所有者をnullで更新 $book = Book::find($bookId)->first(); $book->user_id = null; $book->save(); //(以下略)問題は
$book = Book::find($bookId)->first();
の部分。find()とfirst()を一つのクエリで行っています。■tinkerでどうなっているのか確認
tinkerとは
tinkerとはLaravelでプログラムを対話的に扱える、ちょっとした動作確認に使える便利なシステムです。
引用:https://qiita.com/yu_eguchi/items/419a2a081ff142ecf67ftinkerを起動して、書籍ID=2を取得してみます。
// tinker起動 bash-4.2# php artisan tinker Psy Shell v0.9.12 (PHP 7.3.11 — cli) by Justin Hileman // Bookモデルでid=2のレコードを取得 >>> use App\Book; >>> Book::find(2); => App\Book {#3056 id: 2, book_name: "JUnit実践入門", user_id: null, created_at: "2020-01-16 06:51:25", updated_at: "2020-02-02 13:45:07", title_kana: "ジェイユニット ジッセン ニュウモン", subtitle: "体系的に学ぶユニットテストの技法", subtitle_kana: "タイケイテキ ニ マナブ ユニット テスト ノ ギホウ", isbn: "9784774153773", author: "渡辺修司", author_kana: "ワタナベ,シュウジ", publisher: "技術評論社", url: "https://books.rakuten.co.jp/rb/12058050/", }きちんとID=2が取得できています。
次は、これにfirst()をつけてみます。正常な動作であれば同じ結果になるはずです。// これにfirst()をつけてみる。 >>> >>> Book::find(2)->first(); => App\Book {#3047 id: 1, book_name: "SOFT SKILLS", user_id: null, created_at: "2020-01-16 06:51:25", updated_at: "2020-02-02 13:45:23", title_kana: "ソフト スキルズ", subtitle: "ソフトウェア開発者の人生マニュアル", subtitle_kana: "ソフトウェア カイハツシャ ノ ジンセイ マニュアル", isbn: "9784822251550", author: "ジョン・Z.ソンメズ/長尾高弘", author_kana: "ソンメズ,ジョン・Z./ナガオ,タカヒロ", publisher: "日経BP社", url: "https://books.rakuten.co.jp/rb/14141677/", }結果が変わりました。どうやら、おかしいのはこの部分のようです。
■実行クエリを確認
実際に実行されているクエリが見たいですね。そんなときは、
enableQueryLog()
とgetQueryLog()
を使いましょう。example.php\DB::enableQueryLog(); // 見たいクエリ dd(\DB::getQueryLog());これで確認ができます。
bookController.phppublic function destroy(Request $request) { $user = Auth::user(); $bookId = $request->application;<img width="388" alt="dd_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250884/bfffecdf-e6e7-5063-a6ef-38777036f7d2.png"> // 見たいクエリの前に記述。 \DB::enableQueryLog(); $book = Book::find($bookId)->first(); // dd()で実行されたクエリを見る。 dd(\DB::getQueryLog()); $book->user_id = null; $book->save(); //(以下略)原因が判明しましたね。
実行したいクエリselect * from books where books.id=1 limig 1;
の後に、select * from books limit 1;
が実行されていたため、想定の結果とは異なるデータになっていたようです。では、
$book = Book::find($bookId);
のクエリはどうなるのでしょうか。
まとめるとこのような実行内容になるようです。
query.php// findでidを指定 Book::find(2); → select * from books where id = 2 limit 1; // whereでidを指定した後、first()で1レコード取得 Book::where('id', 2)->first(); → select * from books where id = 2 limit 1;■まとめ:主キーならfind()。それ以外ならwhere()&first()。
今回のバグは、find()とwhere()&first()の理解不足だったため起きました。
find()で指定するのは主キーだからfirst()を使わなくても1レコードに特定することができるという点に気づけばこのような勘違いは起きなかったと思います。以後、気を付けます。それでは!
- 投稿日:2020-03-16T11:32:40+09:00
Laravelの開発環境をDockerで構築したらcould not find driver
Laravelの開発環境をDockerで構築しようとしてハマったのでメモを残しておきます。
Laravelの開発環境をDockerで構築する方法は以下を参照してください。
Dockerを使って1コマンドで起動できるLaravel開発環境を構築する以下のようにDockerfileを作成しました。
DockerfileFROM php:7.3-apache COPY --from=composer /usr/bin/composer /usr/bin/composer RUN apt-get update && apt-get install -y \ unzip \ libzip-dev \ zlib1g-dev \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* \ && a2enmod rewrite COPY ./apache2.conf /etc/apache2/apache2.conf COPY ./php.ini /usr/local/etc/php/php.ini WORKDIR /var/www/myappコンテナを起動してアクセスしてみると、PDOExceptionでcould not find driverが出力されました。
MySQLのPDOドライバが有効になってなかったかと思って、php.iniのexentionのコメントを外すもエラー消えず。そもそもインストールされてないっぽいです。
対処法はDocker Hub に答えがありました。======Docker Hub引用=========
PHP Core Extensions
For example, if you want to have a PHP-FPM image with the gd extension, you can inherit the base image that you like, and write your own Dockerfile like this:FROM php:7.4-fpm RUN apt-get update && apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libpng-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) gd======Docker Hub引用=========
どうやら
docker-php-ext-install
でいけるようです。最終的にこんな形にして、エラーは解消しました。
FROM php:7.3-apache COPY --from=composer /usr/bin/composer /usr/bin/composer RUN apt-get update && apt-get install -y \ unzip \ libzip-dev \ zlib1g-dev \ && docker-php-ext-install \ zip \ pdo_mysql \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* \ && a2enmod rewrite COPY ./apache2.conf /etc/apache2/apache2.conf COPY ./php.ini /usr/local/etc/php/php.ini WORKDIR /var/www/myapp
- 投稿日:2020-03-16T09:18:13+09:00
Laravel+SendGrid WebAPIでメール送信
1.はじめに
LaravelでSendGrid Web APIを使ってメール送信する方法を記載していきます!
メール本文はbladeで書いて、様々なメールのテンプレートを利用できるようにします。2.環境
- Laravel Framework 6.0.4
- "sendgrid/sendgrid": "^7.4"
3.SendGridのコンソールで、API Keyを発行
SendGridにログイン(アカウントがない場合は作成)し、
https://app.sendgrid.com/settings/api_keysにアクセスします。[Create API Key]をクリックし、APIキーを作成しましょう。
※APIキーは一度しか表示されないので注意!
4.パッケージのインストール
laravel側で、SendGridのパッケージをインストールしましょう。
terminalcomposer require sendgrid/sendgrid5.envファイルにAPIキーとかを追記
APIキーや送信元アドレスなどを記載しておきます。
.env#sendgrid SENDGRID_API_KEY="ここにAPIキーを記載する" FROM_EMAIL="ここに送信元アドレス" FROM_NAME="ここに送信元の名前"6.処理を書く
controllerやmodelなどにメール送信のコードを書きます。
今回はシンプルにRequestのデータからユーザのデータを取得してメール送信する例です。※下記ではメール送信に失敗した際の処理をLogとして残していますが、要らない場合は削除してください。
use Exception; use Log; ~ public function sendMail(Request $request) { $data = $request->all(); $email = new \SendGrid\Mail\Mail(); $email->setFrom(getenv('FROM_EMAIL'), getenv('FROM_NAME')); $email->setSubject("○○○○○○○○○○○○通知"); $email->addTo('送信先アドレス'); $sendGrid = new \SendGrid(getenv('SENDGRID_API_KEY')); $email->addContent( "text/plain", strval( view( 'emails/templates/notificationMail', compact('data') ) ) ); $email->addContent( "text/html", strval( view( 'emails/templates/notificationMail', compact('data') ) ) ); try { $sendGrid->send($email); return true; } catch (Exception $e) { Log::debug($e->getMessage()); return false; } }7.メール本文をbladeで書く
6.のコードだと、「emails/templates/notificationMail.blade.php」をテンプレートとして指定しています。
viewをメールの体裁ごとに作成しておけば、便利だと思います。
通常のreturn viewと同様にcompactで渡したデータを好き放題表示しましょう!
notificationMail.blade.php<div> <p> 〇〇〇通知です<br> 以下詳細をご確認ください。 </p> <div> <p>-------------------------------------------------------</p> <div>お名前:{{ $data->name }}</div> <div>メッセージ:{{ $data->message }}</div> <p>-------------------------------------------------------</p> </div> </div>8.宛先を複数人にしたいとき
宛先が複数人の場合は、「$email->addTo('送信先アドレス');」をforeach等で追加分実行すればできます。
同じアドレスが複数あるとBad Requestになってしまいメールが送れないので、配列にして重複を除いてから送信するとよいと思います!
example$emails = array('test1@example.com', 'test2@example.com','test3@example.com'); $uniqueEmails = array_unique($emails); $alignedUniqueEmails = array_values($uniqueEmails);9.まとめ
あとは、メールを送信したいタイミングで関数を実行するだけです。
関数はどこかに汎用的に使えるようにしておくといいですね!SendGrid社に感謝です。
アリガトウゴザイマス!