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();
    }
}
本帖已被设为精华帖!
本帖由系统于 3年前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 5

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

7年前 评论
xuding

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

7年前 评论

楼主说的是 Laravel.io 吧

7年前 评论

static``延迟绑定罢了

7年前 评论

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

7年前 评论

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