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年前 自动加精
trait也不要乱用,
但用的恰当也会让项目代码阅读起来赏心悦目
嗯。感觉是有点乱用的感觉。
当从trait的Signature来看,完全没有提示这个只可以用在Model.
楼主说的是 Laravel.io 吧
static``延迟绑定
罢了例如 model中只定义相关的关联关系,属性之类,然后 相关的model操作方法,提到 trait 里面去就好了。你完全可以把代码写在model里面,只是看起来这个model代码会多,杂