yii2-app-api
yii2-app-api copied to clipboard
Improve FakerController to work with relations
Faker Controller should be able to detect relations and set the foreign key values accordingly.
Inside this for loop:
https://github.com/cebe/yii2-app-api/blob/f3facab5d0978a30f77535913a442547a4ab42e7/console/commands/FakerController.php#L26-L32
Check for model relations (yii2-openapi could add a list of known relations to the Faker class for this) and add relations to existing models selecting the existing foreign keys.
e.g.
$model->user_id = $faker->randomElement(User::find()->select('id')->column());
The perfect implementation would event sort models by relation dependencies before generating fake data.
You may use the following schema for testing:
#
# Database Schema file
#
# if you change this file, run
#
# make cli
# ./yii gii/api
#
# to generate migrations and update base model classes.
#
openapi: 3.0.3
info:
title: 'Proxy-Service'
description: ""
version: 1.0.0
contact:
name: 'Carsten Brandt'
email: [email protected]
servers:
- url: 'http://localhost:8937'
description: 'Local Dev API'
security:
- BasicAuth: []
components:
securitySchemes:
BasicAuth:
type: http
scheme: basic
schemas:
Account:
description: user account
type: object
required:
- id
- name
properties:
id:
type: integer
name:
description: account name
type: string
maxLength: 40
x-faker: 'substr($faker->userName(), 0, 40)'
Domain:
description: domain
type: object
required:
- id
- name
- account
- created_at
properties:
id:
type: integer
name:
description: domain or sub-domain name, in DNS syntax, IDN are converted
type: string
maxLength: 128
x-faker: '$faker->domainName'
account:
$ref: '#/components/schemas/Account'
routings:
type: array
items:
$ref: '#/components/schemas/Routing'
created_at:
readOnly: true
type: string
format: datetime
x-db-type: datetime
nullable: false
Routing:
description: rounting specification
type: object
required:
- id
- domain
properties:
id:
type: integer
domain:
$ref: '#/components/schemas/Domain'
path:
type: string
maxLength: 255
x-faker: '$faker->randomElement(["/", "/", "/", "/", "/api", "/tools", "/assets/web"])'
ssl:
type: boolean
redirect_to_ssl:
type: boolean
service:
type: string
maxLength: 255
x-faker: '"http://tador.cebe.net/" . $faker->domainName'
created_at:
readOnly: true
type: string
format: datetime
x-db-type: datetime
nullable: true # todo check here: "nullable: false"
paths:
/:
get:
responses: []
description: none
The perfect implementation would event sort models by relation dependencies before generating fake data.
Can you please give more details about this?
In the above example: Routing depends on Domain, which itself depends on Account again.
So in order to generate fake data, you first need to generate Accounts, then Domains and then Routings, also faker needs to fill relations based on the existing items, e.g. for every domain it generates, attach a random account. For each Routing it generates, attach a random Domain.
I am starting to work on this task now