hi_lili
@hi_lili

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

try catch を導入しても動かない

Q&A

Closed

解決したいこと

新しいレコードを入れる際に、try cachを導入しようとしましたが、
リダイレクトされず登録ができない問題

環境

mac os
laravel 9
composer
laravel ui

product.php
 public function registProduct($data){

        DB::table('product')->insert([
            'product_name' => $data->product_name,
            'company_id' => $data->company_id,
            'price' => $data->price,
            'stock' => $data->stock,
            'comment' => $data->comment,
            'img_path' =>$data->file('img_path'),
        ]);

        if($data->hasFile('img_path')){ 
            $filename = $data->img_path->getClientOriginalName();
            $filePath = $data->img_path->storeAs('products', $filename, 'public');
            $product->img_path = '/storage/' . $filePath;
        }
    }
ProductController.php
 public function store(ProductRequest $request)
    {
        DB::beginTransaction();

        try{
            $products = new Product();
            $products->registProduct($request);
            DB::commit();
        }catch(\Exception $e){
            DB::rollback();
            return back();
        }

        return redirect('products');

    }

自分で試したこと

登録処理をモデルに移し、controllerにtry catchの処理を導入。
ネットでもtry catchの方法などを検索しましたが登録の方法がわからず・・・。
ヴァリデーションの処理が誤っている?のかもわからず、行き詰まってしまいました。:cry:
ご教授頂けますと幸いです:bow_tone1:

0

3Answer

私はphpは一切書いたことないので間違っていたら恐縮ですが
insertの実行にあたってはexecuteを呼ぶ必要がありそうです

戻り値の説明が参考になると思います

0Like

Comments

  1. @hi_lili

    Questioner

    @pea1205
    executeを初めて知りました:cry:
    添付いただいた資料勉強させていただきます!!!

return redirect('products'); でリダイレクトされるのですか? で、try 句内で例外が発生した時リダイレクトされないと言ってますか?

0Like

Comments

  1. @hi_lili

    Questioner

    @SurferOnWww
    このtry catchの処理を入れる前はリダイレクトされておりましたが、
    この処理を入れると一覧画面にリダイレクトされない。という状態となります:sob:

  2. 私の質問、

    return redirect('products'); でリダイレクトされるのですか? で、try 句内で例外が発生した時リダイレクトされないと言ってますか?

    に答えていただけませんか?

    答えが Yes なら catch 句にある return back(); で直前ページにリダイレクトされるのでは?

  3. @hi_lili

    Questioner

    @SurferOnWww
    意図を読み取れず、すいません・・・。
    私がこのtry catchのことを全く理解していなかったことが問題でした:disappointed_relieved:
    今までこの処理を入れるまでは登録ができていたので、例外が発生していないと勘違いをしておりました。

基本的なこととして、デバッグ手法を使ってプログラムがどのように動作しているのか把握しましょう。
こちらの記事が参考になると思います。

現状について確認させてください。

リダイレクトされず登録ができない

「リダイレクトされず」とありますが画面はどのようになっているのでしょうか?
プログラムを見ると、productsにリダイレクトするか直前のページにリダイレクトするか(back)、の2択なのでリダイレクトしないというのは奇妙な状況に見えます。

登録処理をモデルに移し、controllerにtry catchの処理を導入

この変更する前はどのような状況だったのでしょうか?
その時は登録処理はできていたのでしょうか?

0Like

Comments

  1. @hi_lili

    Questioner

    @blue32a
    説明不足ですいません。:bow_tone1:
    本来、商品登録を行うと一覧画面にリダイレクトするようになります。(そこには先ほど登録したのも表示されている状態)
    しかし今回の場合は、値を入力し登録ボタンを押しても値が消えて、
    また商品登録画面に戻り一覧画面に行かない。という状態です。(先程の値の登録もできていない)

    変更前は、登録処理はできておりました:cry:

  2. また商品登録画面に戻り一覧画面に行かない。という状態です。

    ということはcatchブロックに入って、backメソッドで戻っているのだと思われます。
    そうなると例外が発生していることになるので、例外の詳細($e->getMessage()など)を確認されることをお勧めします。

    ProductController.phpから抜粋
            // ...
    
            try{
                $products = new Product();
                $products->registProduct($request);
                DB::commit();
            }catch(\Exception $e){
                DB::rollback();
                return back();
            }
    
            // ...
    
  3. @hi_lili

    Questioner

    @blue32a
    承知いたしました!確認いたします。
    今までこの処理を入れるまで、登録ができていたので例外が起きていないと勘違いをしておりました・・・。
    一度バリデーションも見直します!

    また、解決できた際にご報告できればと思います:bow_tone1:
    ありがとうございます!

  4. @hi_lili

    Questioner

    回答が遅れてしまい、申し訳ございません。
    こちら、下記のコードにて解決することができました!

    ご教授いただき、ありがとうございました!

    public function store(ProductRequest $request){
    
            DB::beginTransaction();
            try {
                Product::createProduct($request->all());
                DB::commit();
            } catch (\Exception $e) {
                DB::rollback();
                return back();
            }
            return redirect('products');
        }
    
    
     public static function createProduct($requestData){
    
            $product = new Product();
            $product->product_name = $requestData['product_name'];
            $product->company_id = $requestData['company_id'];
            $product->price = $requestData['price'];
            $product->stock = $requestData['stock'];
            $product->comment = $requestData['comment'];
            
            if (isset($requestData['img_path'])) {
                $img_path = $requestData['img_path']->store('products', 'public');
                $product->img_path = 'storage/' . $img_path;
            }
    
            $product->save();
            return $product;
        }
        
    

Your answer might help someone💌