> ## 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 项目后，你就能复用与 starter kit 同等的基础设施。

* 包地址: [invokable/feedable-core](https://github.com/invokable/feedable-core)
* Starter kit: [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) 直接添加到 starter kit 中

Starter kit 本身就是普通的 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](/zh/packages/feedable/index.md)
- [Illuminate\Support\Manager — 驱动系统剖析](/zh/advanced/manager.md)
- [Laravel Pennant](/zh/pennant.md)
- [Laravel Sentinel — 路由保护中间件调查](/zh/blog/sentinel-introduction.md)
- [Laravel Socialite（社交登录）](/zh/socialite.md)
