Since this is a Symfony bundle, integration with Laravel requires Bridge or Symfony wrapper (e.g., symfony/http-foundation + symfony/routing). For Laravel 8/9, use:
composer require symfony/http-foundation symfony/routing
Register the Bundle (if using Symfony components directly):
config/app.php (not natively supported in Laravel).First Use Case: API Resource Controller The bundle likely provides traits for RESTful controllers. Example:
use Coka\ApiBundle\Controller\AbstractApiController;
class UserController extends AbstractApiController
{
public function getList(): Response
{
return $this->handleList(User::class, [
'fields' => ['id', 'name', 'email']
]);
}
}
Route::get('/users', [UserController::class, 'getList']);
Key Files to Review:
src/Resources/doc/index.md (documentation)src/Controller/AbstractApiController.php (base controller logic)src/EventListener/ (for hooks like validation/error handling).handleList(): Fetch paginated collections with filtering.handleGet(): Single resource retrieval.handleCreate()/handleUpdate(): Form request handling.// GET /users?filter[name]=John
public function getList(): Response
{
return $this->handleList(User::class, [
'filter' => ['name' => request('name')],
'paginate' => 15,
'sort' => ['name' => 'asc']
]);
}
Validator via the bundle’s traits.
use Coka\ApiBundle\Validator\Constraints as ApiAssert;
/**
* @ApiAssert\Valid()
*/
public function handleCreate(Request $request): Response
{
// ...
}
return $this->createResponse([
'data' => $user,
'meta' => ['status' => 'created']
], 201);
api.pre_handle) to modify requests/responses:
// In a service provider
$dispatcher->addListener(
'api.pre_handle',
function (ApiEvent $event) {
$event->setData(['custom_field' => true]);
}
);
$this->handleList(User::query()->where('active', true));
ApiResource for serialization:
class UserResource extends ApiResource
{
public function toArray($request)
{
return [
'id' => $this->id,
'name' => $this->name,
];
}
}
Router. For Laravel, mock routes or use symfony/routing:
$router = new Router();
$router->addCollection($this->container->get('router')->getRouteCollection());
container()->get(); use Laravel’s DI container or bind services manually.$dispatcher->addListener('api.*', function ($event) {
\Log::debug('API Event:', [$event->getName(), $event->getData()]);
});
createResponse() to log payloads:
protected function createResponse($data, int $status = 200): Response
{
\Log::info('API Response', [$data, $status]);
return response()->json($data, $status);
}
config/packages/oka_api.yaml. Replicate in config/oka_api.php:
return [
'default_limit' => 20,
'allowed_methods' => ['GET', 'POST', 'PUT', 'DELETE'],
];
mergeConfigFrom in a service provider.Coka\ApiBundle\Validator\Constraints\Valid:
namespace App\Validator;
use Symfony\Component\Validator\Constraint;
class CustomValid extends Constraint
{
// ...
}
Route::middleware(['auth:sanctum'])->group(function () {
Route::get('/users', [UserController::class, 'getList']);
});
handleList() calls with Laravel’s cache:
$cacheKey = "api_users_{$request->queryString}";
return Cache::remember($cacheKey, now()->addMinutes(5), function () {
return $this->handleList(User::class);
});
cursor() for large datasets in handleList().laravel/api-resources (for API resources).spatie/laravel-query-builder (for filtering/sorting).How can I help you explore Laravel packages today?