Laravalio 官方开源论坛,Trait 的使用让我开了眼界,学习中

不多说废话,看下面的代码是HasSlug这个trait,其中这个地方 return static::where('slug', $slug)->firstOrFail();
这节这么来弄,是不是这个trait必须要在model用才可以啊,否则where怎么找得到?

只能说,这个trait太神奇了!!!!

<?php

namespace App\Helpers;

trait HasSlug
{
    public function slug(): string
    {
        return $this->slug;
    }

    public function setSlugAttribute(string $slug)
    {
        $this->attributes['slug'] = $this->generateUniqueSlug($slug);
    }

    public static function findBySlug(string $slug): self
    {
        return static::where('slug', $slug)->firstOrFail();
    }

    private function generateUniqueSlug(string $value): string
    {
        $slug = $originalSlug = str_slug($value);
        $counter = 0;

        while ($this->slugExists($slug, $this->exists ? $this->id() : null)) {
            $counter++;
            $slug = $originalSlug.'-'.$counter;
        }

        return $slug;
    }

    private function slugExists(string $slug, int $ignoreId = null): bool
    {
        $query = $this->where('slug', $slug);

        if ($ignoreId) {
            $query->where('id', '!=', $ignoreId);
        }

        return $query->count();
    }
}
本帖已被设为精华帖!
本帖由系统于 2年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 5

trait也不要乱用,
但用的恰当也会让项目代码阅读起来赏心悦目

6年前 评论
xuding

嗯。感觉是有点乱用的感觉。
当从trait的Signature来看,完全没有提示这个只可以用在Model.

6年前 评论

楼主说的是 Laravel.io 吧

6年前 评论

static``延迟绑定罢了

6年前 评论

例如 model中只定义相关的关联关系,属性之类,然后 相关的model操作方法,提到 trait 里面去就好了。你完全可以把代码写在model里面,只是看起来这个model代码会多,杂

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!