symfony-cmf/resource-rest-bundle
Since this bundle is part of the Symfony CMF ecosystem (not natively Laravel-compatible), you’d need to integrate it via Symfony’s components or a Laravel bridge. Here’s how a Laravel dev might approach it:
Install via Composer (for legacy projects or experimentation):
composer require symfony-cmf/resource-rest-bundle
Note: This requires Symfony’s dependency stack (e.g., symfony/framework-bundle).
Configure Puli Resources (CMF’s resource system):
PuliResource entity (e.g., Article, Media) with metadata like uri, mimeType, and content.use Symfony\Cmf\Component\Resource\ResourceInterface;
use Symfony\Cmf\Component\Resource\ResourceTrait;
class Article implements ResourceInterface
{
use ResourceTrait;
// Add fields like title, body, etc.
}
Register the Bundle (if using Symfony’s Kernel):
// config/bundles.php (Symfony)
return [
Symfony\Cmf\ResourceRestBundle\ResourceRestBundle::class => ['all' => true],
];
First API Endpoint:
Resource entities (e.g., /api/articles).php artisan route:list # (Symfony) or check Symfony’s router
Laravel Workaround:
HttpKernel in Laravel via symfony/http-kernel or wrap routes in a Lumen/Symfony bridge.GET, POST, PUT, DELETE endpoints.# config/packages/symfony_cmf_resource_rest.yaml (Symfony)
cmf_resource_rest:
routes:
- { path: '/api/articles', resource: 'article', methods: [GET, POST] }
Route::get('/api/articles', function () {
return app(Symfony\Cmf\ResourceRestBundle\ResourceRestBundle::class)
->getRestHandler()
->handleRequest(Request::create('/api/articles', 'GET'));
});
use JMS\Serializer\Annotation as Serializer;
class Article
{
/**
* @Serializer\Type("string")
*/
public $title;
}
jms/serializer-bundle (≥2.2) is installed.ResourceHandler to modify behavior:
use Symfony\Cmf\ResourceRestBundle\Handler\ResourceHandler;
class CustomArticleHandler extends ResourceHandler
{
public function handleGet(Request $request, Article $article)
{
// Add custom logic (e.g., access control)
return parent::handleGet($request, $article);
}
}
cmf_resource_rest:
handlers:
article: App\Handler\CustomArticleHandler
Resource and Eloquent models:
class ArticleMapper
{
public function toResource(array $data): Article
{
$article = new Article();
$article->setUri('/articles/' . $data['id']);
$article->setContent($data['body']);
return $article;
}
}
// Symfony
cmf_resource_rest:
security:
article:
- ROLE_USER
auth:api middleware.HttpKernel in a separate service.spatie/laravel-fractal).@Serializer\MaxDepth to limit recursion.return response()->json($article->toArray());
/api/cmf/*).Router in a separate domain/subdomain.HttpCache.cmf_resource_rest:
pagination:
article: 20
// config/packages/dev/debug.yaml
framework:
profiler: { only_exceptions: false }
dd($request->getContent()) to inspect raw input.ResourceRestBundle services:
services:
App\Custom\ResourceRestBundle:
decorates: 'cmf_resource_rest.resource_rest'
arguments: ['@App\Custom\ResourceRestBundle.inner']
public function handleRequest(Request $request)
{
$response = $this->getInner()->handleRequest($request);
$response->headers->set('Access-Control-Allow-Origin', '*');
return $response;
}
WebTestCase:
public function testGetArticle()
{
$client = static::createClient();
$client->request('GET', '/api/articles/1');
$this->assertEquals(200, $client->getResponse()->getStatusCode());
}
Http::fake().
---
```markdown
## Final Note
While this bundle is **abandoned**, its patterns (resource-based REST, JMS Serializer, custom handlers) are still valuable. For Laravel, evaluate whether the complexity justifies integration or if modern alternatives (e.g., **Laravel Sanctum + API Resources**) suffice.
How can I help you explore Laravel packages today?