- 投稿日:2020-11-29T21:47:46+09:00
Herokuに直接ログインしてコマンドを実行する
以下のコマンドでHerokuに直接ログインしてコマンドを実行できます。
your_app_name の部分は自分のHerokuアプリケーションの名前に変更してください。heroku loginheroku ps:exec -a your_app_name参考
Key generation for Heroku deployments
https://github.com/laravel/passport/issues/267#issuecomment-392222152自分の場合、ローカル環境ではLaravel passportの実装が上手く動いていたのですが、本番のHerokuでは上手く動作せず、直接ログインしてコマンドを実行する事でエラーを解決することができました。
- 投稿日:2020-11-29T21:47:46+09:00
Herokuにsshログインしてコマンドを実行する
以下のコマンドでHerokuにsshログインしてコマンドを実行できます。
your_app_name の部分は自分のHerokuアプリケーションの名前に変更してください。heroku loginheroku ps:exec -a your_app_name参考
Key generation for Heroku deployments
https://github.com/laravel/passport/issues/267#issuecomment-392222152自分の場合、ローカル環境ではLaravel passportの実装が上手く動いていたのですが、本番のHerokuでは上手く動作せず、sshログインしてコマンドを実行する事でエラーを解決することができました。
- 投稿日:2020-11-29T18:26:41+09:00
[PHP]composerダウンロードの流れとLaravelインストール
composerダウンロードの流れとLaravelインストール
MacOS
https://getcomposer.org/download/
上記にアクセスし、ページ下の方のManual Downloadから最新バージョンのリンクをクリックしダウンロードする
(ここでいうと2.0.7という部分)コンソールでもできる(多分)
ターミナルcurl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer私はコンソールでしました
バージョンの設定
ターミナルchmod a+x /usr/local/bin/composercomposerのバージョンチェック
ターミナルcomposer -V正しくインストールできていればインストールした日付やversionが表示される
Laravelインストール
ターミナルcomposer global require Laravel/installerこちらは多少時間がかかる場合もございます
環境変数の設定
ターミナルecho "export PATH=~/.composer/vendor/bin:$PATH" >> ~/.bash_profile source ~/.bash_profileこれでLaravelコマンドが認識されるようになりました。ターミナル終了後もLaravelコマンドが使えるようになります
以上!
- 投稿日:2020-11-29T14:18:02+09:00
使用しているブラウザのバージョン、ちゃんと把握していますか?
概要
Laravel Duskの公式に沿って
php artisan dusk
を実行時、下記エラーが発生Facebook\WebDriver\Exception\SessionNotCreatedException: session not created: This version of ChromeDriver only supports Chrome version 87 Current browser version is 86.0.4240.198 with binary path C:\Program Files (x86)\Google\Chrome\Application\chrome.exe内容を簡単にまとめると、ChromeDriverとChromeのバージョンが一致していませんとのこと。
- ChromeDriver:87.0.4280.20
- Chrome:86.0.4240.198
しばらくChromeのバージョン更新を放置していたので、その付けが回ってきました
解決方法
解決方法は下記の2通り
1. ChromeDriveのバージョンをChromeに合わせる
2. ChromeのバージョンをChromeDriverに合わせる解決方法 ①ChromeDriveのバージョンをChromeに合わせる
Chromeのバージョンに合わせて、ChromeDriveのバージョンをインストール
// 〇〇には指定のバージョンを設定 php artisan dusk:chrome-driver 〇〇解決方法 ②ChromeのバージョンをChromeDriverに合わせる
Chromeのバージョン更新は、下記を参考にすればいけると思います
Google Chrome を更新する
- 投稿日:2020-11-29T14:18:02+09:00
【Laravel Dusk】ChromeDriverとChromeのバージョン不一致で生じるエラーの解決方法
概要
Laravel Duskの公式に沿って
php artisan dusk
を実行時、下記エラーが発生Facebook\WebDriver\Exception\SessionNotCreatedException: session not created: This version of ChromeDriver only supports Chrome version 87 Current browser version is 86.0.4240.198 with binary path C:\Program Files (x86)\Google\Chrome\Application\chrome.exe内容を簡単にまとめると、ChromeDriverとChromeのバージョンが一致していませんとのこと。
- ChromeDriver:87.0.4280.20
- Chrome:86.0.4240.198
解決方法
解決方法は下記の2通り
1. ChromeDriveのバージョンをChromeに合わせる
2. ChromeのバージョンをChromeDriverに合わせる解決方法 ①ChromeDriveのバージョンをChromeに合わせる
Chromeのバージョンに合わせて、ChromeDriveのバージョンをインストール
// 〇〇には指定のバージョンを設定 php artisan dusk:chrome-driver 〇〇解決方法 ②ChromeのバージョンをChromeDriverに合わせる
Chromeのバージョン更新は、下記を参考にすればいけると思います
Google Chrome を更新する
- 投稿日:2020-11-29T13:12:56+09:00
Laravel Duskでエラー「Facebook\WebDriver\Exception\UnknownErrorException: unknown error: net::ERR_CONNECTION_REFUSED」が発生した場合の対処方法
エラー発生したタイミング
php artisan dusk
を実行時に、タイトルにあるエラーメッセージが表示原因
.env
ファイルのAPP_URL
パラメータで指定されている値が原因解決方法
公式にも明記されているが、
APP_URL
には、ブラウザでアプリケーションにアクセスするために使用するURLを設定する必要がある。アプリケーションのURLが下記の場合
Starting Laravel development server: http://127.0.0.1:8000
APP_URL=http://localhost //(デフォルト) ↓ APP_URL=http://localhost:8000 //(変更後)
- 投稿日:2020-11-29T13:11:02+09:00
Laravel「php artisan migrate」でエラー「could not find driver」が発生したときの解決方法
- 投稿日:2020-11-29T09:21:45+09:00
LaravelのBladeテンプレートをVue.jsっぽく書いてみた
はじめに
Vue.jsを学習した時に、Vueコンポーネントのコード構成が非常に気に入りました。
そこで、LaravelのBladeテンプレートでも同様のコード構成ができるか検討してみたんですよね。
すると、自分の中では割と納得のいく形にできたんですよ。
なので、今回は私がLaravelのBladeテンプレートで採用したコード構成の例を紹介します
※Vue.jsのベストプラクティスということではないので、誤解しないようにお願いします。この記事の対象者
- Laravelを学習されている方
- Bladeテンプレートの書き方のサンプルが欲しい方
作業環境
コンピュータ : Mac mini(2018)
OS : macOS Catalina バージョン10.15.7
仮想基盤 : Docker version 19.03.8
ベースイメージ : AmazonLinux2
言語 : PHP7.4.11
フレームワーク : Laravel Version 6.20.5Vue.jsのコード構成について
Vue.jsでは、コンポーネント(構成要素や部品の意)を作成する際に、HTML、CSS、Javascriptを1つのファイルに記述します。
page_titleコンポーネント
page_title.vue<!-- HTML記述部--> <template> <h1>{{title}}</h1> </template> <!-- Javascript記述部--> <script> export default { data(){ return { title: "ページの大見出しだよ" } } } </script> <!-- CSS記述部--> <style> h1{ color: red; } </style>page_titleコンポーネントを呼び出す親コンポーネント
body.vue<template> <!-- ここでは、読み込んだコンポーネントをタグとして利用しています --> <PageTitle></PageTitle> <!-- コンポーネントの読み込みは下のscriptタグ内で行っています --> </template> <script> // ここで、pageタイトルコンポーネントを読み込んでいます。 import PageTitle from 'page_title.vue' export default { components: { PageTitle } } </script>表示されたページ
Laravel(Bladeテンプレート)のコード構成
Laravelでは、Bladeテンプレートでディレクティブと呼ばれる記述方法を使用できます。
今回は、@include、@yield、@section等のディレクティブを利用してVueコンポーネントの用にBladeテンプレートを作成します。page_title.vueの代替
page_title.blade.php<!-- HTML記述部 --> @section('page_title_template') <h1 id="page_title">title</h1> @endsection <!-- Javascript記述部 --> @section('page_title_js') <script type="text/javascript"> // windowロード時に呼び出す関数のセット window.onload = setH1InnerText; // windowロード時にh1タグのテキストを書き換える function setH1InnerText(){ let h1_tag = document.getElementById('page_title'); h1_tag.innerText = "ページの大見出しだよ"; } </script> @endsection <!-- CSS記述部 --> @section('page_title_css') <style> h1{ color: red; } </style> @endsectionbody.vueの代替
body.blade.php<!-- ここでpage_title.blade.phpを読み込み --> @include('page_title') <!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Laravel</title> <!-- Fonts --> <link href="https://fonts.googleapis.com/css2?family=Nunito:wght@200;600&display=swap" rel="stylesheet"> <!-- CSSの呼び出し --> @yield('page_title_css') </head> <body> <!-- HTMLの呼び出し --> @yield('page_title_template') <!-- Javascriptの呼び出し --> @yield('page_title_js') </body> </html>Laravelでは、親ファイルで子コンポーネントのCSSも明記する必要はありますね。
ホームを部品化してみよう!!
試しに、この構成を利用してLaravelのデフォルトホーム(Welcomeページ)を部品化してみます。
LaravelのWelcomeページのコード
welcom.blade.php<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Laravel</title> <!-- Fonts --> <link href="https://fonts.googleapis.com/css2?family=Nunito:wght@200;600&display=swap" rel="stylesheet"> <!-- Styles --> <style> html, body { background-color: #fff; color: #636b6f; font-family: 'Nunito', sans-serif; font-weight: 200; height: 100vh; margin: 0; } .full-height { height: 100vh; } .flex-center { align-items: center; display: flex; justify-content: center; } .position-ref { position: relative; } .top-right { position: absolute; right: 10px; top: 18px; } .content { text-align: center; } .title { font-size: 84px; } .links > a { color: #636b6f; padding: 0 25px; font-size: 13px; font-weight: 600; letter-spacing: .1rem; text-decoration: none; text-transform: uppercase; } .m-b-md { margin-bottom: 30px; } </style> </head> <body> <div class="flex-center position-ref full-height"> <div class="content"> <div class="title m-b-md"> Laravel </div> <div class="links"> <a href="https://laravel.com/docs">Docs</a> <a href="https://laracasts.com">Laracasts</a> <a href="https://laravel-news.com">News</a> <a href="https://blog.laravel.com">Blog</a> <a href="https://nova.laravel.com">Nova</a> <a href="https://forge.laravel.com">Forge</a> <a href="https://vapor.laravel.com">Vapor</a> <a href="https://github.com/laravel/laravel">GitHub</a> </div> </div> </div> </body> </html>正直、長いですよね
ブラウザで表示
部品化した場合のWelcomeページのコード
welcome.blade.php<!-- コンポーネントの読み込み --> @include('view_components.common_all_page_css') @include('view_components.title') @include('view_components.links') <!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Laravel</title> <!-- Fonts --> <link href="https://fonts.googleapis.com/css2?family=Nunito:wght@200;600&display=swap" rel="stylesheet"> <!-- Styles --> <!-- 全てのページ共通のCSS --> @yield('common_all_page_css') <!-- タイトル部分のCSS --> @yield('title_css') <!-- リンク部分のCSS --> @yield('links_css') </head> <body> <div class="flex-center position-ref full-height"> <div class="content"> <!-- タイトル部分のHTML --> @yield('title_template') <!-- リンク部分のHTML --> @yield('links_template') <!-- Jarascript --> @yield('title_js') </div> </div> </body> </html>次の3つのコンポーネントに分割しました
全ページ共通のCSSコンポーネント
common_all_page_css.blade.php@section('common_all_page_css') <style> html, body { background-color: #fff; color: #636b6f; font-family: 'Nunito', sans-serif; font-weight: 200; height: 100vh; margin: 0; } .full-height { height: 100vh; } .flex-center { align-items: center; display: flex; justify-content: center; } .position-ref { position: relative; } .top-right { position: absolute; right: 10px; top: 18px; } .content { text-align: center; } </style> @endsectionタイトル部分のコンポーネント
title.blade.php@section('title_template') <div id="page_title" class="title m-b-md"> </div> @endsection @section('title_js') <script type="text/javascript"> // windowロード時に呼び出す関数のセット window.onload = setPageTitleInnerText; // windowロード時にタイトルのテキストを書き換える function setPageTitleInnerText(){ let page_title = document.getElementById('page_title'); page_title.innerText = "Laravel"; } </script> @endsection @section('title_css') <style> .title { font-size: 84px; } #page_title{ color: green; } </style> @endsectionついでなので、CSSでタイトルの文字色を緑色にしてみました。
まぁ、タイトル文字をJSで代入することはありませんが、あくまでコード構成の例ですのでそこは参考程度に。リンク部分のコンポーネント
links.blade.php@section('links_template') <div class="links"> <a href="https://laravel.com/docs">Docs</a> <a href="https://laracasts.com">Laracasts</a> <a href="https://laravel-news.com">News</a> <a href="https://blog.laravel.com">Blog</a> <a href="https://nova.laravel.com">Nova</a> <a href="https://forge.laravel.com">Forge</a> <a href="https://vapor.laravel.com">Vapor</a> <a href="https://github.com/laravel/laravel">GitHub</a> </div> @endsection @section('links_css') <style> .links > a { color: #636b6f; padding: 0 25px; font-size: 13px; font-weight: 600; letter-spacing: .1rem; text-decoration: none; text-transform: uppercase; } </style> @endsectionブラウザで表示
無事、タイトルが緑色のWelcomeページが表示されました。
最後に
LaravelのBladeテンプレートでは、1ファイル内に1つの@sectionを使用するのが基本のように見受けられます。
なので、今回のコード構成はパフォーマンス面で不都合があるのかもしれません。
とはいえ、恐らく、Laravelだけでサービスを開発する場合は、あまり影響がないと思っています。
そこまでパフォーマンスを求めるサービスをLaravelだけで開発することは珍しいでしょうからねこの記事が誰かのお役に立てると嬉しいです。
それでは、最後まで読んでいただきありがとうございます
- 投稿日:2020-11-29T04:58:46+09:00
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~Vue.js × axios編~
制作環境
Windows 10
Laravel : 6.18.35
Laravel/ui : 1.0
Laravel-mix : 5.0.1
Bootstrap : 4.0.0
axios : 0.19
Vue : 2.5.17
XAMPP
PHP : 7.4.3
Visual Studio Codeはじめに
この記事はプログラミングをはじめたばかりの素人が、できたことをメモするのに利用しています。
内容には誤りがあるかもしれません。前回のつづきになります。
関連記事
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~事前準備編~
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~JavaScript編~
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~jQuery編~
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~JavaScript × axios編~
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~jQuery × axios編~
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~JavaScript × FetchAPI編~
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~jQuery × FetchAPI編~今回作成するもの
Vue.jsとaxiosを利用し非同期通信を行い、自動で仕入れ先が入力される機能を実装します。
以下作成条件
- Vue.jsを使用し通信にはaxiosを使用します。
- 数字が4桁入力されたら自動で仕入れ先を検索し、反映します。
- 検索するのにクリック操作を必要としません。
input
に入力されたら検索します。- スクリプトの読み込みには
Laravel-mix
を使用します。- 前回作成した
test.js
は使用しません。app.jsの編集
今まで使用してきたtest.jsは今回使用しません。
resources>js
内のapp.js
を開き、読み込みがされないように以下の内容をコメントアウトするか、削除してください。app.jsrequire('./test');続けて
Vue.js
の記述を行います。
app.js
の下の部分に記載があるconst app = new Vue
を以下の用に修正します。app.js// 変数appにVueクラスをインスタンス化(実体化)して代入します // その際引数で初期設定を渡します const app = new Vue({ // id="app"のDOM要素に対しVueインスタンスを与えます // このidをもつ要素の範囲がVue.jsが使える範囲(仮想DOM)になります el: '#app', // キーと値の初期値を設定します data() { return { code: '', supplier: '', } }, // メソッド(機能)を作成します methods: { // 新たにgetSupplierというメソッドを作成し、処理を記述します getSupplier() { // bladeテンプレートipnutの値をtraderCodeに代入します let traderCode = this.code // 業者コードが4桁未満の場合は検索させないようにします if (traderCode.length < 4) { return } // アクセス先のURLを作成し、urlに代入します let url = '/form_search?trader_code=' + traderCode // 次の処理の中ではthis.supplierのように、thisを使えないため // 任意の変数に代入することで使えるようにします var that = this // axiosで指定したURLにGETでアクセスします // .thenで通信に成功した場合の処理を記述します // 引数に変数をいれることで、コントローラからのデータ(検索結果)を受け取れます // ここでは変数responseでデータを受け取っています axios.get(url).then(function(response) { // 受け取ったデータから必要なものだけ取り出し変数に代入します let data = response.data // 受け取ったデータ(検索結果)が仕入れ先のvalueに反映されるよう // supplierに値を代入します that.supplier = data[0].trader_name }) } } });コンパイル
ターミナルを起動し、以下を実行してください。
※node.jsが必要です。インストールされていない方は、インストールを行ってください。node.js
https://nodejs.org/ja/npm run devビューの修正
resources>views
内のindex.blade.php
を開き、以下の部分だけ修正します。index.blade.php<div> <label>業者コード: <input type="text" id="code" v-model="code" @input="getSupplier()"></label> <label>仕入れ先: <input type="text" id="supplier" name="supplier" v-model="supplier"></label> </div>v-model
v-modelを記述するだけで、双方向データバインディング(Two-way Data Binding)を実装できます。
以前記事を投稿しているので、詳しくはこちらを確認してください。
https://qiita.com/Charry/items/a1e6a93f05c7f686b505@input
@input
はv-on:input
の省略型です。
今回は業者コードが入力されたら検索処理を行うので、@input="getSupplier()"
とすることでgetSupplierメソッドを呼び出しています。Vue.jsの場合データの受け渡し方法がわかっていないと、ちょっとわかりづらいですね。
以上で終了です。
お疲れさまでした。
- 投稿日:2020-11-29T02:28:47+09:00
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~jQuery × axios編~
制作環境
Windows 10
Laravel : 6.18.35
Laravel/ui : 1.0
Laravel-mix : 5.0.1
Bootstrap : 4.0.0
axios : 0.19
Vue : 2.5.17
XAMPP
PHP : 7.4.3
Visual Studio Codeはじめに
この記事はプログラミングをはじめたばかりの素人が、できたことをメモするのに利用しています。
内容には誤りがあるかもしれません。前回のつづきになります。
関連記事
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~事前準備編~
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~JavaScript編~
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~jQuery編~
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~JavaScript × axios編~
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~Vue.js × axios編~
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~JavaScript × FetchAPI編~
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~jQuery × FetchAPI編~今回作成するもの
axiosを利用し非同期通信を行い、自動で仕入れ先が入力される機能を実装します。
以下作成条件
- 基本的な記述にはjQueryを使用し通信にはaxiosを使用します。
- 数字が4桁入力されたら自動で仕入れ先を検索し、反映します。
- 検索するのにクリック操作を必要としません。
input
に入力されたら検索します。- スクリプトの読み込みには
Laravel-mix
を使用します。- 前回作成した
test.js
を編集して使用するで、必要ならtest4.js
等コピーを作成してバックアップしてください。スクリプトの作成
resorces>js
内のtest.js
を開き、以下のように記述します。
前回の内容は全て削除してください。test.js// ここから先は前回のjQuery編の記述と同じため詳細は割愛します。 $(function() { $('#code').on('input', function() { let traderCode = $('#code').val(); if (traderCode.length < 4) { return; } // ここまでは前回のjQuery編の記述と同じ // アクセス先のURLを作成し、urlに代入します。 let url = '/form_search?trader_code=' + traderCode; // ここから先は前回のJavaScript × axios編の記述と同じため詳細は割愛します。 axios.get(url).then(function(response) { let data = response.data; // ここまで前回のJavaScript × axios編の記述と同じ // 受け取ったデータ(検索結果)を仕入れ先のvalueに反映します $('#supplier').val(data[0].trader_name); }) }) })コンパイル
ターミナルを起動し、以下を実行してください。
※node.jsが必要です。インストールされていない方は、インストールを行ってください。node.js
https://nodejs.org/ja/npm run dev確認
その他の内容は前回と変わらないので、ここまでできたら動作を確認してください。
以上です。
次回に続きます。
- 投稿日:2020-11-29T02:03:26+09:00
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~JavaScript × axios編~
制作環境
Windows 10
Laravel : 6.18.35
Laravel/ui : 1.0
Laravel-mix : 5.0.1
Bootstrap : 4.0.0
axios : 0.19
Vue : 2.5.17
XAMPP
PHP : 7.4.3
Visual Studio Codeはじめに
この記事はプログラミングをはじめたばかりの素人が、できたことをメモするのに利用しています。
内容には誤りがあるかもしれません。前回のつづきになります。
関連記事
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~事前準備編~
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~JavaScript編~
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~jQuery編~
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~jQuery × axios編~
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~Vue.js × axios編~
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~JavaScript × FetchAPI編~
Laravel 6.x 非同期通信(Ajax) 【JavaScript】 【jQuery】 【axios】 【Vue.js】 各記述方法 ~jQuery × FetchAPI編~今回作成するもの
axiosを利用し非同期通信を行い、自動で仕入れ先が入力される機能を実装します。
以下作成条件
- 基本的な記述にはJavaScriptを使用し通信にはaxiosを使用します。
- 数字が4桁入力されたら自動で仕入れ先を検索し、反映します。
- 検索するのにクリック操作を必要としません。
input
に入力されたら検索します。- スクリプトの読み込みには
Laravel-mix
を使用します。- 前回作成した
test.js
を編集して使用するで、必要ならtest3.js
等コピーを作成してバックアップしてください。完成イメージ
スクリプトの作成
resources>js内のtest.jsを開き、以下のように記述します。
※前回の内容は削除してください。test.js// ここから先はJavaScript編の記述と同じなので、詳細は割愛します window.onload = function() { document.getElementById('code').addEventListener('input', function() { let traderCode = document.getElementById('code').value; if (traderCode.length < 4) { return; } let url = '/form_search?trader_code=' + traderCode; // ここまではJavaScript編の記述と同じ // axios.get()メソッドを使い、引数のアドレスにGETアクセスします // then()で通信が成功した場合の処理を記述します // コントローラからのデータ(検索結果)は指定した引数で受け取ることができます // ここではresponseにデータを代入していますが、変数の名前はなんでもいいです axios.get(url).then(function(response) { // データの中から必要なものだけ取り出します let data = response.data; // 受け取ったデータ(検索結果)を仕入れ先のvalueに反映します document.getElementById('supplier').value = data[0].trader_name; }) }) }コンパイル
ターミナルを起動し、以下を実行してください。
※node.jsが必要です。インストールされていない方は、インストールを行ってください。node.js
https://nodejs.org/ja/npm run dev確認
その他は前回のままで問題ありません。
実際に4桁の業者コードを入力し、検索できるか確認してください。thenの返り値について
以下は
console.log(response)
の値です。主に以下の値が返ってきます。
もちろん引数の変数名をsample
等にした場合は、response
の部分がsample
になります。// レスポンスデータ response.data // ステータスコード response.status // ステータステキスト response.statusText // レスポンスヘッダ response.headers // コンフィグ response.configエラーの対応について
通信させるのに必要な最低限の書き方しかしてないので、通信エラー時の処理は別途必要です。
.catch(function(error) {}
でエラー時の処理ができます。
.finally(function() {}
とすると成功しても失敗しても行う処理ができます。以上です。
次回に続きます。
- 投稿日:2020-11-29T00:07:07+09:00
[PHP]クラスメソッド
- 投稿日:2020-11-29T00:04:24+09:00
ずぼらなLaravel職人生活の一部始終
はじめに
めんどくさいことが嫌いです。
めんどくさいことを避けるために、日々努力を怠らず生きてきました。
Laravelを触り始めて1年半くらいになったので、その生活の一部始終を紹介したいとおもいます。
LaravelのVersionは6系です。
1. migrationの変更がめんどくさい
migrationでテーブル定義を変更するとき、変更用のmigrationを作るのがめんどくさい。
migrations以下のファイルが爆裂的に増えてしまうし、いちいちxxxxx->change()
とか書きたくない。1-A. 解決策
変更したいmigrationを直で編集する。
編集後は下のコマンドを実行する。
path/your/projectphp artisan migrate:fresh --seed // db:seedも必要な場合 php artisan migrate:fresh // db:seedが要らない場合これで一旦DBが削除されて(
php artisan db:wipe
)、もう一度migrateされるため、変更が反映されます。ちなみに、
refresh
だと一旦ロールバックするため、履歴を正しく管理していない場合怒られるのでfresh
を使っています。2.
php artisan config:cache
がめんどくさいconfigを変更するたびにコマンドを入力しなきゃいけないだなんて。。
2-A. 解決策
キャッシュを使わない。
すでにキャッシュがある場合は下のコマンドで削除する。
path/your/projectphp artisan optimize:clearキャッシュはなければ読みに行ってくれます。
config
だけではなく、routes
についても同様です。開発中は些細なパフォーマンスを気にする必要がないので、このほうがいいですね。
キャッシュなんて要らなかったんや。。本番環境ではちゃんとキャッシュを使いましょう。
path/your/project/productionphp artisan optimizeOPcacheも導入したほうがいいみたいですね。
参考:OPcache導入してみた!(速さ検証もあるよ!) - Qiita3.
php artisan make:XXXXX
がめんどくさい平凡なCRUD作るのにも、
- Model
- Controller
- migration
- seed
- factory
など、たくさんファイルを作らなかきゃいけないのでだるい。
3-A. 解決策
以下のコマンドで一撃作成できる。
path/your/projectphp artisan make:model Models/HogeHoge -a // ModelsフォルダにModelを設置している php artisan make:model Models/HogeHoge -a --api // API用のコントローラーが欲しい場合 # 以下が作成される app/Http/Controllers/HogeHogeController.php app/Models/HogeHoge.php database/factories/HogeHogeFactory.php database/migrations/2020_12_25_000000_create_hoge_hoges_table.php database/seeds/HogeHogeSeeder.phpあとはルーティングを追加するだけで準備OKですね。
route/api.phpなどRoute::resouce('hogehoges','HogeHogeController'); Route::apiResouce('hogehoges','HogeHogeController'); // API用どかんと初期投入or複数追加したいときはLaravelDB.comを使わせてもらっています!
参考:Laravel DB.com 操作マニュアル。 〜コード書かずに超スピード開発(DEMO動画あり)〜 - Qiita4. テスト用データの
db:seed
がめんどくさいモデル数が増えてくると
db:seed
も結構な時間がかかってしまうのでダルい。。4-A-1. 解決策1
テスト用データを分けずに
DatabaseTransactions
トレイトを使う。tests/TestCase.php... use Illuminate\Foundation\Testing\DatabaseTransactions; // 追加 ... abstract class TestCase extends BaseTestCase { ... use DatabaseTransactions; //追加 ... }
DatabaseTransactions
トレイトを使うと、テストコード中に含まれるDB操作がテスト終了後に戻される。
※ 内部的にはテスト内の処理がトランザクションで囲われるDBが汚れることがなく
db:seed
をやり直す必要がなくていいですね。4-A-2. 解決策2(テスト用データを分けたい場合)
テスト用データを分けたい場合は、必要なときだけ
migrate:fresh --seed
してからやはりDatabaseTransactions
トレイトを使う。※ 以下、テスト用データの分け方。
config/database.php... 'mysql' => [ ... ], 'mysql_testing' => [ // 'mysql'の内容をCopyして以下のみ変更 (※ mysqlを使う場合) 'database' => 'hogehoge_testing', ],phpunit.xml<?xml version="1.0" encoding="UTF-8"?> <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd" bootstrap="vendor/autoload.php" colors="true"> <testsuites> <testsuite name="Unit"> <directory suffix="Test.php">./tests/Unit</directory> </testsuite> <testsuite name="Feature"> <directory suffix="Test.php">./tests/Feature</directory> </testsuite> </testsuites> <filter> <whitelist processUncoveredFilesFromWhitelist="true"> <directory suffix=".php">./app</directory> </whitelist> </filter> <php> <env name="APP_ENV" value="testing"/> <env name="DB_CONNECTION" value="mysql_testing"/> <!-- 追加 --> <env name="CACHE_DRIVER" value="array"/> <env name="SESSION_DRIVER" value="array"/> <env name="QUEUE_DRIVER" value="sync"/> </php> </phpunit>path/your/projectphp artisan migrate:fresh --database=mysql_testing --seed # テスト用データを用意 ./vendor/bin/phpunit --testdox # テスト実行
RefreshDatabase
トレイトを使うと毎回空になっちゃってめんどいのです。5. とにかくコマンド打つのががめんどくさい
composer dump-autoload
php artisan migrate:fresh --seed
./vendor/bin/phpunit --testdox
などのコマンドを打つ場面があり、だるい。
5-A. 解決策
gulpで対象フォルダの変更を監視して、トリガーされたら必要なコマンドを実行する。
path/your/project# インストール npm i -D gulp gulp-shellgulpfile.jsvar gulp = require('gulp'); var shell = require('gulp-shell'); gulp.task('default', function() { // database以下の変更を監視 var dbWatcher = gulp.watch( [ 'database/**/*.php', ] ); dbWatcher.on('change',shell.task('composer dump-autoload && php artisan migrate:fresh --seed')); // tests以下の変更を監視 var testWatcher = gulp.watch( [ 'tests/**/*.php', ] ); testWatcher.on('change',shell.task('./vendor/bin/phpunit --testdox')); });path/your/project# 監視タスクのスタート npx gulp
これなら編集後にいつも勝手に必要なコマンドを実行するのでよいです。
無理やりすぎですが。
(番外編) POSTMANでリクエストを作るとき、AcceptやTokenの編集がめんどくさい
Laravelではないですが、APIサーバー用のリクエストを作るときに、
HeaderのAcceptを
application/json
にするのがめんどくさい。ログインしたときに、返ってきたTokenをAuthorizationに設置するのがめんどくさい。
といった問題があります。
番外編1の解決策
コレクションフォルダの
EDIT COLLECTION
で以下のPre-request Script
を記述pm.request.headers.upsert({key: "Accept", value: "application/json"})これでコレクションフォルダごとHeaderのAcceptを
application/json
にできる。なんか、設定の仕方を知らないだけな気がしていますが。。
番外編2の解決策
リクエストの
Tests
に以下のコードを記述し、環境変数を使う。リクエストのTests// bearerがheaderで返ってくる場合。それぞれの認証方式に合わせて編集してください pm.test("Set access token", function () { var auth = pm.response.headers.get('Authorization'); var bearer = auth.split(' '); pm.environment.set("user_access_token", bearer[1]); });ログインが必要なリクエストのAuthorizationを以下のようにする。
返ってきたTokenを環境変数
user_access_token
に入れて、ログインが必要なリクエストのAuthorizationでそれを使っています。Tokenの有効期限をなくすだけだとユーザーを変えられないが、これなら変えられるので開発が楽になる!