- 投稿日:2020-09-18T21:17:46+09:00
[PHP]比較演算子を甘く設定して発生したエラー
現象
\$valueというレコードからschool_rankというカラム(int)を抽出して有無を判定していたところschoolランクが0の時はfalseと認識してしまうので|| $value->school_rank == 0を追加した。
if ( $value->school_rank || $value->school_rank == 0) { 処理 }が、この時甘く==をつけてしまったため、今度は\$value->school_rankがnullのときは0を扱われてしまった。
if ( $value->school_rank || $value->school_rank === 0) { 処理 }教科書でも書いてるように===で厳しく判定しないと思わぬバグを生むなと実感した話
- 投稿日:2020-09-18T19:08:44+09:00
Laravelでクエリ文字列(URLの末尾に?id=1とか付け足すやつ)を生成するには?
やりたいこと
口コミサイトを制作しています。今回は、
1. ユーザーが自分が投稿した口コミをポチッと選択すると、
2. 口コミ編集ページに飛んで、
3. その口コミのレコードをDBから呼び込んで表示し、
4. それを編集できるという機能を実装したいです。
Laravelの某教科書を参照したところ、3,4は説明があってありがたいのですが、1,2のプロセスに関しては「/person/edit/id=番号というように、idパラメータを付けてアクセスをして下さい」と、要は「君の手でレコードのidをURLで打ってみ?表示されるべ?」で終わっていて、まさか自分のサービスを使ってくれるユーザーに直接手で/edit/id=XXとか打たせるわけにはいかないので、自分で考えて作ってみました。私たち教わる側も、「教科書は絶対的であり、A->Zまで全てを教えてくれる!」という姿勢を改めないといけませんね。教科書も私たちに考える余白を与えてくれていると前向きに考えた方が良さそうです。
環境:Laravel 7.26.1、Eloquent ORM(DBクラスで実装している方も参考になると思います!)
やってみた
最初から解決方法を書きますが、超シンプルです。しかもこのステージまで来れた方なら既にDBのレコード(投稿内容でもユーザー名でも何かしら)をブラウザに表示することには成功していると思うので、もしそうなら本当に一瞬です。
今回は投稿を例にとって説明を続けていきます。
要は、ユーザーがある特定の投稿の編集ボタンを押したら、
?id=番号
のURLを生成すればいいわけです。URLにパスを渡すのはHTMLのaタグさんちのhref属性くんの仕事です。なので、だいぶ簡易的にコードを書きますがbladeでこんな感じ↓にすればOKです。(
$items
、`$itemは後で説明します)index.blade.php@foreach ($items as $item) <div>{{$item->title}}</div> <div>{{$item->text}}</div> <a href="edit?id={{$item->id}}">編集する</a> @endforeachこんな風に、href="edit"に
?id={{$item->id}}
を加えるだけです。
titleとtextは投稿のタイトルと本文で、この記事にたどり着くような方だったらもう既にこのようなプログラムは書けていると想像します。
$itemは今回下記のようにコントローラ内で定義したDBのレコードが代入されています。class ReviewController extends Controller { public function index(Request $request) { $items = Review::all(); //投稿の格納されたreviewsテーブルにアクセスするReviewモデルからレコードを取得 return view('index', ['items' => $items]); //views直下のindexファイルにitemsという名前で$itemsを渡して返す }この状態でindex.blade.phpで「編集する」リンクをクリックすれば、当該レコードのidの番号を持ったクエリ文字列(edit?id=1)が生成されるはずです!
ちなみに、ルートのアドレスが気になるところですが、下記のように
?id=番号
的なものをつけずに'edit'のままでも、うまくページ遷移しました。Route::get('edit', 'ReviewController@edit');以上になります。
もしわかりづらい点、誤りなどなど、何かご指摘あれば、ぜひコメント下さい!
- 投稿日:2020-09-18T18:39:25+09:00
Laravelで半角英数字のみのバリデーション(簡単な方法)
Laravel6系で動作した方法
前提
- alpha
- alpha_num
- alpha_dash
↑ があるが、2バイト文字が考慮されていないので、全角が通ってしまう
ざっくり理解
初期のvalidatorロジックを上書きすればOK。
STEP1. App/Validators/CustomValidatorを作成する
App/Validators/CustomValidator.php
<?php namespace App\Validators; use Illuminate\Validation\Validator; class CustomValidator extends Validator { /** * alpah * * @param string $attribute * @param string $value * @return true */ public function validateAlpha($attribute, $value) { return (preg_match("/^[a-z]+$/i", $value)); } /** * alpah_dash * * @param string $attribute * @param string $value * @return true */ public function validateAlphaDash($attribute, $value) { return (preg_match("/^[a-z0-9_-]+$/i", $value)); } /** * alpah_num * * @param string $attribute * @param string $value * @return true */ public function validateAlphaNum($attribute, $value) { return (preg_match("/^[a-z0-9]+$/i", $value)); } }STEP.2 どこでも使えるようにする
どこでも使えるようにAppServiceProviderで、さきほど作ったValidatorを読み込む(初期のValidatorを上書き)。
app/Providers/AppServiceProvider.php
<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Validator; use App\Validators\CustomValidator; class AppServiceProvider extends ServiceProvider { /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { Validator::resolver(function ($translator, $data, $rules, $messages, $attributes) { return new CustomValidator($translator, $data, $rules, $messages, $attributes); }); } }STEP3.FormRequestなどで普通に使う
他のstring,integerなどと同じように
- alpha
- alpha_dash
- alpha_num
が使える。
今度は全角文字でエラーがでるようになる!public function rules() { return [ ... // 全角文字でエラーがでるようになる! 'password' => 'required|alpha_dash|min:8' ]; }参考
- 投稿日:2020-09-18T18:35:09+09:00
Laravel-AdminLTEのビューをカスタマイズする
環境
- jeroennoten/laravel-adminlte
- v3.4.4
やりたいこと
app/config/adminlte.php
(以降「設定ファイル」と記載)で制御できる範囲を超えてカスタマイズすることです。たとえば、ログイン画面における「ログイン状態を保持する」チェックボックスを消したい場合です。このケースでは設定ファイルで制御することができません。
方法
以下コマンドを実行しましょう。
$ php artisan adminlte:install --only=main_viewsこのコマンドを実行すると
resources/views/vendor/adminlte
内にビューファイルが作成されます。あとはこれらを編集して各ビューで読み込ませればOKです。補足
本パッケージの
README.md
にもこのやり方は書いてあります。ただ、Google検索経由だとphp artisan vendor:publish 〜
コマンドを用いる旨のWebページがけっこうヒットして紛らわしかったのでここに書き留めておきます。まあ最初から一次ソースを見ればよかったのですが。笑以上です。
- 投稿日:2020-09-18T16:59:54+09:00
Laravel id管理 パラメーターの{id}なんとなく振り当ててない?
パラメータ系の記事でよく見るこんなルーティング
Route::get('/post/{id}', 'TopController@detail');初心者のワイ:はぁ(0_0)/
脳死状態で記述していたので意味調べました!!!!
指定されたコントローラの関数(TopController@detail)で'Request $request'でリクエスト受け取ります。
このリクエストの中に$request->idというものが生成されています。それが{id}の正体だ!!!!
仮に{id}を{sushi}に変更します
Route::get('/post/{sushi}', 'TopController@detail');それでコントローラーでdd($request->id)で受け取れてるか確認
結果:nulldd($request->sushi)
結果:id表示これで{id}が$request->idであるということの裏付けができましたね!!!!
これが初投稿です!
何かお役に立てれば幸いです!
- 投稿日:2020-09-18T15:11:43+09:00
Laravel HTMLメールで画像を埋め込む (オフライン時やセキュア対応で使う)
この時代にオンラインでない事はあまりないので、普段htmlメールは、画像はURLリンクで済ませます。
Laravel HTMLメールで画像を埋め込む必要がある時のケースでは、例えば【想定ケース】
・オフラインでも画像を表示できるようにする。
・非公開領域に画像を入れている(完全会員サイトで画像さえも公開しない場合)こんなケースがあります。
この場合、メールのインライン画像は、URLではNGなのです。Laravelにはhtmlメール本文に画像を埋め込む便利な機能があります。
<body> ここに画像: <img src="{{ $message->embed($pathToImage) }}"> </body>あらかじめ用意されている、$message->embedにファイルパスを入れればOK!
超簡単です。参考ページ 【インライン添付】
https://readouble.com/laravel/6.x/ja/mail.html
- 投稿日:2020-09-18T15:08:40+09:00
【Laravel】クエリ実行前にMySQLのDBコネクションのPDOにsetAttributeする。
メモとして残します。
■やり方
下記の例では現在のDBコネクションに
PDO::ATTR_EMULATE_PREPARES
をtrueでセットしています。(\DB::connection()->getPdo())->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);■余談
laravelでは
PDO::ATTR_EMULATE_PREPARES
はデフォルトFalseですが、
LOAD DATA LOCAL INFILE
ステートメントを実行するときにエラーになってしまうため、PDO::ATTR_EMULATE_PREPARESをTrueにしてやる必要があります。
しかし、configのdatabase.phpで常にtrueにするのはさすがにちょっと、、、
と、なったなっため、瞬間的にTrueにすることで解決しました。
- 投稿日:2020-09-18T11:45:03+09:00
Laravel8 (laravel/ui)でのLogin機能の実装方法〜MyMemo
Laravle6.x/7.x/8.xのログイン実装コマンドの違いを見る
みなさんこんにちは
ジーズアカデミー 主席講師 山崎ですm(_ _)m
今回はLaravel8にアップデートされLogin画面作成(laravel/ui)を前バージョン同様で使用したい場合
の方法をMemoしておきます(初めてLaravel触る人はこっちが良いかも、、敷居が低い)。「jetstreamの人はこちらのリンク」
https://qiita.com/daisu_yamazaki/items/607ea579a374c4187562前提条件/検証環境
- LaravelでCRUDを作成した経験がある人
- Laravelの基本を理解している人
- 記事内容的には、Laravel6のAuthを使う場合の自分メモです。
- Laravel6/7=PHP 7.2.x(確認した環境)
- Laravel8 =PHP 7.3.x(確認した環境)
- EC2の場合:t2.small (メモリ2G以上必要 "laravel/ui"に必要なため,t2.microだとコケます)
- Node.js インストール済みであること
【 Laravel6/7/8でのログイン(laravel/ui)画面作成】
Laravel5.xでは「php artisan make:auth」コマンドで簡単にLOGIN機能を作成できていました。
※Laravel6.x以降 php artisann make:auth コマンドは無くなりました。
Laravel6 / Laravel7 / Laravel8 ログイン画面作成
1. laravel/uiをインストール
【要注意】Laravel7 が出たタイミング・・・だと思いますが、
laravel/ui コマンドにバージョンを付けないとエラーがでるようになりました!!!
6 or 7 or 8 に合わせて使い分けてください!!ターミナル#Laravel6.x 公式ではこちらに変わってました。 composer require laravel/ui:^1.0 --dev #laravel7の場合 composer require laravel/ui:^2.4 #laravel8の場合 composer require laravel/ui※Laravel6.x 公式
https://laravel.com/docs/6.x/frontend#introduction
※Laravel7.x 公式
https://laravel.com/docs/7.x/frontend#introduction
※Laravel8.x 公式(解説が無いようですが、Updating Dependenciesを参照)
https://laravel.com/docs/8.x/upgrade#updating-dependencies2. LOGIN機能&テーブル作成
ターミナルphp artisan ui vue --auth php artisan migrate3. FrontEndに必要なPackageをインストール
(Node/npmの使用が必要)ターミナルnpm install4. CSS/JSを作成ビルド
ターミナルnpm run dev
welcome R egister Login これでLaravel5/6/7どうようのLOGIN機能が実装できました!
「Laravel DB.com」 をやってます
Laravelをテーブル設計するだけでMigrationが作成できるツール
https://qiita.com/daisu_yamazaki/items/4e13ac43c20bcdedeb40
※是非こちらも見てください~。今回のLogin機能:参考「Laravel ドキュメント」
【ver6.x】https://laravel.com/docs/7.x/frontend#introduction
【ver7.x】https://laravel.com/docs/6.x/frontend#introduction
【ver8.x】https://laravel.com/docs/8.x/upgrade#updating-dependencies
※Laravel8.x 公式(2020/09/17段階では解説が無いようです...Updating Dependenciesを参照)以上
- 投稿日:2020-09-18T10:56:05+09:00
Laravel8で「laravel6/7」と一緒のlaravel/ui ログインを使う場合
Laravle6.x/7.x/8.xのログイン実装コマンドの違いを見る
みなさんこんにちは
ジーズアカデミー 主席講師 山崎ですm(_ _)m
今回はLaravel6(LTS)/7/8にアップデートされLogin画面作成に困った解決策をMemoしておきます。前提条件/検証環境
- LaravelでCRUDを作成した経験がある人
- Laravelの基本を理解している人
- 記事内容的には、Laravel6のAuthを使う場合の自分メモです。
- Laravel6/7=PHP 7.2.x(確認した環境)
- Laravel8 =PHP 7.3.x(確認した環境)
- EC2の場合:t2.small (メモリ2G以上必要 "laravel/ui"に必要なため,t2.microだとコケます)
- Node.js インストール済みであること
【 Laravel6/7/8でのログイン(laravel/ui)画面作成】
Laravel5.xでは「php artisan make:auth」コマンドで簡単にLOGIN機能を作成できていました。
Laravel6.x以降 php artisann make:auth は無くなりました。
Laravel6 / Laravel7 / Laravel8 ログイン画面作成
1. laravel/uiをインストール
【要注意】Laravel7 が出たタイミング・・・だと思いますが、
laravel/ui コマンドにバージョンを付けないとエラーがでるようになりました!!!
6 or 7 or 8 に合わせて使い分けてください!!ターミナル#Laravel6.x 公式ではこちらに変わってました。 composer require laravel/ui:^1.0 --dev #laravel7の場合 composer require laravel/ui:^2.4 #laravel8の場合 composer require laravel/ui※Laravel6.x 公式
https://laravel.com/docs/6.x/frontend#introduction
※Laravel7.x 公式
https://laravel.com/docs/7.x/frontend#introduction
※Laravel8.x 公式(解説が無いようですが、Updating Dependenciesを参照)
https://laravel.com/docs/8.x/upgrade#updating-dependencies2. LOGIN機能&テーブル作成
ターミナルphp artisan ui vue --auth php artisan migrate3. FrontEndに必要なPackageをインストール
(Node/npmの使用が必要)ターミナルnpm install4. CSS/JSを作成ビルド
ターミナルnpm run devこれでLaravel5バージョンからのLOGIN機能が実装できました!
Login機能:参考「Laravel ドキュメント」
【ver6.x】https://laravel.com/docs/7.x/frontend#introduction
【ver7.x】https://laravel.com/docs/6.x/frontend#introduction
【ver8.x】https://laravel.com/docs/8.x/upgrade#updating-dependencies
※Laravel8.x 公式(2020/09/17段階では解説が無いようです...Updating Dependenciesを参照)★研究開発「Laravel DB.com」 を運用中
Laravelをテーブル設計するだけでCRUDが作成できるツール
https://qiita.com/daisu_yamazaki/items/4e13ac43c20bcdedeb40
※是非応援しください。以上
- 投稿日:2020-09-18T00:38:50+09:00
Laravel 設定ファイルの内容を呼び出す
目的
- Laravelの設定ファイルへの追記方法と設定ファイルの読み込み方法をまとめる
- ※本説明でいう設定ファイルとは.envファイルではなく、
アプリ名ディレクトリ/config
直下にあるファイルを指す実施環境
- ハードウェア環境
項目 情報 OS macOS Catalina(10.15.5) ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) プロセッサ 2GHzクアッドコア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アプリが作成されていること。
前提情報
- 筆者は下記の記事で作成したアプリを用いて本記事の動作を確認する。
- 下記に本記事を記載する際に検証で使用したソースコードのリモートリポジトリのリンクを下記に記載する。
読後感
アプリ名ディレクトリ/config
直下の設定ファイルに独自の設定を追記することができる。アプリ名ディレクトリ/config
直下の設定ファイルに記載されている値を読み込み表示することができる。概要
- 設定ファイルの作成と記載
- ルーティング情報の追記
- コントローラファイルの作成と記載
- ビューファイルの作成と記載
- 確認
詳細
設定ファイルの作成と記載
アプリ名ディレクトリで下記コマンドを実行して設定ファイルを作成する。
$ vi config_test.php開いたファイルに下記の内容を追記し保存して閉じる。
アプリ名ディレクトリ/config/config_test.php<?php return [ # 文字列の設定 'config_str' => 'これは設定ファイルで設定された文字列です。', ] ?>ルーティング情報の追記
アプリ名ディレクトリで下記コマンドを実行してルーティングファイルを開く。
$ vi routes/web.php下記の内容を追記する。
アプリ名ディレクトリ/routes/web.phpRoute::get('/config_check', 'ConfigCheckController@config_check')->name('config_check');コントローラファイルの作成と記載
アプリ名ディレクトリで下記コマンドを実行してコントローラファイルを作成する。
$ php artisan make:controller ConfigCheckControllerアプリ名ディレクトリで下記コマンドを実行してただいま作成したコントローラファイルを開く。
$ vi app/Http/Controllers/ConfigCheckController.php下記の様に記載を行う。
アプリ名ディレクトリ/app/Http/Controllers/ConfigCheckController.php<?php namespace App\Http\Controllers; use Illuminate\Http\Request; // 下記を追記する use Illuminate\Support\Facades\Config; class ConfigCheckController extends Controller { // 下記を追記する public function config_check() { // アプリ名ディレクトリ/config直下に存在するconfig_test.phpファイルで定義されているconfig_strの文字列を$strに格納する処理 $str = Config::get('config_test.config_str'); return view('checks.config_check', [ 'str' => $str, ]); } // 上記までを追記する }ビューファイルの作成と記載
アプリ名ディレクトリで下記コマンドを実行してビューファイルを格納するディレクトリを作成する。
$ mkdir resources/views/checksアプリ名ディレクトリで下記コマンドを実行してビューファイルを作成する。
$ vi resources/views/checks/config_check.blade.php開いたビューファイルに下記の内容を記載する。
アプリ名ディレクトリ/resources/views/checks/config_check.blade.php{{ $str }}確認
アプリ名ディレクトリで下記コマンドを実行してローカルサーバを起動する。
$ php artisan serveブラウザで下記にアクセスする。(Authの認証機能が付与されているLaravelアプリで下記にアクセスする場合、ログインが必要になる場合がある。)
下記の様に、設定ファイルに記載した内容がブラウザ上で表示されていれば作業完了である。
*画像
参考文献