質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

1回答

4434閲覧

Laravelのsoftdelete使用時のコントローラーメソッドの良い書き方

ttakahashi2013

総合スコア26

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2017/06/13 01:33

今までlaravelの機能を使い、コントローラーを扱う際、下記のようにモデルを直接セットして使用していました。

php

1public function show(Staff $staff) 2{ 3 return $this->makeShowView($staff); 4}

ですが、softdeleteを使った際、モデルをセットしようとすると、セットできなかったため、
下記のようにコードを変更いたしました。

php

1public function show(int $staffId) 2{ 3 $staff = Staff::withTrashed()->findOrFail($staffId); 4 return $this->makeShowView($staff); 5}

これで動きはするのですが、
正直なところ、あまり良い書き方ではなさそうなため、できれば最初のようにモデルをセットしたいのですが、良い解決方法はないでしょうか。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

モデルの注入の際に削除済みのものは取得できず、注入に失敗し404となります。これは正しい挙動なので、ここに手を加えるのではなく、削除済みのものを特例として注入できる処理を書くと良いです。

php

1public function show(Staff $staff) { 2 return $this->makeShowView($staff); 3} 4 5public function showDeleted(int $staff_id) { 6 // 削除済みのものを取得 7 $staff = Staff::onlyTrashed()->findOrFail($staff_id); 8 return self::show($staff); 9}

削除済み専用のルーティングを作る形になります。
こうしておけば削除済みのページを見れるユーザーをミドルウェアで制限したりするのも簡単です。
基本的にソフトデリートは 削除 です。削除されてないデータとは明確に処理を分けたほうが良いように思いますし、頻繁にこのようなコードを書く必要が有る場合はソフトデリートではなく、staffにステータスを持たせて管理方法を変えたほうがいいかもしれません。

追記

どうしても注入したいのであれば、 ImplicitRouteBinding.phpresolveForRoute メソッドを改造します。

php

1public static function resolveForRoute($container, $route) 2 { 3 // ...略 4 5 // ホワイトリスト (実際ではハードコーディングは避けたほうが吉) 6 if ($route->action['controller'] == 'App\Http\Controllers\StaffController@show') { 7 $route->setParameter($parameterName, $model->where( 8 $model->getRouteKeyName(), $parameterValue 9 )->withTrashed()->firstOrFail()); 10 } else { 11 $route->setParameter($parameterName, $model->where( 12 $model->getRouteKeyName(), $parameterValue 13 )->firstOrFail()); 14 } 15 } 16 }

vender以下のコードなのでおそらくgit管理外ですが、こうすれば特定の注入にソフトデリートされたデータを含めることができます。 参考: Rewrite Vendor Class

投稿2017/06/14 06:29

編集2017/06/14 07:37
watanuki_p

総合スコア45

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttakahashi2013

2017/06/14 06:57

うーん、やっぱりモデルを注入は無理でしょうか。。。 ご回答ありがとうございます!
ttakahashi2013

2017/06/15 01:56

どちらかの方法でやるしかないみたいですね。 ご回答ありがとうございました!
ttakahashi2013

2017/06/15 07:29

おお、ありがとうございます!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問