xrow/rest-bundle
xrow/rest-bundle is a Symfony bundle for building RESTful APIs, offering controllers, routing, serialization, and request/response handling to speed up development of JSON-based web services.
composer require. xrow/rest-bundle is a Symfony bundle (package type symfony-bundle), not a Laravel package. It was built as a web-service layer for eZ Publish / eZ Platform (Ibexa) style media/content systems. Laravel's package discovery will not register it, there is no ServiceProvider, no facade, and no config/rest-bundle.php to publish.vendor/xrow/rest-bundle/composer.json after installing (or browse it on GitHub) and note:
type and require — expect symfony/framework-bundle, possibly ezsystems/* or Ibexa kernel packages, and a PHP constraint that predates PHP 8.2.autoload PSR-4 namespace, so you know where controllers/services live.extra.laravel exists. It won't. Plan accordingly.Resources/config/ (services, routing) and DependencyInjection/Configuration.php. That config tree is the actual public API surface — everything else is implementation detail.config/bundles.php) — but then you're doing Symfony work, not Laravel work.// app/Services/MediaApiClient.php
final class MediaApiClient
{
public function __construct(private string $baseUrl, private ?string $token = null) {}
public function articles(int $page = 1): array
{
return Http::baseUrl($this->baseUrl)
->withToken($this->token)
->retry(2, 200)
->get('/api/articles', ['page' => $page])
->throw()
->json();
}
}
Bind it in a service provider, cache responses with Cache::remember, and test with Http::fake() plus recorded fixtures. This is the only pattern that survives the bundle being abandoned.routes/api.php, controllers → invokable Laravel controllers, the Symfony service container → constructor injection, bundle config parameters → config/media-rest.php, and the content repository calls → Eloquent/query-builder equivalents. Preserve the response envelope, status codes, pagination and error format exactly so existing clients don't notice the swap. Validate the port by replaying captured requests against both implementations and diffing JSON.Section, Article, MediaAsset, Rendition. Use Laravel API Resources (ArticleResource) to normalize the bundle's JSON into your own stable shape, so upstream quirks stay contained in one mapper.php artisan package:discover output and don't be surprised when nothing appears.Configuration.php. Parameters live under a bundle-specific root key (e.g. xrow_rest:) with YAML/XML service definitions in Resources/config. Copy keys from the bundle's own tests/fixtures rather than inventing them.routes/api.php yourself; don't try to import Symfony route files.Http:: responses (Http::globalMiddleware / ->withOptions(['debug' => true])) and diff against fixtures. Guessing at undocumented payloads is the main time sink.How can I help you explore Laravel packages today?