Weave Code
Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Filament Api Resources Laravel Package

othyn/filament-api-resources

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require othyn/filament-api-resources
    

    (Note: Due to Filament V4's native API support, this package may not be actively maintained. Verify compatibility with your Filament version.)

  2. Basic API Resource Definition: Create a custom API resource class extending Filament\ApiResource:

    use Othyn\FilamentApiResources\ApiResource;
    
    class UserApiResource extends ApiResource
    {
        public static function getEndpoint(): string
        {
            return 'https://api.example.com/users';
        }
    
        public static function getModel(): string
        {
            return \stdClass::class; // Dummy model for type hints
        }
    }
    
  3. Register in Filament Panel:

    use Othyn\FilamentApiResources\Filament\Resources\ApiResourcePanel;
    
    ApiResourcePanel::make()
        ->id('api-panel')
        ->resources([
            UserApiResource::class,
        ]);
    
  4. First Use Case: Use the resource in a Filament page:

    use Filament\Tables\Table;
    
    Table::make()
        ->query(UserApiResource::query())
        ->columns([
            // Define columns as usual
        ]);
    

Implementation Patterns

Core Workflows

  1. API Integration:

    • REST/GraphQL: Configure endpoints in getEndpoint() and handle responses via transform().
    • Authentication: Use getHeaders() to inject auth tokens:
      public static function getHeaders(): array
      {
          return ['Authorization' => 'Bearer ' . config('services.api.token')];
      }
      
  2. Data Transformation:

    • Override transform() to map API responses to Filament-compatible data:
      public function transform($record): array
      {
          return [
              'id' => $record->id,
              'name' => $record->attributes->name,
          ];
      }
      
  3. Pagination:

    • Customize via getPagination():
      public static function getPagination(): string
      {
          return 'custom'; // Use 'links' for API pagination links
      }
      
  4. CRUD Operations:

    • Extend create(), update(), and delete() to handle API calls:
      public static function create(array $data): array
      {
          return http_post(self::getEndpoint(), $data)->json();
      }
      

Advanced Patterns

  • Relationships: Use hasManyThrough() or belongsTo() with API endpoints:

    public static function posts(): HasManyThrough
    {
        return self::hasManyThrough(
            PostApiResource::class,
            'relationship_endpoint',
            'id',
            'user_id'
        );
    }
    
  • Policy Integration: Bind API resources to gates/policies:

    Gate::define('view-user', function ($user, $record) {
        return http_get("{$record->endpoint}/{$record->id}/permissions")
            ->contains('view');
    });
    
  • Real-Time Updates: Poll API for changes using refresh():

    public function refresh()
    {
        $this->setData(http_get(self::getEndpoint())->json());
    }
    

Gotchas and Tips

Pitfalls

  1. Deprecation Risk:

    • Filament V4’s native custom data support may render this package obsolete. Evaluate migration needs.
  2. Caching Quirks:

    • API responses aren’t cached by default. Implement getCacheDuration() or use Laravel’s cache middleware:
      public static function getCacheDuration(): int
      {
          return 300; // 5 minutes
      }
      
  3. Pagination Conflicts:

    • API pagination (e.g., ?page=1) may clash with Filament’s built-in pagination. Use getPagination() to enforce consistency:
      public static function getPagination(): string
      {
          return 'cursor'; // For GraphQL-style pagination
      }
      
  4. Type Safety:

    • The package uses stdClass as a placeholder model. For stricter typing, define a DTO:
      class UserDto { public int $id; public string $name; }
      public static function getModel(): string { return UserDto::class; }
      

Debugging Tips

  • API Logs: Enable Laravel’s HTTP client logging:
    Http::withOptions(['debug' => true]);
    
  • Response Inspection: Dump raw API responses in transform():
    dd($record); // Debug API response structure
    
  • Error Handling: Wrap API calls in try-catch:
    try {
        return http_get(self::getEndpoint())->json();
    } catch (\Throwable $e) {
        throw new \Exception("API Error: {$e->getMessage()}");
    }
    

Extension Points

  1. Custom HTTP Client: Override getHttpClient() to use Guzzle with custom config:

    public static function getHttpClient(): \Illuminate\Http\Client\PendingRequest
    {
        return Http::withOptions(['timeout' => 30]);
    }
    
  2. Webhook Triggers: Extend afterCreate()/afterUpdate() to fire webhooks:

    public static function afterCreate($record): void
    {
        http_post('https://webhook.example.com', ['data' => $record]);
    }
    
  3. Rate Limiting: Implement exponential backoff in getHttpClient():

    Http::retry(3, 100)->throw();
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
mehedimi/laravel-amp-mail
happones/laravel-vue-i18n-generator
jwerd/inertia-table
siberfx/flysystem-wasabi
hollyit/token-replace
ippanelcom/laravel-sdk
adachsoft/changelog-linter
adachsoft/collection
payerurl/telegrambot-crypto-payment-instant-payout
dskripchenko/laravel-hybrid-search
riorizkyrainey/lara-ced
mehedimi/static-vel
zharp/zharp
nonsapiens/bigquery-model-sync
lgu-bayambang-ict-office/lgu-laravel-development-standards
andydefer/laravel-support
se7enxweb/flysystem
lampwick/laravel
jeslage/statamic-emojis
micahdshackelford/rmap-laravel