> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# 코어 패키지와 커스텀 드라이버 - Feedable

> feedable-core 패키지의 코어 헬퍼와 커스텀 드라이버 만드는 방법

## Feedable Core 개요

`feedable-core`는 Feedable의 코어 헬퍼와 내장 드라이버를 분리한 Composer 패키지입니다.\
새로운 Laravel 프로젝트에 도입하면 스타터 키트와 동등한 기반을 재사용할 수 있습니다.

* 패키지: [invokable/feedable-core](https://github.com/invokable/feedable-core)
* 스타터 키트: [invokable/feedable](https://github.com/invokable/feedable)

## Response 클래스

`Rss2Response`와 `JsonFeedResponse`로 출력 포맷을 고정할 수 있습니다.\
사용자가 포맷을 선택하는 구성에서는 `ResponseFactory`를 사용합니다.

```php theme={null}
use Revolution\Feedable\Core\Response\Rss2Response;

return new Rss2Response(
    title: $title,
    items: $items,
);
```

```php theme={null}
use Revolution\Feedable\Core\Enums\Format;
use Revolution\Feedable\Core\Response\ResponseFactory;

Route::get('feed.{format?}', function (Format $format = Format::RSS) use ($title, $items) {
    return ResponseFactory::format($format)->make(
        title: $title,
        items: $items,
    );
});
```

## FeedItem / Author

`FeedItem`은 RSS/JSON Feed에서 공통화된 아이템 객체입니다.\
`Author`는 `authors` 필드용 객체이며, `Author::make()`를 사용해 생성합니다.

```php theme={null}
use Revolution\Feedable\Core\Elements\Author;
use Revolution\Feedable\Core\Elements\FeedItem;

$item = new FeedItem(
    id: $url,
    url: $url,
    title: $title,
    summary: $summary,
    authors: [Author::make(name: $authorName)->toArray()],
);
```

## Support 헬퍼

### AbsoluteUri::resolve()

상대 경로를 절대 경로로 변환합니다.

```php theme={null}
use Revolution\Feedable\Core\Support\AbsoluteUri;

$absolute = AbsoluteUri::resolve('https://example.com/', '/images/sample.jpg');
```

### RSS::filterLinks()

```php theme={null}
use Revolution\Feedable\Core\Support\RSS;

$xml = RSS::filterLinks($rss, $links);
```

### RSS::each()

```php theme={null}
use DOMElement;
use Revolution\Feedable\Core\Support\RSS;

$xml = RSS::each($rss, function (DOMElement $item) {
    $title = $item->getElementsByTagName('title')->item(0);

    if ($title && str_contains($title->textContent, 'NGワード')) {
        $item->parentNode?->removeChild($item);
    }
});
```

## 커스텀 드라이버 만드는 방법

### 1) 스타터 키트에 직접 추가하기

스타터 키트는 일반적인 Laravel 앱이므로, `routes/web.php`에 라우트를 추가하고 컨트롤러(또는 invokable 클래스)에서 구현할 수 있습니다.

```php theme={null}
use App\Http\Controllers\CustomFeedController;
use Revolution\Feedable\Core\Enums\Format;

Route::get('/custom/site.{format?}', CustomFeedController::class)
    ->whereIn('format', array_column(Format::cases(), 'value'));
```

### 2) Composer 패키지로 추가하기

여러 프로젝트에서 재사용하는 경우, ServiceProvider에서 라우트를 등록하는 구성이 다루기 편합니다.

```php theme={null}
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Route;

class CustomDriverServiceProvider extends ServiceProvider
{
    public function boot(): void
    {
        Route::middleware('web')->group(__DIR__.'/../routes/web.php');
    }
}
```

### 3) Driver::about()으로 정보 등록하기(선택)

`Driver::about()` 등록은 지원 사이트 목록에 표시하기 위한 메타데이터입니다.\
등록하지 않아도 드라이버 자체는 동작합니다.

## 참고: Laravel 블로그 드라이버

구현 예시로 Laravel 공식 블로그용 드라이버를 참조하세요.

* [LaravelBlogDriver.php](https://github.com/invokable/feedable-core/blob/main/src/Drivers/Laravel/LaravelBlogDriver.php)


## Related topics

- [Feedable](/ko/packages/feedable/index.md)
- [Laravel AI SDK용 Amazon Bedrock 드라이버](/ko/packages/laravel-amazon-bedrock.md)
- [Illuminate\Support\Manager — 드라이버 시스템의 해부](/ko/advanced/manager.md)
- [지원 사이트 목록 - Feedable](/ko/packages/feedable/drivers.md)
- [Laravel Sentinel — 라우트 보호 미들웨어 조사](/ko/blog/sentinel-introduction.md)
