본문으로 건너뛰기
버전: 2.x

← 이전 · README로 돌아가기 · 다음 →

Eloquent

FeedObserver::saving()은 이벤트가 활성화된 모델의 create(), update(), save() 호출마다 실행됩니다. PR #335 이후에는 $feed->isDirty('slug')가 false일 때만 $feed->slug = $feed->title을 대입합니다. SlugCast는 자동 생성된 slug와 수동으로 지정한 slug 모두에 Str::slug()을 적용합니다. 예를 들어 Products는 products가 됩니다.

명시적으로 변경한 slug는 title을 함께 변경해도 해당 저장에서 유지됩니다. 사용자 지정 slug가 영구적으로 고정되는 것은 아닙니다. 이후 일반 저장에서는 제목이 바뀌지 않아도 변경되지 않은 slug를 title에서 다시 계산합니다. 같은 slug나 정규화 결과가 현재 slug와 같은 값을 대입하면 변경으로 간주되지 않습니다.

옵저버는 이미 적용된 setter와 현대식 및 레거시 accessor를 포함한 현재 title 속성을 읽습니다. 저장된 원시 제목을 읽는 것이 아니며 최종 데이터베이스 값도 보장하지 않습니다. Display: Stored: Product Catalog를 반환하는 accessor는 display-stored-product-catalog를 만듭니다. 표시용 서식이 slug에 영향을 주면 안 되는 경우 별도 accessor를 사용하십시오.

saveQuietly()와 withoutEvents() 내부의 저장은 옵저버를 건너뜁니다. 이 방식으로 title을 변경하면 애플리케이션에서 명시적으로 대입하지 않는 한 이전 slug가 유지됩니다. 이벤트가 필요하면 일반 저장을 사용하십시오. 옵저버와 동일한 규칙으로 조용히 저장하려면:

use DragonCode\LaravelFeed\Models\Feed;

$feed = Feed::query()->findOrFail(42);
$feed->title = 'New Title';
$feed->slug = $feed->title;
$feed->saveQuietly();

나중에 실행되는 saving 리스너나 creating, updating 리스너가 title을 변경해도 패키지는 slug를 다시 계산하지 않습니다. 저장 전에 제목을 설정하거나 mutator를 사용하십시오. 이후 리스너에서 변경해야 한다면 같은 리스너에서 변경 직후 $feed->slug = $feed->title을 대입하고 save()를 재귀 호출하지 마십시오. 애플리케이션 테스트로 리스너 순서를 확인하십시오.

일부 열만 선택한 모델에서 slug를 명시적으로 변경하지 않고 저장할 때는 title과 accessor가 요구하는 모든 속성을 포함하십시오. title이 없다고 slug 생성이 비활성화되지는 않습니다. 쿼리 빌더의 대량 삽입과 업데이트는 이 옵저버를 실행하지 않으므로 두 값을 명시적으로 관리하십시오. 사용자 정의 모델에서는 상속된 옵저버와 casts를 유지하십시오.

선택하거나 스케줄에 등록할 피드에는 서로 다르고 비어 있지 않은 slug를 저장하십시오. 제목에서 slug를 만들 때는 정규화 결과가 서로 다르고 비어 있지 않은 제목을 선택하십시오. 저장된 slug가 비어 있으면 선택할 수 없습니다. 삭제되지 않은 등록 정보 여러 개가 같은 slug를 사용하면 조회 시 Illuminate\Database\MultipleRecordsFoundException이 발생하며 접미사는 자동으로 추가되지 않습니다.

사용자 지정 피드 등록 모델​

피드 등록 레코드에 추가 열, 캐스트, 관계 또는 메서드가 필요하면 feeds.model을 애플리케이션 모델로 설정하십시오. 사용자 지정 모델은 DragonCode\LaravelFeed\Models\Feed를 확장해야 합니다.

namespace App\Models;

use DragonCode\LaravelFeed\Models\Feed as BaseFeed;

class Feed extends BaseFeed
{
protected $fillable = [
'slug',
'class',
'title',
'expression',
'is_active',
'last_activity',
'is_foo',
'is_bar',
];

protected function casts(): array
{
return [
...parent::casts(),
'is_foo' => 'boolean',
'is_bar' => 'boolean',
];
}
}

config/feeds.php에 모델을 등록하십시오.

'model' => App\Models\Feed::class,

애플리케이션 마이그레이션에서 feeds 테이블에 사용자 지정 열을 추가하십시오. 대량 할당을 허용하는 모든 속성을 $fillable에 유지하십시오.

FeedQuery는 생성, 조회, 목록, 업데이트, 삭제 및 복원 작업에 구성된 모델을 사용합니다. 레코드를 생성할 때 애플리케이션별 값은 extra로 전달하십시오. 이 값은 마지막에 적용되며 메서드 인수를 재정의할 수 있습니다.

$feed = app(FeedQuery::class)->create(
class: SomeFeed::class,
title: 'Some',
expression: '0 */12 * * *',
extra: [
'slug' => 'Custom Some',
'is_foo' => true,
'is_bar' => true,
]
);

이 예제는 slug가 custom-some인 등록을 생성합니다. 모델의 create()와 update()에도 명시적인 slug를 전달할 수 있습니다. title과 slug를 함께 변경하면 해당 저장에서는 변경한 slug가 유지됩니다.

애플리케이션 모델에서 일반 Eloquent API를 사용할 수도 있습니다.

use App\Models\Feed;

$feed = Feed::create([
'class' => SomeFeed::class,
'title' => 'Some',
'expression' => '0 */12 * * *',
'is_active' => true,
'is_foo' => true,
'is_bar' => true,
]);
노트

구성된 모델은 런타임에 해석됩니다. 정적 분석은 FeedQuery::create()의 결과를 패키지 기본 모델로 인식합니다. 애플리케이션별 속성의 자동 완성이 필요하면 App\Models\Feed::create() 또는 명시적인 로컬 타입을 사용하십시오.

청크 크기​

데이터베이스 쿼리는 기본적으로 1000개 항목 단위의 청크를 사용합니다. chunkSize 메서드를 재정의하여 변경할 수 있습니다.

use DragonCode\LaravelFeed\Feeds\Feed;

class UserFeed extends Feed
{
public function chunkSize(): int
{
return 500;
}
}

관련 문서​