PHP

Laravel try catchとtransactionの位置 リポジトリパターン

Laravel

 

 

try catchとtransactionの位置

どこに記述したら良いのか?

  • tryの直前でtransaction()開始
  • tryの中でcommit()
  • catchの中でrollback()

 

 

実装例

 

<?php

namespace App\Services\Master;

use App\Repositories\Shop\shopDesignInterface;
use App\Repositories\Master\ModuleInterface;
use App\Repositories\Customer\CustomerInterface;

class ShopDesignService extends ManagementService implements
    CreateShopDesignServiceInterface
{

    public function __construct(
        ShopDesignInterface $i_shop_design,
        ModuleInterface $i_module,
        CustomerInterface $i_customer
    ) {
        $this->i_shop_design = $i_shop_design;
        $this->i_module = $i_module;
        $this->i_customer = $i_customer;
    }

・・・

    /**
     * 商品削除
     *
     * @param $detail_id
     * @return int
     */
    public function delete(int $product_id): int
    {
        $this->i_shop_design->begin(); // ●トランザクション開始
        try {
            // shop_content削除
            $delete_product_count = $this->i_shop_design->deleteByIds([$product_id]);
            // customer_content削除
            $shop_module = $this->i_module->findWhere(['code' => "shop"]);
            if (!isset($shop_module->id)) {
                throw new NotFoundHttpException("ブースのmodule_idがありません");
            }
            $this->i_customer->deleteWhere([
                'sale_id' => $this->getSaleId(),
                'product_id' => $product_id
            ]);
            $this->i_shop_design->commit(); // ●コミット
        } catch (\Exception $e) {
            $this->i_shop_design->rollback(); // ●ロールバック
            throw $e;
        }
        return $delete_product_count;
    }

・・・

}

 

 

 

リポジトリパターンで抽象化

 

begin(), commit(), rollback()などLaravelでよく使う処理はTraitでまとめておくと便利です。

 

 

$this->i_c->begin();

$this->i_c->commit();

$this->i_c->rollback();

 

 

App\Repositories\Shop\ShopDesignRepository.php

<?php

namespace App\Repositories\Shop;

use App\Entities\ShopDesign;
use App\Repositories\Traits\ResourceTrait;

class ShopDesignRepository implements ShopDesignInterface
{
    use ResourceConstructTrait;

    /**
     * @param \App\Entities\ShopDesign $resource
     */
    public function __construct(ShopDesign $resource)
    {
        $this->resource = $resource;
    }

・・・

}

 

App\Repositories\Shop\ShopDesignInterface

<?php

namespace App\Repositories\Shop;

use App\Repositories\Traits\ResourceInterface;

interface ShopDesignInterface extends ResourceInterface
{
}

 

 

App\Repositories\Traits\ResourceTrait.php

<?php

namespace App\Repositories\Traits;

trait ResourceTrait
{
    /**
     * @var Illuminate\Database\Eloquent\Model
     */
    protected $resource;

・・・

    public function begin($connection = null)
    {
        $this->resource->getConnection($connection)->beginTransaction();
    }

    public function rollback($connection = null)
    {
        $this->resource->getConnection($connection)->rollback();
    }

    public function commit($connection = null)
    {
        $this->resource->getConnection($connection)->commit();
    }

・・・

}

 

<?php

namespace App\Entities;

use Illuminate\Database\Eloquent\Model;
use Prettus\Repository\Contracts\Transformable;
use Prettus\Repository\Traits\TransformableTrait;

/**
 * Class ShopDesign.
 *
 * @package namespace App\Entities;
 */
class ShopDesign extends Model implements Transformable
{
    use TransformableTrait;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        "id",
        "is_sall",
        "type",
        "json",
    ];
}

 

 

App\Providers\RepositoryServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class RepositoryServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }

    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {

・・・

        $this->app->bind(
            \App\Repositories\Shop\shopDesignInterface::class,
            \App\Repositories\Shop\shopDesignRepository::class
        );
        $this->app->bind(
            \App\Repositories\Master\ModuleInterface::class,
            \App\Repositories\Master\ModuleRepository::class
        );
        $this->app->bind(
            \App\Repositories\Customer\CustomerInterface::class,
            \App\Repositories\Customer\CustomerRepository::class
        );

・・・

    }
}

 

$ composer dumpa

 

 

 

Amazonおすすめ

iPad 9世代 2021年最新作

iPad 9世代出たから買い替え。安いぞ!🐱 初めてならiPad。Kindleを外で見るならiPad mini。ほとんどの人には通常のiPadをおすすめします><

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)