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年前 自动加精
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 5

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

7年前 评论
xuding

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

7年前 评论

楼主说的是 Laravel.io 吧

7年前 评论

static``延迟绑定罢了

7年前 评论

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

7年前 评论