探検


【PHP】Laravel【フレームワーク】 Part.12

■ このスレッドは過去ログ倉庫に格納されています
2022/08/31(水) 18:53:51.77ID:???
Laravel
ウェブ職人のためのPHPフレームワーク

本家
https://laravel.com/

git
https://github.com/laravel

動画チュートリアル(英語)
https://laracasts.com/

※前スレ
【PHP】Laravel【フレームワーク】 Part.9
https://medaka.5ch.net/test/read.cgi/php/1636499781/
【PHP】Laravel【フレームワーク】 Part.10
https://medaka.5ch.net/test/read.cgi/php/1647325775/
【PHP】Laravel【フレームワーク】 Part.11
https://medaka.5ch.net/test/read.cgi/php/1658553311/
386nobodyさん
垢版 |
2023/03/02(木) 14:35:37.21ID:???
いくらでもいるだろ
387nobodyさん
垢版 |
2023/03/02(木) 14:59:52.77ID:???
Laravelでvue使っても大概そうなるやろ
388nobodyさん
垢版 |
2023/03/02(木) 18:17:19.07ID:???
>>387
それはLaravelにフロントもバックエンドも任せてね?
389nobodyさん
垢版 |
2023/03/02(木) 20:45:55.82ID:???
そいやそうだね
390nobodyさん
垢版 |
2023/03/02(木) 21:53:27.63ID:???
今のプロジェクトはSPAで一応Laravelで一つだけのページは返すけど
基本はAPIの為に使っている
フロントはvueでやってる
391nobodyさん
垢版 |
2023/03/03(金) 09:49:42.71ID:???
やっぱLaravel使いはvueが多いよね
ReactやAngulerよりも使いやすいのかな
392nobodyさん
垢版 |
2023/03/03(金) 09:52:59.21ID:???
皆がvue使ってるから選択している安直な理由だと思う
393nobodyさん
垢版 |
2023/03/03(金) 12:27:29.04ID:???
ららぼ〜、実際に使ってみようかと思っているんだが、メジャーバージョン
アップが頻繁すぎて、ちょっと怖いでござるよ。
先輩諸氏はそのへんどうしているのござるか?
394nobodyさん
垢版 |
2023/03/03(金) 12:50:24.36ID:???
Laravelは今でも開発が続けられておるでござる。新しい機能や改善を含んだメジャーバージョンアップが頻繁に行われているのじゃ。
しかし、アップデートすることで新しい機能や改善を取り入れることができるのじゃから、先輩方はちゃんとバージョンアップを行っているのじゃ。
ただし、アップデートにはリスクもあるから、事前にテストを行って問題が起きないか確認することが大切じゃ。
LaravelにはLTS(Long-Term Support)版もあって、安定したバージョンを選ぶこともできるのじゃ。
だから、プロジェクトによっては新しい機能を必要とせず、安定性を重視する場合はLTS版を使うこともできるのじゃ。
でも、新しい機能を取り入れたい場合は、定期的にバージョンアップを行って最新の機能を活用することも大切じゃ。
395nobodyさん
垢版 |
2023/03/03(金) 12:56:47.19ID:???
LTSなんてもうねーよw
396nobodyさん
垢版 |
2023/03/03(金) 12:58:55.46ID:???
>>395
Taylor OtwellがLTS版を仄めかしだしたから多分復活する
397nobodyさん
垢版 |
2023/03/03(金) 14:08:33.98ID:???
問題はどれに復活するかだな
今後のバージョンに復活するのか、既存のバージョンになるのか
個人的には8をLTSにしてほしいが
398nobodyさん
垢版 |
2023/03/03(金) 19:03:15.96ID:???
復活するなら次の11か最新の10じゃね?
過去のバージョンは流石に無さそう
399nobodyさん
垢版 |
2023/03/13(月) 11:55:32.17ID:???
質問書こうとしたらChatGPTで解決してしまったのですが、一応書いときます。。(以下質問)

ちょっとルーティングで出来る方法があるかが分からないので、教えてください
・web.phpでresourceをgroupの中に入れたい
・resourceのeditで(URLで)idを指定して表示させたい。例「customers/1/edit」
・しかしcontrollerのfunctionの引数にクラスを指定している(idから自動的にモデルがfindされるLaravelの仕様を利用)

<変更前>
[web.php]
Route::get('customers/change', 'Customer\CustomerController@change'); // こういうのがいっぱいあってresourceもろともgroupに入れたい
Route::resource('customers', 'Customer\CustomerController');

[CustomerController]
public function edit(Customer $customer){~~諸々の処理~~}

<こうしたい>
[web.php]
Route::group(['prefix' => 'customers', 'as' => 'customers.'], function () {
Route::get('change', 'Customer\CustomerController@change');
Route::resource('/', 'Customer\CustomerController');
}

[CustomerController]
public function edit(Customer $customer){~~諸々の処理~~}

ですが、後者だとURL「customers/1/edit」となったとき、not foundになります。
「customers」や「customers/create」等は正常に表示されます。
php artisan route:listでは
「customers/{customer}/edit」が「customers/{}/edit」になってしまいます。
groupの外にresourceの記述を出せば解決するのですが、
何かありそうなので、もし知っていたら教えてもらえますでしょうか。
400nobodyさん
垢版 |
2023/03/13(月) 11:55:55.29ID:???
以下ChatGPTの回答。idをcustomerにしたら(cotrollerも変更なしで)OKでした。

問題の原因は、Route::resource で指定されたルーティングパラメーター名が customer であるためです。
Laravel は、Route::resource で自動的にルーティングパラメーターを id に設定します。
したがって、ルーティングパラメーター名を id に変更すれば、期待通りの動作が可能になります。

以下は、修正したコードです。

Route::group(['prefix' => 'customers', 'as' => 'customers.'], function () {
Route::get('change', 'Customer\CustomerController@change');
Route::resource('/', 'Customer\CustomerController')->parameters(['' => 'id']);
});

[CustomerController]
public function edit(Customer $id){~~諸々の処理~~}

Route::resource の第二引数に parameters メソッドを使用して、ルーティングパラメーター名を id に変更します。
そして、edit メソッドの引数も $id に変更します。

これで、URL customers/1/edit での編集ページへのアクセスが可能になります。
401nobodyさん
垢版 |
2023/03/13(月) 14:12:38.36ID:???
長いからChatGPTに要約させてくれるか
402nobodyさん
垢版 |
2023/03/13(月) 16:04:12.97ID:???
「絶対にガンダムに例えて要約しろ」って言ったのに例えてくれなかったです。
しかも微妙にズレてる気はしなくもない。

↓回答
質問者がLaravelでルーティングを設定する上で、group化されたresourceルートでidを指定してeditアクションを呼び出したいが、
URLにおいてidを指定するとnot foundになってしまうという問題が発生しています。
これは、ルーティングパラメーター名がcustomerであるために起こる問題であり、idに変更することで解決できます。
具体的には、Route::resourceの第二引数にparametersメソッドを使ってidを指定し、
editメソッドの引数も$idに変更する必要があります。
これにより、URL customers/1/edit での編集ページへのアクセスが可能になります。
403nobodyさん
垢版 |
2023/03/13(月) 16:22:22.99ID:???
>>399の質問投げたらCahtGPTが答えてくれたの!?
それは凄いな。ものすごく専門的な質問じゃん
404nobodyさん
垢版 |
2023/03/21(火) 00:16:26.53ID:???
GPTの登場でweb屋で食ってたのもいよいよおしまいか
プログラマ続けても安い扱い受けるだけだから別の職に就くか
405nobodyさん
垢版 |
2023/03/21(火) 09:12:15.53ID:???
どうぞご自由になさってください
406nobodyさん
垢版 |
2023/03/21(火) 10:15:34.81ID:???
今までWEB屋で食ってた人の単価
chatGPTを使いこなしてWEB屋と同じレベルのものを生成する人の単価

前者のほうが圧倒的に安いからまだ大丈夫
407nobodyさん
垢版 |
2023/03/21(火) 10:31:18.76ID:???
「ChatGPT使っていいから単価1/10でやって」
「ChatGPT使っていいから今日中におねがい」
「ChatGPT使っていいから検収やっといて」
408nobodyさん
垢版 |
2023/03/21(火) 10:34:13.72ID:???
「ChatGPTが正しいかどうかをテストする要員を追加したく」
409nobodyさん
垢版 |
2023/03/21(火) 10:42:15.68ID:???
で、不具合が出たとき、ChatGPTのせいだからしかたないね〜とはならず、
担当者のせいになる
410nobodyさん
垢版 |
2023/03/21(火) 11:19:41.05ID:???
ChatGPTが1から10までやってくれるわけじゃないのに
411nobodyさん
垢版 |
2023/03/21(火) 11:58:36.70ID:???
今はまだ結構間違ってるからねえ
でもそのうちフレームワーク自体がそれらを利用するようになるかもね
いまのartisanコマンドが進化するイメージ
412nobodyさん
垢版 |
2023/03/21(火) 12:38:20.84ID:???
ちゃんと要件を欠けば、コードが生成されるみたいな
でも、アホな蔵相手だと要件がいつまで経っても決まらないし、二転三転する
から、永遠にリリースできないのは今と同じかも
413nobodyさん
垢版 |
2023/03/22(水) 00:46:13.10ID:???
windows環境で
laravelをxamppで実行できる環境作ったが当初動かなかった
composerをインストールし直したりした

結論はhtdocsの中に作れって事だった

しかし今度はzip展開できないとエラーが出たので
検索してphp.ini内のextension zipのコメントアウトを外して読めるようにしろとあったので
直したらまあうまく行った、らしい

とこんな出来の悪い自分でも出来るっぽいので
ChatGPTならもっとサクサク作るのか
414nobodyさん
垢版 |
2023/03/22(水) 01:44:20.35ID:???
XAMPPという初手からして間違ってるからなぁ
AI云々以前じゃね?
415nobodyさん
垢版 |
2023/03/22(水) 07:50:06.06ID:???
xamppなんてまだ使ってる人いたのか
416nobodyさん
垢版 |
2023/03/22(水) 08:08:04.46ID:???
Udemyとかのコースはxammpだからむしろ多いんじゃないか
417nobodyさん
垢版 |
2023/03/22(水) 12:13:54.04ID:???
そうなるとゼロからLaravelだけ学ぶ感じか
短期的には仕事を貰えるかもしれないが基盤技術を学ばないなら技術者としての寿命は短そうだな
418nobodyさん
垢版 |
2023/03/22(水) 12:23:53.76ID:???
公式ドキュメントをChatGPTに学習させればLaravelの開発できるかもね
419nobodyさん
垢版 |
2023/03/22(水) 12:24:57.09ID:???
それくらいならもうやってくれるぞ
420nobodyさん
垢版 |
2023/03/22(水) 16:05:31.67ID:???
Windowsの人はせめてWSL2は触れないと厳しかろう
仕事でxamppってフレーズが口から出てくる人いたら、
それはもう危険よね
421nobodyさん
垢版 |
2023/03/22(水) 20:50:39.02ID:???
今日発売のLaravel10の本買った
そこでもSail説明してたから、これを機会にXamppは卒業するわ
422nobodyさん
垢版 |
2023/03/23(木) 11:18:48.83ID:???
ちんちん!シュッシュッ!シュッ!!
423nobodyさん
垢版 |
2023/03/31(金) 16:22:59.50ID:???
今まで6使ってて10の勉強してるんだが、あまり変わらないんだな
強いて言えばBladeコンポーネントぐらいか
これ使わなくてもビューは作れるし、少しずつ移行できそうだ
424nobodyさん
垢版 |
2023/03/31(金) 16:34:08.60ID:???
Laravelってfulljoin無いの?
探しても見つからない…
誰か助けて…
425nobodyさん
垢版 |
2023/04/02(日) 00:10:55.99ID:???
分からんなら生SQL投げればええやん
426nobodyさん
垢版 |
2023/04/02(日) 19:05:28.53ID:i1/+p30I
bingに
「aravel breezeに2段階認証を追加する方法を詳細に説明せよ。」
と言ったら、

Laravel Breezeには2段階認証機能はついていないようです1。
しかし、Laravel Jetstreamをインストールすると、
ログイン、新規登録、メール検証、2段階認証、セッション管理、
APIサポート(Laravel Sanctum)、チーム管理などが提供されます2。
Laravel Jetstreamの導入方法は以下のQiitaの記事を参考にしてください2。
詳細情報:
1. bing.com
2. qiita.com
3. blog.capilano-fw.com
4. qiita.com
5. reffect.co.jp
6. prograshi.com
7. biz.addisteria.com
8. biz.addisteria.com
9. qiita.com
10. bing.com
11. webopixel.net
+8 その他

2段階認証するためには「Laravel Jetstream」をインストールするのが無難ですか?
427nobodyさん
垢版 |
2023/04/02(日) 19:12:52.41ID:???
環境作って要件満たすか検証すりゃいいじゃん
嫌なら自前で作ればいい
428nobodyさん
垢版 |
2023/04/02(日) 20:10:46.01ID:???
AIは結構嘘つくから自分で学ぶのが一番だよ
429nobodyさん
垢版 |
2023/04/02(日) 23:04:14.10ID:???
composerのパッケージ検索で二段階認証ぽいのは結構あるけど
要件に合ってなきゃ意味無いしね
Google認証システムを使う奴なんかはググレば直ぐ見つかるし
SMSでパス送る奴よりは作りやすそう
430nobodyさん
垢版 |
2023/04/02(日) 23:49:10.20ID:???
sailってphpとcomposerがホストマシンに無いと動かないポンコツ仕様はなんとかならんのか
431nobodyさん
垢版 |
2023/04/03(月) 00:06:33.00ID:???
sail、バージョン指定できないのが辛い
常に最新版で開発したい人って多くないだろ
432nobodyさん
垢版 |
2023/04/03(月) 16:22:19.65ID:???
ぴえん🥺
433nobodyさん
垢版 |
2023/04/04(火) 06:58:57.66ID:???
ちんちんシュッシュッ!!シュッ!
434nobodyさん
垢版 |
2023/04/06(木) 23:27:15.15ID:???
10で編集・更新について教えてください。

$post = Post::find(1);
$post->name = $request->name;
$post->address = $request->address;
$post->comment = $request->comment;
$post->save();

こんな感じで書けば更新はされるのですが、
更新したいカラムを全て書かなければいけないのでしょうか?
カラム数が多いと手間ですが、省略できる書き方があれば教えてください。
435nobodyさん
垢版 |
2023/04/07(金) 02:19:17.92ID:???
ぺたんこおっぱい
ぽっこりおなか
つるつるわれめ
436nobodyさん
垢版 |
2023/04/07(金) 03:48:12.04ID:???
>>434
モデル側でfillable設定してから
$post->update($request->all());
これでできるけど
フォームリクエスト使ってこうした方が良い
$post->update($request->validated());
437nobodyさん
垢版 |
2023/04/07(金) 08:44:45.14ID:???
ありがとうございます。このやり方でできました。

$post = Post::find(1);
$post->fill($request->all())->save();
438nobodyさん
垢版 |
2023/04/07(金) 16:24:13.13ID:???
fillable設定ってどれだけカラム数があってもするべきですか?
439nobodyさん
垢版 |
2023/04/07(金) 18:12:11.12ID:???
>>438
fillableがなぜ存在するかを理解してるなら
100カラムだろうが1000カラムだろうが必要ならするべきって結論に至るはずよ

他の方法でguardedに空配列って手もあるけどお勧めしない
> すべての属性を一括割り当て可能にしたい場合は、モデルの$guardedプロパティを空の配列として定義します。
> モデルの保護を解除する場合は、Eloquentのfill、create、およびupdateメソッドに渡たす配列へいちいち特別な注意を払う必要があります。
440nobodyさん
垢版 |
2023/04/07(金) 20:59:50.00ID:???
guardedにidだけ指定するのはよくするけど
441nobodyさん
垢版 |
2023/04/07(金) 22:22:37.81ID:???
皆さんエディタって何使ってます?
442nobodyさん
垢版 |
2023/04/07(金) 22:24:26.57ID:???
そらVSCodeよ
443nobodyさん
垢版 |
2023/04/07(金) 22:29:20.31ID:???
phpstorm勢は少ないのか・・・
444nobodyさん
垢版 |
2023/04/08(土) 02:59:28.50ID:???
昔は使ってたけど、今となっては…
445nobodyさん
垢版 |
2023/04/08(土) 16:55:18.30ID:???
Laravelに、CakePHPでいうCounterCacheのような機能ってありますかね?
関連するテーブルが追加されたらカウントアップするみたいな

調べても単純なカウントアップはあるのですが、
自動カウントはなさそうなので困っています。
446nobodyさん
垢版 |
2023/04/08(土) 17:46:58.76ID:???
>>445
CounterCacheがどんな機能なのかわからないけどオブザーバー使って実現できるんじゃないかな
447nobodyさん
垢版 |
2023/04/09(日) 12:06:15.20ID:???
>>446
オブザーバーで、save/update後に登録数をcountするようにします。
単純な方法ですが、既存のCounterCacheも同じような仕組みなので
このやり方がベターなんだと思います。
448nobodyさん
垢版 |
2023/04/10(月) 12:32:43.55ID:???
phpstormって何でlaravelのサポート削除したの?
449nobodyさん
垢版 |
2023/04/10(月) 17:09:26.30ID:???
マイグレーションのintegerにZEROFILLを指定したい場合、どう書けばいいのでしょうか?
450nobodyさん
垢版 |
2023/04/10(月) 19:58:37.10ID:???
>>449
無理やりやればできるけど基本的にはやらない方がいい
理由はMySQLの機能なのでDBをpostgressとか他のストレージエンジンに変更した場合
マイグレーションでエラーになるかその機能が付与されない
実現する場合はモデルでその機能を実装する
451nobodyさん
垢版 |
2023/04/11(火) 09:13:08.76ID:???
>>450
そうですか。それならstringとかcharにして文字列として扱います。
452nobodyさん
垢版 |
2023/04/11(火) 12:12:43.05ID:???
zerofillでググったらmysql8.0からintのzerofillが非推奨になってるみたいだね
453nobodyさん
垢版 |
2023/04/11(火) 12:33:45.57ID:???
大体はアプリでやる方がキレイだしね
454nobodyさん
垢版 |
2023/04/11(火) 17:41:19.56ID:???
例えば外部APIやローカルファイルがデータソースだった場合で、Modelの機能だけを使いたい場合ってどうしてます?
使いたいのはキャスタ、アクセサ、ミューテタ、状態管理辺りの機能
良い方法が無くて自作したんだけどベストプラクティスがあればそっちに変えたいんです
455nobodyさん
垢版 |
2023/04/11(火) 18:25:48.79ID:???
それはLaravelのいうところのModelにはならん気がするけど、それをどこに置くかってこと?
456nobodyさん
垢版 |
2023/04/11(火) 18:38:57.42ID:???
機能としてはDTOが一番近しいんだけど
Modelと同じ使用感でattributes、fillable、hiddenとか設定できたり
既に資産として存在するカスタムキャスタを使ったりしたい
457nobodyさん
垢版 |
2023/04/14(金) 01:35:30.50ID:O955HWXC
社内データを元に原価予測等の傾向分析を含むWEBサイトを開発するとしたら
データ分析部分はPythonでやらせるとして、
WEBはPHPかLaravelで分析ロジックはexe化したpythonプログラムをPHPのexec関数なんかで呼び出すか、
またはWEBをDjangoで分析ロジックも含めてコーディングするか、
あたりの2案その他を考えていますがどっちが良いか悩みます
開発やメンテ容易性、レスポンスなんかで考えるとどれになるのかなと
AI分析を絡めたWEBサイトの案件は多くなりそうですし、フリーのフレームワークで安価に構築したい要求もありますしね
458nobodyさん
垢版 |
2023/04/14(金) 01:38:40.97ID:???
ちんちん!シユシュッシュッ!
459nobodyさん
垢版 |
2023/04/14(金) 07:48:46.99ID:???
データ分析時間がどのくらいか知らないけど、時間かかるようならバッチ処理したデータ分析結果をWEBで見るやり方かなあ
460nobodyさん
垢版 |
2023/04/14(金) 08:48:59.56ID:???
フォームを検索するときに、コントローラで

$post = Post::query();
if ($request->query('name')) {
$post->where('name', $request->query('name'));
}
$result = $post->get();

みたいな書き方をしているのですが、
フォームの項目が増えるほどIFも増えて冗長化します。
良いライブラリとかコンポーザのパッケージはないでしょうか?
461nobodyさん
垢版 |
2023/04/14(金) 12:57:11.00ID:???
>>460
一番雑で簡単な返答はFormRequestでバリデーション入れて
Post::query()->where($request->validated())->get()
なんだけどこれは実践だとクソの役にも立たないのでやっちゃダメ
自分の実装を簡単に書くと例えば下記の方法

ModelにScope作る
public function scopeSearch(Builder $builder,array $params ):Builder
{
$builder = $this->scopeSearchName($builder,data_get($params,'name'));
return $builder ;
}

public function scopeSearchName(Builder $builder, $name ):Builder
{
if( blank($name) ) {
return $builder ;
}
return $builder->where('name',$name ) ;
}

コントローラーで呼び出す
Post::search($request->validated())->get()

個別に使うなら
Post::searchName($request->query('name'))->get()
462nobodyさん
垢版 |
2023/04/14(金) 13:38:42.25ID:???
>>461
モデルごとにこれを書くなら、IFで書く場合と大差ないことないですか?

あと、$request->validated()ってバリデーション通すのはなぜですか?
検索でバリデーションをすると、requiredでひっかかりそうですが
463nobodyさん
垢版 |
2023/04/14(金) 14:51:00.39ID:???
>>462
> モデルごとにこれを書くなら、IFで書く場合と大差ないことないですか?
「IFで書く場合」ではなく「コントローラーに書く場合」として回答すると
大差ないか?という事であればベストプラクティスとバッドプラクティスの差がある
コントローラは単一の責任だけを持たないといけないのでモデルの検索ロジックがコントローラーに書かれていることがおかしい

以下ChatGPTの回答

検索ロジックをコントローラに書いてしまうと、コントローラが複雑になり、保守性が低下する可能性があります。
以下に詳しく説明します。

1. コードの可読性が低下する
コントローラに検索ロジックを含めると、コントローラの役割が複雑になり、コントローラのメソッドが大きくなり、可読性が低下する可能性があります。
コントローラの役割が明確でなくなるため、コントローラの修正や保守が困難になる可能性があります。

2. テストが困難になる
コントローラに検索ロジックを含めると、コントローラのテストが困難になる可能性があります。
コントローラに含まれる検索ロジックは、外部の依存関係を持つ可能性があり、依存関係をモック化する必要があるため、テストコードが複雑になる可能性があります。

3. 再利用性が低下する
コントローラに検索ロジックを含めると、再利用性が低下する可能性があります。
コントローラは、Webアプリケーションの特定の機能を担当するために設計されており、その機能に特化した責任を持つように設計されるべきです。
検索ロジックがコントローラに含まれると、コントローラが特定の機能に依存してしまうため、他の機能で再利用することが困難になる可能性があります。

以上の理由から、検索ロジックをコントローラに含めず、別の場所に分離することをお勧めします。
例えば、リポジトリパターンを使用して、データベースからデータを検索する責任を持つクラスを作成し、コントローラからはそのクラスを呼び出すようにすることができます。
これにより、コントローラは単一の責任を持ち、コードの保守性が向上し、テストの容易性や再利用性が高まります。
464nobodyさん
垢版 |
2023/04/14(金) 15:04:32.87ID:???
>>462
続き
> あと、$request->validated()ってバリデーション通すのはなぜですか?
入力値の操作ができるので入力値に関する責任をコントローラーから切り離せる
https://readouble.com/laravel/9.x/ja/validation.html#preparing-input-for-validation
要するに検索項目に入れたくないパラメータやら値を省くことができる

> 検索でバリデーションをすると、requiredでひっかかりそうですが
nullableを使えばよい
465nobodyさん
垢版 |
2023/04/14(金) 15:15:47.82ID:???
>>462
一応ChatGPTの回答

検索リクエストの値をバリデーションする理由は、以下のようなものがあります。

1. 検索クエリの安全性を確保するため
検索クエリに含まれる値が適切にバリデーションされていない場合、悪意のあるユーザーによってSQLインジェクション攻撃などのセキュリティ上の問題が引き起こされる可能性があります。
バリデーションを行うことで、入力された値が予想されるフォーマットに一致しているかどうかを確認することができ、攻撃を防ぐことができます。

2. 検索結果の品質を向上するため
検索クエリに含まれる値が適切にバリデーションされていない場合、意図しない検索結果が表示される可能性があります。
たとえば、数字のみを入力することが想定されているフィールドに文字列が入力された場合、検索結果に誤りが生じる可能性があります。
バリデーションを行うことで、検索クエリが適切に構成されているかどうかを確認することができ、正確な検索結果を得ることができます。

3. UXを向上するため
検索リクエストのバリデーションにより、ユーザーが誤ったクエリを送信してしまった場合にエラーメッセージを表示し、適切な入力を促すことができます。
これにより、ユーザーのUXが向上し、検索エラーを減らすことができます。

以上のような理由から、検索リクエストの値をバリデーションすることが重要となります。
466460
垢版 |
2023/04/14(金) 16:32:57.48ID:???
確かにコントローラに検索ロジックを書くと複雑になりますね。
管理画面用のコントローラと公開画面用のコントローラで
似たようなソースを書いてるので余計に無駄です。

検索バリデーションについては思うところもありますが、
とりあえずベストプラティクスに近づけたいので
出来る範囲で対応したいと思います。
467460
垢版 |
2023/04/14(金) 17:27:24.43ID:???
すみません、スコープ作った場合でも、

public function scopeSearchName($query, $name){
 if ($name !== null) {
  return $query->where('name', $name);
 }
}

みたいにIFで判定するのは仕方ないんですかね?

また、検索項目が複数ある場合、

User::searhName($request->query('name'))->searhType($request->query('type'))->searhBirth($request->query('birth'))

みたいにどんどん長くなるのも仕方ないんですかね?
468nobodyさん
垢版 |
2023/04/14(金) 17:53:45.98ID:???
>>467
> IFで判定するのは仕方ないんですかね?
これって値が空の場合検索条件追加しないでクエリビルダを戻すって事やってるから
値の有無関係なく検索する必要があるなら(nullを検索したい場合には)条件分岐しなくとも良い
というより何をどう検索したいかによってScope内の処理は変わるから何とも言えない

> 検索項目が複数ある場合
> どんどん長くなるのも仕方ないんですかね?
コントローラー内からシンプルに呼び出せる様にscopeSearchを書いたつもりなんだけど

public function scopeSearch(Builder $builder,array $params ):Builder
{
$builder = $this->scopeSearchName($builder,data_get($params,'name'));
$builder = $this->scopeSearchType($builder,data_get($params,'type'));
$builder = $this->scopeSearchBirth($builder,data_get($params,'birth'));
return $builder ;
}
469460
垢版 |
2023/04/14(金) 17:58:44.88ID:???
とりあえずスコープの勉強が足りないことはわかりました
色々と試行錯誤してやってみます。ありがとうございました
470nobodyさん
垢版 |
2023/04/16(日) 02:39:49.01ID:???
クエリビルダでwhen()があるので
if()で条件判定して追加するよりはスマートな気がする
データが入ってないと検索条件が増えないようなものには俺の場合はwhen()で対処している
良くある検索条件が複数あって未入力はパスのようなやつね
471460
垢版 |
2023/04/16(日) 09:50:36.55ID:???
>>470
どういう書き方になるのでしょうか?
>>468の書き方を採用しているのですが、

if (data_get($params,'name') !== null) {
$builder = $this->scopeSearchName($builder,data_get($params,'name'));
}

な感じでIF入れてます。IF入れないと$paramsに存在しない場合エラーになるので。
472nobodyさん
垢版 |
2023/04/21(金) 18:06:14.14ID:eZ0hTZy/
APIサーバーとしてLaravelを使用してるけど、Laravel Sanctum良いね
認証処理が一瞬で構築できる
473nobodyさん
垢版 |
2023/04/23(日) 18:55:40.49ID:???
オブジェクトのことよくわかってなかったんだが、

$user = User::find(1);
$old_user = $user;
$user->update($request->all());

ってすると、$old_userの中身が更新済みの値に変わるんだな。
474nobodyさん
垢版 |
2023/04/23(日) 22:30:11.53ID:???
>>473
clone を使わないとダメあるよ
475nobodyさん
垢版 |
2023/04/23(日) 22:59:19.23ID:CuNCCdp5
ミュータブル、イミュータブルという言葉で調べてみると良いかも
476nobodyさん
垢版 |
2023/04/23(日) 23:14:34.79ID:???
>>474
$user = User::find(1);
$old_user = clone $user;

こうするのね。勉強になった
477nobodyさん
垢版 |
2023/04/24(月) 02:02:01.12ID:???
というかオブジェクトだからとかあまり関係ない気はするけど、大丈夫ならいっか
478nobodyさん
垢版 |
2023/04/26(水) 07:28:13.95ID:???
変数の命名規則ってどうしてる?
キャメルケースにしろという説明もあれば
スネークケースの方がいいというのもあるけど。
自分はメソッドと区別するためにスネークケースにしてる
479nobodyさん
垢版 |
2023/04/26(水) 08:44:49.28ID:???
>>478
> キャメルケースにしろという説明
これってどこにある?見たことない
480nobodyさん
垢版 |
2023/04/26(水) 10:40:10.16ID:???
>>479
「laravel ベストプラクティス」でググった一番上のページに書かれてますよ
481nobodyさん
垢版 |
2023/04/26(水) 10:58:43.96ID:???
>>478
その説明だとPSRに従った上で変数はキャメルケースを推奨してるからキャメルケースでいいんじゃないかな
自分としてはメソッド名、クラス名と同じ方がキャメルケースのがやりやすいかな
482nobodyさん
垢版 |
2023/04/26(水) 11:06:07.79ID:???
>>481
公式もキャメルケースなんですよね。
ビューでforeachするときに

@foreach ($userProfiles as $profile)
$profile->name
@endforeach

みたいに書くのはどうかと思った(テーブル名はuer_profles、モデルはUserProfileなのに)
のですが、PSRや公式に従うならキャメルケースの方が良いですかね
483nobodyさん
垢版 |
2023/04/26(水) 11:13:39.59ID:???
あと、テーブルのカラムはfirst_nameみたいにスネークケースにするのに、
変数はキャメルケースだから、findの値を比較するときに
($firstName === $user->first_name)
となるので、おかしくないか?とも思いました。
484nobodyさん
垢版 |
2023/04/26(水) 14:17:15.08ID:O+wKXsaI
>>482
特にそれで違和感ないけどね
485nobodyさん
垢版 |
2023/04/26(水) 14:28:06.87ID:???
カラム名ってわかるからまあいいかな、って感じ
逆に他に変えるとその方が色々おかしくなりそう
486nobodyさん
垢版 |
2023/04/26(水) 21:33:35.41ID:???
$user = User::with(['posts'])->first();
$user_id = $user->id;

ってコントローラーでしたら駄目なんですか?
vscodeさんがUndefined propertyってエラー出してくるんですが
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況