Laravel一些优雅的写法

这篇具有很好参考价值的文章主要介绍了Laravel一些优雅的写法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1. 新增商品操作

2. 修改商品操作文章来源地址https://www.toymoban.com/news/detail-730535.html


1. 新增商品操作


// 原则,所有服务类只有一个public入口,或者多个public入口,但是他们做都是同一件事情
Class CreateService {


    // 创建类的入口, 根据dto去新建
    public function create(Dto $dto){
        $user = User::find($dto->getUserId());
        // 这里做一些系列的参数验证,此处省略...
        // 先构建商品model对象, 不要在事务期间构建,减少事务等待
        $good = $this->buildGood($user, $dto);
        // 构建商品的属性(一对多)
        $good->setRelation('attributes', $this->buildAttributes($dto));
        // 构建商品的活动(一对多)
        $good->setRelation('activities', $this->buildActivities($dto));


    DB::transaction(function () use (
            $good
        ) {

             // 保存商品model对象
               // 主表
                $good->save();
                // 批量插入商品属性表
                $good->attributes()->saveMany(
                    $good->attributes->all()
                );
                // 批量插入商品活动表
                $good->activities()->saveMany(
                    $good->activities->all()
                );
            // 触发商品新增事件,要delay延迟事件,确保事务提交后触发
            delay_event(new GoodCreated());
        });

    }


    // 根据Good类去新建
    public function createByGood(Good $good) {
        // ....
   }


    /** 构建商品属性对象
     * @param Dto $dto
     * @return Collection
     */
    protected function buildAttributes(
        Dto $dto
    ): Collection {
        $newCollection  = new Collection();
        // 获取页面提交的属性名称列表
        $$list = $dto->getAttributes();

        if (empty($list)) {
            return $newCollection;
        }

        foreach ($list as $name) {
            $newCollection->add(new GoodAttribute([
                'name'    => $name,
            ]));
        }

        return $newCollection;
    }

    // 构建商品活动对象
    protected function buildActivities(
        Dto $dto
    ): Collection {
        $newCollection  = new Collection();

        if (!empty($dto->getAtivityId())) {
            $newCollection->add(
                new GoodActivity(
                    [
                        'activity_id'    => $dto->getAtivityId(),
                    ]
                )
            );
        }

        return $newCollection;
    }


    /** 构建商品对象
     * @param User $user
     * @param Dto $dto
     * @return Good
     */
    protected function buildGood(
        User $user,
        Dto $dto
    ): Good {
        return new Good([
          
            'updated_at'   => $dto->getDataUpdatedAt(),
            'user_id'     => $user->id,
            'user_name'   => $user->username,
        ]);
    }

}

class Dto
{

   protected $attributes;
   protected $dataUpdatedAt;
   protected $activityId;
   protected $userId;
   public static function build(array $params): Dto {
     $self = new self();
     $self->attributes = (array)($params['attributes'] ?? []);
     $self->dataUpdatedAt = Carbon::now()->toDatetimeString();
     $self->activityId = intval($params['activity_id'] ?? 0);
     $self->userId = intval($params['user_id'] ?? 0);
     return $self;
   }
}

// controller
GoodController {
    // 商品新增执行入口
    public function create(Request $request, CreateService $createService): array {
        $service->create(
            Dto::build($request->validated())
        );
        return ['code' => 200];
    }
}

2. 修改商品操作

<?php


// 原则,所有服务类只有一个public入口,或者多个public入口,但是他们做都是同一件事情
Class UpdateService {


    // 创建类的入口, 根据dto去新建
    public function update(Dto $dto){
        $good = Good::find($dto->getGoodId());
        $good->loadMissing([
            'attributes',
            'activities',
        ]);
        $user = User::find($dto->getUserId());
        // 这里做一些系列的参数验证,此处省略...
        // 先构建商品model对象, 不要在事务期间构建,减少事务等待
        $good = $this->buildGood($good, $user, $dto);
        // 构建商品的属性(一对多)
        $good->setRelation('attributes', $this->buildAttributes($good, $dto));
        // 构建商品的活动(一对多)
        $good->setRelation('activities', $this->buildActivities($good, $dto));


        DB::transaction(function () use (
            $good
        ) {

            // 保存商品model对象
            // 主表
            $good->save();
            
            // 批量插入商品属性表
            $good->attributes()->saveMany(
                $good->attributes->all()
            );
            // 删除没选中的商品属性
            $good->attributes()->whereNotIn(
                'id',
                $good->attributes->pluck('id')->filter()->unique()->all()
            )->delete();
            
            // 批量插入商品活动表
            $good->activities()->saveMany(
                $good->activities->all()
            );
            // 删除没选中的商品活动
            $good->activities->whereNotIn(
                'id',
                $good->activities->pluck('id')->filter()->unique()->all()
            );
            // 触发商品修改事件,要delay延迟事件,确保事务提交后触发
            delay_event(new GoodUpdated());
        });

    }


    // 根据product类去新建
    public function updateByGood(Good $product, array $params) {
        
    }


    /** 构建商品属性对象
     * @param Dto $dto
     * @return Collection
     */
    protected function buildAttributes(
        Good $good,
        Dto $dto
    ): Collection {
        $newCollection  = new Collection();
        // 获取页面提交的属性名称列表
        $list = $dto->getAttributes();

        if (empty($list)) {
            return $newCollection;
        }
        $oldAttributes = $good->attributes->keyBy('name');

        foreach ($list as $name) {
            // 按商品属性名字取查找,如果已经添加,就不需要新建了
            if ($attribute = $oldAttributes->get($name)) {
                $newCollection->add($attribute);
            } else {
                // 没有添加,则新建
                $newCollection->add(new GoodAttribute([
                   'name'    => $name,
                ]));
            }
        }

        return $newCollection;
    }

    // 构建商品活动对象
    protected function buildActivities(
        Good $good,
        Dto $dto
    ): Collection {
        $newCollection  = new Collection();
        $oldActivities = $good->activities->keyBy('activity_id');
        if (empty($dto->getAtivityId())) {
            return $newCollection;
        }
        if ($activity = $oldActivities->get($dto->getAtivityId())) {
            // 已经添加过活动,就无需再新增
            $newCollection->add($activity);
        } else {
            // 新增活动
            $newCollection->add(
                new GoodActivity(
                    [
                        'activity_id'    => $dto->getAtivityId(),
                    ]
                )
            );
        }

        return $newCollection;
    }


    /** 构建商品对象
     * @param User $user
     * @param Dto $dto
     * @return Good
     */
    protected function buildGood(
        Good $good,
        User $user,
        Dto  $dto
    ): Good {

        return $good->fill([

                            'updated_at'   => $dto->getDataUpdatedAt(),
                            'user_id'     => $user->id,
                            'user_name'   => $user->username,
                        ]);
    }

}

class Dto
{

    protected $attributes;
    protected $dataUpdatedAt;
    protected $activityId;
    protected $userId;
    protected $goodId;
    public static function build(array $params): Dto {
        $self                = new self();
        $self->attributes    = (array)($params['attributes'] ?? []);
        $self->dataUpdatedAt = Carbon::now()->toDatetimeString();
        $self->activityId    = intval($params['activity_id'] ?? 0);
        $self->userId        = intval($params['user_id'] ?? 0);
        $self->goodId        = intval($params['good_id'] ?? 0);
        return $self;
    }
    // ...一下实现获取属性值的方法,此处省略
}

// controller
class GoodController {
    // 商品修改执行入口
    public function update(Request $request, UpdateService $updateService): array {
        $service->update(
            Dto::build($request->validated())
        );
        return ['code' => 200];
    }
}

到了这里,关于Laravel一些优雅的写法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • laravel如何使用websocket

    WebSocket是一种在单个TCP连接上进行全双工通信的协议。它使得浏览器和服务器之间的实时通信变得更加容易。与HTTP请求不同,WebSocket连接是持久的,这意味着一旦建立连接,客户端和服务器之间的通信将一直保持打开状态,直到其中一方关闭连接。 Laravel是一个流行的PHP框架

    2024年02月08日
    浏览(54)
  • laravel框架引用kafka

    在 Laravel 中操作 Kafka,可以使用 php-rdkafka 扩展或 confluent-kafka-php 扩展。 以下展示如何使用 confluent-kafka-php 扩展来在 Laravel 中使用 Kafka。 操作步骤说明: 1、安装 confluent-kafka-php 扩展。您可以使用 Composer 进行安装: 2、需要在 Laravel 配置文件中配置 Kafka 连接信息。打开  c

    2024年03月11日
    浏览(52)
  • laravel excel导入导出

    版本2.1和现在版本 有所不一样 config配置文件夹中excel.php,配置生成文件的地址

    2024年02月10日
    浏览(31)
  • laravel学习

    这里只分享核心思想   · 契约:就是接口类 · 服务:一些类,例如阿里云短信发送类sms1.php ,百度平台短信发送类sms2.php,都继承契约(接口类),使类有一样的方法 · 容器:类似一个数组 · 服务提供者:实例化sms1或sms2类,取名为sms,放进容器,其他地方就可以使用sms调

    2024年03月14日
    浏览(43)
  • laravel安装composer依赖

    拉取的新项目没有依赖 项目根目录没有vendor目录 报错 1.如果没有composer先去下载  官网地址:Packagist / Composer 中国全量镜像 我的博客安装composer:composer最新版本安装_荒-漠的博客-CSDN博客 2.进入项目根目录cmd或者在项目中命令行 项目命令行 小黑窗在项目根目录cmd     如果有全

    2024年02月14日
    浏览(35)
  • laravel项目运行问题记录

    解决地址:phpstudy网站或站点创建成功,打开无响应_php打开提示站点创建成功_荒-漠的博客-CSDN博客 解决地址:laravel安装composer依赖_荒-漠的博客-CSDN博客  apche解决办法: phpstudy站点404访问遭到拒绝 首页可以访问 接口不能访问_phpstudy报错404_荒-漠的博客-CSDN博客 nginx解决办法:

    2024年02月14日
    浏览(44)
  • laravel aws s3

    由于公司有境外项目,服务器、文件存储都是用的亚马逊,真真地是没有用过,在此记录一下自己的s3研究结果       1、创建存储桶时,以下内容均不要勾选,其他默认就行    2、编辑策略: {     \\\"Version\\\": \\\"2012-10-17\\\",     \\\"Statement\\\": [         {             \\\"Sid\\\"

    2024年02月11日
    浏览(38)
  • LARAVEL敏感信息泄漏

    入行四个月了见到了很多没见过的漏洞,学习一下 LARAVEL敏感信息泄漏 高危 漏洞描述:在 laravel 框架的根目录下存在配置文件,该文件存储了 debug 的配置、mysql账号密码、邮箱账号密码、redis 密码等信息。如果访问控制不当会导致文件泄露敏感信息。 解决方案:关闭 larave

    2024年02月02日
    浏览(63)
  • laravel安装rabbitmq

    要在Laravel中安装RabbitMQ,您可以使用Laravel的官方包 babenkoivan/queue-rabbitmq 。以下是安装和配置RabbitMQ的步骤:  注册服务提供者和Facade。在 config/app.php 文件中的 providers 数组中添加以下行:  在 config/app.php 文件中的 aliases 数组中添加以下行: 生成配置文件 这将在 config 目录下

    2024年01月21日
    浏览(32)
  • laravel使用elasticsearch

    laravel使用elasticsearch laravel 中安装扩展包 composer安装elasticsearch扩展包 Elasticsearch 官方提供了 Composer 包,在引入时需要注意要指定版本,因为不同版本的 Elasticsearch 的 API 略有不同,因为我用的是 7.12.x,因此需使用 ~7.12.x 来指定包版本。 laravel 配置 es config/database.php .env 配置

    2024年01月16日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包