cethyworks/swagger-tools-bundle
Prerequisites:
kleijnweb/swagger-bundle (this package depends on it).kleijnweb/swagger-bundle with a valid swagger.yml (or .json) file.First Command:
composer require cethyworks/swagger-tools-bundle
php bin/console swagger:generate:entities swagger.yml YourBundleName
Replace YourBundleName with your target bundle (e.g., ApiBundle).
Verify Output:
src/YourBundleName/Entity/ for generated Doctrine entities with @ORM\ and @Assert\ annotations.Generate Controllers:
php bin/console swagger:generate:controllers swagger.yml YourBundleName
src/YourBundleName/Controller/ with matching routes and test classes in Tests/.Use this to bootstrap a CRUD API from a Swagger spec:
swagger.yml with resources (e.g., users, products).kleijnweb/swagger-bundle for automatic route registration and OpenAPI docs.Design-First Approach:
Entity Generation:
definitions or components/schemas.@ORM\Id @ORM\GeneratedValue(strategy="UUID")).integer → int, string → string).@Assert\NotBlank() for required: true).# swagger.yml
definitions:
User:
properties:
email:
type: string
format: email
age:
type: integer
minimum: 18
Generates:
// src/YourBundle/Entity/User.php
/**
* @ORM\Entity
*/
class User {
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="UUID")
* @ORM\Column(type="guid")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
* @Assert\NotBlank
* @Assert\Email
*/
private $email;
/**
* @ORM\Column(type="integer")
* @Assert\GreaterThan(17)
*/
private $age;
}
Controller Generation:
paths (e.g., /users, /products).GET /users → getUsers(), POST /users → createUser()).@Route("/users", name="api_users_get")).UserRepository).# swagger.yml
paths:
/users:
get:
summary: List users
responses:
200:
description: OK
Generates:
// src/YourBundle/Controller/UserController.php
class UserController {
/**
* @Route("/users", name="api_users_get", methods={"GET"})
*/
public function getUsers(UserRepository $repository) {
return $repository->findAll();
}
}
Testing:
ControllerTest classes with PHPUnit tests for each action.Client to hit generated routes (e.g., self::$client->request('GET', '/users')).Customize Generation:
src/ before running commands.--force to regenerate (e.g., swagger:generate:entities --force).Extend Entities:
Timestampable).Handle Relations Later:
@ORM\ManyToOne/@ORM\OneToMany after entities exist./**
* @ORM\ManyToOne(targetEntity="Product", inversedBy="users")
*/
private $product;
Swagger Bundle Sync:
swagger.yml to keep routes in sync.php bin/console cache:clear
CI/CD Pipeline:
php bin/console swagger:generate:entities swagger.yml ApiBundle
php bin/console swagger:generate:controllers swagger.yml ApiBundle
No Relation Support:
$ref fields in Swagger specs.UUID Assumption:
@ORM\GeneratedValue(strategy="AUTO")
Route Naming Conflicts:
api_users_get).Swagger Bundle Dependency:
swagger:generate:controllers command requires kleijnweb/swagger-bundle to be configured.No routes found → Ensure swagger-bundle is registered and routes are loaded.Assertion Limitations:
Command Errors:
-v for verbose output:
php bin/console swagger:generate:entities swagger.yml ApiBundle -v
yamllint.definitions → Use components/schemas (OpenAPI 3.0).Generated Code Issues:
var/cache/dev for compiled routes if controllers fail to register.php bin/console cache:pool:clear cache_route_annotation_reader
Type Mismatches:
format: date-time → PHP DateTime (works).type: array → PHP array (but nested objects may break).Partial Generation:
# Use a tool like `yq` to extract subsets of swagger.yml
yq '.definitions | select(.name | contains("User"))' swagger.yml > user-spec.yml
php bin/console swagger:generate:entities user-spec.yml ApiBundle
Custom Templates:
vendor/cethyworks/swagger-tools-bundle/Resources/views/ to templates/swagger-tools/ in your bundle.UserController.php.twig.Extension Points:
kernel.request).@ApiResource for API Platform):
// Post-generation hook
$entity->addAnnotation(new \Doctrine\Common\Annotations\Annotation('ApiResource'));
Performance:
Documentation:
# Regenerate Swagger from entities (reverse engineering)
php bin/console swagger:generate:openapi swagger.yml
config.yml required, but ensure `kleHow can I help you explore Laravel packages today?