SlideShare une entreprise Scribd logo
1  sur  95
Télécharger pour lire hors ligne
Dilemmas and decisions
What we’ve learned designing the new Sylius API
Introduction
01
Photo by Mikhail Vasilyev on Unsplash
sylius.com
3
Certi
fi
cation 🎄
SYLIUSROCKS
-30%
Paid OS Support
Modular SyliusPlus
sylius.com
8
sylius.com
9
Started in 2020
1.12 with AP 2.7 (since 31st of Oct)
1.13 stabilized with AP 3.0 🎉
~100% of shop & ~70% of all coverage
Photo by Shane Aldendorff on Unsplash
Decisions & consequences
02
Strategic design
sylius.com
12
ADRs
[short title of solved problem and solution]
Status: [proposed | rejected | accepted | deprecated | … | superseded by ADR-0005]
Date: [YYYY-MM-DD when the decision was last updated]
Context and Problem Statement
[Describe the context and problem statement]
Decision Drivers
[driver 1, e.g., a force, facing concern, …]
…
Considered Options
[option 1]
[example | description | pointer to more information | …]
Good, because [argument a]
Bad, because [argument b]
…
Decision Outcome
Chosen option: "[option 1]", because [justi
fi
cation].
References
[Link type] [Link to ADR]
…
[short title of solved problem and solution]
Status: [proposed | rejected | accepted | deprecated | … | superseded by ADR-0005]
Date: [YYYY-MM-DD when the decision was last updated]
Context and Problem Statement
[Describe the context and problem statement]
Decision Drivers
[driver 1, e.g., a force, facing concern, …]
…
Considered Options
[option 1]
[example | description | pointer to more information | …]
Good, because [argument a]
Bad, because [argument b]
…
Decision Outcome
Chosen option: "[option 1]", because [justi
fi
cation].
References
[Link type] [Link to ADR]
…
[short title of solved problem and solution]
Status: [proposed | rejected | accepted | deprecated | … | superseded by ADR-0005]
Date: [YYYY-MM-DD when the decision was last updated]
Context and Problem Statement
[Describe the context and problem statement]
Decision Drivers
[driver 1, e.g., a force, facing concern, …]
…
Considered Options
[option 1]
[example | description | pointer to more information | …]
Good, because [argument a]
Bad, because [argument b]
…
Decision Outcome
Chosen option: "[option 1]", because [justi
fi
cation].
References
[Link type] [Link to ADR]
…
[short title of solved problem and solution]
Status: [proposed | rejected | accepted | deprecated | … | superseded by ADR-0005]
Date: [YYYY-MM-DD when the decision was last updated]
Context and Problem Statement
[Describe the context and problem statement]
Decision Drivers
[driver 1, e.g., a force, facing concern, …]
…
Considered Options
[option 1]
[example | description | pointer to more information | …]
Good, because [argument a]
Bad, because [argument b]
…
Decision Outcome
Chosen option: "[option 1]", because [justi
fi
cation].
References
[Link type] [Link to ADR]
…
[short title of solved problem and solution]
Status: [proposed | rejected | accepted | deprecated | … | superseded by ADR-0005]
Date: [YYYY-MM-DD when the decision was last updated]
Context and Problem Statement
[Describe the context and problem statement]
Decision Drivers
[driver 1, e.g., a force, facing concern, …]
…
Considered Options
[option 1]
[example | description | pointer to more information | …]
Good, because [argument a]
Bad, because [argument b]
…
Decision Outcome
Chosen option: "[option 1]", because [justi
fi
cation].
References
[Link type] [Link to ADR]
…
[short title of solved problem and solution]
Status: [proposed | rejected | accepted | deprecated | … | superseded by ADR-0005]
Date: [YYYY-MM-DD when the decision was last updated]
Context and Problem Statement
[Describe the context and problem statement]
Decision Drivers
[driver 1, e.g., a force, facing concern, …]
…
Considered Options
[option 1]
[example | description | pointer to more information | …]
Good, because [argument a]
Bad, because [argument b]
…
Decision Outcome
Chosen option: "[option 1]", because [justi
fi
cation].
References
[Link type] [Link to ADR]
…
[short title of solved problem and solution]
Status: [proposed | rejected | accepted | deprecated | … | superseded by ADR-0005]
Date: [YYYY-MM-DD when the decision was last updated]
Context and Problem Statement
[Describe the context and problem statement]
Decision Drivers
[driver 1, e.g., a force, facing concern, …]
…
Considered Options
[option 1]
[example | description | pointer to more information | …]
Good, because [argument a]
Bad, because [argument b]
…
Decision Outcome
Chosen option: "[option 1]", because [justi
fi
cation].
References
[Link type] [Link to ADR]
…
[short title of solved problem and solution]
Status: [proposed | rejected | accepted | deprecated | … | superseded by ADR-0005]
Date: [YYYY-MM-DD when the decision was last updated]
Context and Problem Statement
[Describe the context and problem statement]
Decision Drivers
[driver 1, e.g., a force, facing concern, …]
…
Considered Options
[option 1]
[example | description | pointer to more information | …]
Good, because [argument a]
Bad, because [argument b]
…
Decision Outcome
Chosen option: "[option 1]", because [justi
fi
cation].
References
[Link type] [Link to ADR]
…
sylius.com
21
Conclusion?
sylius.com
22
GraphQL vs REST
2020 -> GraphQL 🚀
Is it still?
Is it not?
sylius.com
28
✔ Solves over fetching and under fetching
By design
✔ Typed, nice documentation
? Sends everything with POST
It is possible to do it with GET
✔ Gracefully deprecation of queries
Which was not possible with default REST
GraphQL
sylius.com
29
✔ May solve over fetching and under fetching
With spare
fi
elds sets and/or Vulcain
✔ Typed, nice documentation
With OpenAPI
✔ Takes advantage of 20 years of web cache development
Fake date institute ™
✔ Gracefully deprecation of queries
With OpenAPI
REST
sylius.com
30
Conclusion?
Resources design
sylius.com
32
State transitions
Case
Let’s cancel an order!
sylius.com
34
Considered option #1
PATCH /api/orders/42/
{
"state": "cancelled"
}
sylius.com
35
Considered option #2
PATCH /api/orders/42/cancel
{}
RESTful Archetypes
Document
/api/admin/orders/1
Store
Client controlled /api/admin/orders/123
Collections
Server controlled /api/admin/orders
Controller
/api/admin/orders/1/cancel
Based on: REST API Design Rulebook by Mark Masse
sylius.com
38
Isn’t there a better way?
sylius.com
39
Solution?
POST /api/orders-cancellation-requests/
{}
sylius.com
40
Conclusion?
sylius.com
41
Calculated data
Case
Cost of the shipment
Version #1 - Adding
fi
elds on entity
class ShippingMethod
{
/** rest of methods */
public ?int $cost; // never used in app
// serialized only when possible to count
}
Version #2 - Read model
class CartShippingMethod
{
public function __construct(
public readonly string $code,
public readonly ShippingMethodInterface $shippingMethod,
public readonly int $cost
) {
}
}
Version #3 - Dynamic
fi
eld
public function normalize($object, $format = null, array $context = [])
{
Assert::keyNotExists($context, self::ALREADY_CALLED);
$context[self::ALREADY_CALLED] = true;
$data = $this->normalizer->normalize($object, $format, $context);
$calculator = $this->shippingCalculators->get($object->getCalculator());
$data['price'] = $calculator->calculate(
$shipment,
$object->getConfiguration()
);
return $data;
}
public function normalize($object, $format = null, array $context = [])
{
Assert::keyNotExists($context, self::ALREADY_CALLED);
$context[self::ALREADY_CALLED] = true;
$data = $this->normalizer->normalize($object, $format, $context);
$calculator = $this->shippingCalculators->get($object->getCalculator());
$data['price'] = $calculator->calculate(
$shipment,
$object->getConfiguration()
);
return $data;
}
public function normalize($object, $format = null, array $context = [])
{
Assert::keyNotExists($context, self::ALREADY_CALLED);
$context[self::ALREADY_CALLED] = true;
$data = $this->normalizer->normalize($object, $format, $context);
$calculator = $this->shippingCalculators->get($object->getCalculator());
$data['price'] = $calculator->calculate(
$shipment,
$object->getConfiguration()
);
return $data;
}
public function normalize($object, $format = null, array $context = [])
{
Assert::keyNotExists($context, self::ALREADY_CALLED);
$context[self::ALREADY_CALLED] = true;
$data = $this->normalizer->normalize($object, $format, $context);
$calculator = $this->shippingCalculators->get($object->getCalculator());
$data['price'] = $calculator->calculate(
$shipment,
$object->getConfiguration()
);
return $data;
}
Version #3 - Dynamic
fi
eld
sylius.com
47
Conclusion?
High level API design
sylius.com
49
Uni
fi
cation of API
/api/products/
Admin & Shop served together
sylius.com
51
✘ Available
fi
elds
Complicated serialisation groups depending on logged in user
✘ Hard to de
fi
ne identi
fi
ers
We have resigned from them later
✘ Requirement to de
fi
ne granular access control
To now allow to access sensitive date for non-admins
Findings
sylius.com
52
🛒 Shop has 72 endpoints
64% of read endpoints
🖊 Only 20% of resources have writable capabilities in shop
40% of them are never exposed in shop
⚙ Admin has 128 endpoints
52% of read endpoints
Data
Option #1 - Admin & Shop pre
fi
xed
/api/products/?admin
sylius.com
54
✔ Available
fi
elds
Depending on logged in user
✘ Seems wrong from the REST perspective
If we add pre
fi
x to the URL
✘ Requirement to de
fi
ne granular access control
To now allow to access sensitive date for non-admins
Findings
Option #2 - Admin & Shop header split
/api/products/
Accept:
application/vnd.sylius-admin.api+json
sylius.com
56
✔ Available
fi
elds
Depending on logged in user
✔ REST compilant
✘ Requirement to de
fi
ne granular access control
May be mitigated with Voters
Findings
✘ Not easily supported
By API Platform and Open API spec
Option #3 - Admin & Shop pre
fi
xed
/api/shop/products/
/api/admin/products/
sylius.com
58
✔ Available
fi
elds
Depending on logged in user
✔/✘ REST compilant
Disputable
✔ Straightforward access control
Just with security con
fi
g
Findings
✔ Easily supported
By API Platform and Open API spec
sylius.com
59
Conclusion?
sylius.com
60
API versioning
/api/v1
Old Admin API
#1 version
/new-api/
sylius.com
63
URL based versioning
/api/v2
Custom header
X-Sylius-API-Version: 1
Accept header with an additional vendor information
Accept: application/vnd.sylius.v1+json
#2 version
sylius.com
66
Conclusion?
sylius.com
67
But!
sylius.com
68
🔮 Versioning endpoints
With sunset header
🔮 Vendor added to accept header
application/vnd.sylius.v1+json
🔮 Deprecating endpoints,
fi
elds etc
In documentation of Open API
Future
API
fl
ow design
Case #1
Add to cart
Simple product
{
"product": “/api/products/42“,
"quantity": 1
}
Con
fi
gurable product #1
{
"product": “/api/products/42“,
"productVariant": “/api/product-variants/42“,
"quantity": 1
}
{
"product": “/api/products/42“,
“options": {
"SIZE": “SIZE_L",
"COLOR": “COLOR_BLUE"
},
"quantity": 1
}
Con
fi
gurable product #2
{
"product": “/api/products/864“,
"productVariant": “/api/product-variants/864“,
"quantity": 1
}
Let’s improve!
{
"product": “/api/products/42“,
"quantity": 1
}
Configurable
product
Simple
product
Let’s improve!
{
"product": “/api/products/864“,
"productVariant": “/api/product-variants/864“,
"quantity": 1
}
{
"product": “/api/products/42“,
"productVariant": “/api/product-variants/42“,
"quantity": 1
}
Configurable
product
Simple
product
Let’s improve!
{
"product": “/api/products/42“,
"productVariant": “/api/product-variants/42“,
"quantity": 1
} Configurable
product
Simple
product
Let’s improve!
{
"productVariant": “/api/product-variants/42“,
"quantity": 1
}
Configurable
product
Simple
product
sylius.com
78
But what with options?
Price matrix in UI
or
Ask us
sylius.com
80
Conclusion?
Case #2
Order details
Apply coupon
Apply coupon
PATCH
 ​​
/ap
i​
/v
2​
/sho
p​
/order
s​
/TOKEN_VALU
E​
/apply-coupon
{
"couponCode": “CHRISTMAS_SALE"
}
Cart claiming & addressing
Cart claiming & addressing
PATCH
 ​
/ap
i​
/v
2​
/sho
p​
/order
s​
/TOKEN_VALUE/address
{
"email": “test@example.com”,
"billingAddress": {
"firstName": "Jane",
"lastName": "Doe",
"...": "..."
}
}
sylius.com
86
✔ We are used to this separation
Mockups “force” such design
✔ Addressing requires state machine transition
While coupon appliance cart processing
✔ Di
ff
erent data required on di
ff
erent pages
Reasoning?
What about order update?
Order update
PUT
 ​
/ap
i​
/v
2​
/sho
p​
/order
s​
/TOKEN_VALUE
{
"localeCode": “en_US”
}
But it is just order drafting!
sylius.com
90
✔ UI Mockups should not force any design decision
We can preload data from more then one endpoint
✔ Don’t use state machine where there is none
✔ Either store data earlier or use partial update
Changed attitude
PUT
 ​
/ap
i​
/v
2​
/sho
p​
/order
s​
/TOKEN_VALUE/
{
"email": “test@example.com”,
"billingAddress": {
"firstName": "Jane",
"lastName": "Doe",
"countryCode": "US",
"street": “Baker Street 221B”,
"city": “London",
"postcode": "Doe"
},
"couponCode": “CHRISTMAS_SALE"
}
Order update
sylius.com
92
Conclusion?
Photo by Mikhail Vasilyev on Unsplash
03
Takeaways
sylius.com
94
Use ADRs
And browse them from time to time
Custom logic? New API resource!
Let’s behave like a tax department!
REST will be with us for the long time
But GraphQL will be there as well
Do not map HTML based websites to your API
I know, it was obvious 😅
sylius.com
95
Thank you!
Photo by Anthony DELANOIX on Unsplash
@lukaszchrusciel
@lchrusciel@mastodon.social
@lchrusciel

Contenu connexe

Tendances

Improve PostgreSQL replication with Oracle GoldenGate
Improve PostgreSQL replication with Oracle GoldenGateImprove PostgreSQL replication with Oracle GoldenGate
Improve PostgreSQL replication with Oracle GoldenGateBobby Curtis
 
ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...
ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...
ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...Altinity Ltd
 
Introduction to Rust language programming
Introduction to Rust language programmingIntroduction to Rust language programming
Introduction to Rust language programmingRodolfo Finochietti
 
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹Johnny Sung
 
Hash, Little Baby. Some examples of SAS programming when hash object are real...
Hash, Little Baby. Some examples of SAS programming when hash object are real...Hash, Little Baby. Some examples of SAS programming when hash object are real...
Hash, Little Baby. Some examples of SAS programming when hash object are real...Dmitry Shopin
 
Kubernetes Networking
Kubernetes NetworkingKubernetes Networking
Kubernetes NetworkingCJ Cullen
 
Need for Speed: Removing speed bumps in API Projects
Need for Speed: Removing speed bumps in API ProjectsNeed for Speed: Removing speed bumps in API Projects
Need for Speed: Removing speed bumps in API ProjectsŁukasz Chruściel
 
Kotlin Coroutines Reloaded
Kotlin Coroutines ReloadedKotlin Coroutines Reloaded
Kotlin Coroutines ReloadedRoman Elizarov
 
Job Queue in Golang
Job Queue in GolangJob Queue in Golang
Job Queue in GolangBo-Yi Wu
 
Jenkins Shared Libraries Workshop
Jenkins Shared Libraries WorkshopJenkins Shared Libraries Workshop
Jenkins Shared Libraries WorkshopJulien Pivotto
 
Deep drive into rust programming language
Deep drive into rust programming languageDeep drive into rust programming language
Deep drive into rust programming languageVigneshwer Dhinakaran
 
Dense Retrieval with Apache Solr Neural Search.pdf
Dense Retrieval with Apache Solr Neural Search.pdfDense Retrieval with Apache Solr Neural Search.pdf
Dense Retrieval with Apache Solr Neural Search.pdfSease
 
Let's scale-out PostgreSQL using Citus (English)
Let's scale-out PostgreSQL using Citus (English)Let's scale-out PostgreSQL using Citus (English)
Let's scale-out PostgreSQL using Citus (English)Noriyoshi Shinoda
 
Grafonnet, grafana dashboards as code
Grafonnet, grafana dashboards as codeGrafonnet, grafana dashboards as code
Grafonnet, grafana dashboards as codeJulien Pivotto
 
Cloud-Native CI/CD on Kubernetes with Tekton Pipelines
Cloud-Native CI/CD on Kubernetes with Tekton PipelinesCloud-Native CI/CD on Kubernetes with Tekton Pipelines
Cloud-Native CI/CD on Kubernetes with Tekton PipelinesNikhil Thomas
 
Why Rust? - Matthias Endler - Codemotion Amsterdam 2016
Why Rust? - Matthias Endler - Codemotion Amsterdam 2016Why Rust? - Matthias Endler - Codemotion Amsterdam 2016
Why Rust? - Matthias Endler - Codemotion Amsterdam 2016Codemotion
 
Safely Protect PostgreSQL Passwords - Tell Others to SCRAM
Safely Protect PostgreSQL Passwords - Tell Others to SCRAMSafely Protect PostgreSQL Passwords - Tell Others to SCRAM
Safely Protect PostgreSQL Passwords - Tell Others to SCRAMJonathan Katz
 
Consuming Libraries with CMake
Consuming Libraries with CMakeConsuming Libraries with CMake
Consuming Libraries with CMakeRichard Thomson
 

Tendances (20)

Improve PostgreSQL replication with Oracle GoldenGate
Improve PostgreSQL replication with Oracle GoldenGateImprove PostgreSQL replication with Oracle GoldenGate
Improve PostgreSQL replication with Oracle GoldenGate
 
ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...
ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...
ClickHouse Data Warehouse 101: The First Billion Rows, by Alexander Zaitsev a...
 
Introduction to Rust language programming
Introduction to Rust language programmingIntroduction to Rust language programming
Introduction to Rust language programming
 
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹炎炎夏日學 Android 課程 -  Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
 
kubernetes practice
kubernetes practicekubernetes practice
kubernetes practice
 
Hash, Little Baby. Some examples of SAS programming when hash object are real...
Hash, Little Baby. Some examples of SAS programming when hash object are real...Hash, Little Baby. Some examples of SAS programming when hash object are real...
Hash, Little Baby. Some examples of SAS programming when hash object are real...
 
Kubernetes Networking
Kubernetes NetworkingKubernetes Networking
Kubernetes Networking
 
Need for Speed: Removing speed bumps in API Projects
Need for Speed: Removing speed bumps in API ProjectsNeed for Speed: Removing speed bumps in API Projects
Need for Speed: Removing speed bumps in API Projects
 
Kotlin Coroutines Reloaded
Kotlin Coroutines ReloadedKotlin Coroutines Reloaded
Kotlin Coroutines Reloaded
 
Job Queue in Golang
Job Queue in GolangJob Queue in Golang
Job Queue in Golang
 
Jenkins Shared Libraries Workshop
Jenkins Shared Libraries WorkshopJenkins Shared Libraries Workshop
Jenkins Shared Libraries Workshop
 
Docker + WASM.pdf
Docker + WASM.pdfDocker + WASM.pdf
Docker + WASM.pdf
 
Deep drive into rust programming language
Deep drive into rust programming languageDeep drive into rust programming language
Deep drive into rust programming language
 
Dense Retrieval with Apache Solr Neural Search.pdf
Dense Retrieval with Apache Solr Neural Search.pdfDense Retrieval with Apache Solr Neural Search.pdf
Dense Retrieval with Apache Solr Neural Search.pdf
 
Let's scale-out PostgreSQL using Citus (English)
Let's scale-out PostgreSQL using Citus (English)Let's scale-out PostgreSQL using Citus (English)
Let's scale-out PostgreSQL using Citus (English)
 
Grafonnet, grafana dashboards as code
Grafonnet, grafana dashboards as codeGrafonnet, grafana dashboards as code
Grafonnet, grafana dashboards as code
 
Cloud-Native CI/CD on Kubernetes with Tekton Pipelines
Cloud-Native CI/CD on Kubernetes with Tekton PipelinesCloud-Native CI/CD on Kubernetes with Tekton Pipelines
Cloud-Native CI/CD on Kubernetes with Tekton Pipelines
 
Why Rust? - Matthias Endler - Codemotion Amsterdam 2016
Why Rust? - Matthias Endler - Codemotion Amsterdam 2016Why Rust? - Matthias Endler - Codemotion Amsterdam 2016
Why Rust? - Matthias Endler - Codemotion Amsterdam 2016
 
Safely Protect PostgreSQL Passwords - Tell Others to SCRAM
Safely Protect PostgreSQL Passwords - Tell Others to SCRAMSafely Protect PostgreSQL Passwords - Tell Others to SCRAM
Safely Protect PostgreSQL Passwords - Tell Others to SCRAM
 
Consuming Libraries with CMake
Consuming Libraries with CMakeConsuming Libraries with CMake
Consuming Libraries with CMake
 

Plus de Łukasz Chruściel

Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesŁukasz Chruściel
 
ConFoo 2024 - Need for Speed: Removing speed bumps in API Projects
ConFoo 2024  - Need for Speed: Removing speed bumps in API ProjectsConFoo 2024  - Need for Speed: Removing speed bumps in API Projects
ConFoo 2024 - Need for Speed: Removing speed bumps in API ProjectsŁukasz Chruściel
 
ConFoo 2024 - Sylius 2.0, top-notch eCommerce for customizable solution
ConFoo 2024 - Sylius 2.0, top-notch eCommerce for customizable solutionConFoo 2024 - Sylius 2.0, top-notch eCommerce for customizable solution
ConFoo 2024 - Sylius 2.0, top-notch eCommerce for customizable solutionŁukasz Chruściel
 
SyliusCon - Typical pitfalls of Sylius development.pdf
SyliusCon - Typical pitfalls of Sylius development.pdfSyliusCon - Typical pitfalls of Sylius development.pdf
SyliusCon - Typical pitfalls of Sylius development.pdfŁukasz Chruściel
 
SymfonyLive Online 2023 - Is SOLID dead? .pdf
SymfonyLive Online 2023 - Is SOLID dead? .pdfSymfonyLive Online 2023 - Is SOLID dead? .pdf
SymfonyLive Online 2023 - Is SOLID dead? .pdfŁukasz Chruściel
 
Worldwide Software Architecture Summit'23 - BDD and why most of us do it wron...
Worldwide Software Architecture Summit'23 - BDD and why most of us do it wron...Worldwide Software Architecture Summit'23 - BDD and why most of us do it wron...
Worldwide Software Architecture Summit'23 - BDD and why most of us do it wron...Łukasz Chruściel
 
4Developers - Rozterki i decyzje.pdf
4Developers - Rozterki i decyzje.pdf4Developers - Rozterki i decyzje.pdf
4Developers - Rozterki i decyzje.pdfŁukasz Chruściel
 
4Developers - Sylius CRUD generation revisited.pdf
4Developers - Sylius CRUD generation revisited.pdf4Developers - Sylius CRUD generation revisited.pdf
4Developers - Sylius CRUD generation revisited.pdfŁukasz Chruściel
 
BoilingFrogs - Rozterki i decyzje. Czego się nauczyliśmy projektując API Syliusa
BoilingFrogs - Rozterki i decyzje. Czego się nauczyliśmy projektując API SyliusaBoilingFrogs - Rozterki i decyzje. Czego się nauczyliśmy projektując API Syliusa
BoilingFrogs - Rozterki i decyzje. Czego się nauczyliśmy projektując API SyliusaŁukasz Chruściel
 
What we've learned designing new Sylius API
What we've learned designing new Sylius APIWhat we've learned designing new Sylius API
What we've learned designing new Sylius APIŁukasz Chruściel
 
How to optimize background processes.pdf
How to optimize background processes.pdfHow to optimize background processes.pdf
How to optimize background processes.pdfŁukasz Chruściel
 
Symfony World - Symfony components and design patterns
Symfony World - Symfony components and design patternsSymfony World - Symfony components and design patterns
Symfony World - Symfony components and design patternsŁukasz Chruściel
 
Sylius and Api Platform The story of integration
Sylius and Api Platform The story of integrationSylius and Api Platform The story of integration
Sylius and Api Platform The story of integrationŁukasz Chruściel
 
Dutch php a short tale about state machine
Dutch php   a short tale about state machineDutch php   a short tale about state machine
Dutch php a short tale about state machineŁukasz Chruściel
 
A short tale about state machine
A short tale about state machineA short tale about state machine
A short tale about state machineŁukasz Chruściel
 
A short tale about state machine
A short tale about state machineA short tale about state machine
A short tale about state machineŁukasz Chruściel
 
BDD in practice based on an open source project
BDD in practice based on an open source projectBDD in practice based on an open source project
BDD in practice based on an open source projectŁukasz Chruściel
 
Diversified application testing based on a Sylius project
Diversified application testing based on a Sylius projectDiversified application testing based on a Sylius project
Diversified application testing based on a Sylius projectŁukasz Chruściel
 

Plus de Łukasz Chruściel (19)

Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New Features
 
ConFoo 2024 - Need for Speed: Removing speed bumps in API Projects
ConFoo 2024  - Need for Speed: Removing speed bumps in API ProjectsConFoo 2024  - Need for Speed: Removing speed bumps in API Projects
ConFoo 2024 - Need for Speed: Removing speed bumps in API Projects
 
ConFoo 2024 - Sylius 2.0, top-notch eCommerce for customizable solution
ConFoo 2024 - Sylius 2.0, top-notch eCommerce for customizable solutionConFoo 2024 - Sylius 2.0, top-notch eCommerce for customizable solution
ConFoo 2024 - Sylius 2.0, top-notch eCommerce for customizable solution
 
SyliusCon - Typical pitfalls of Sylius development.pdf
SyliusCon - Typical pitfalls of Sylius development.pdfSyliusCon - Typical pitfalls of Sylius development.pdf
SyliusCon - Typical pitfalls of Sylius development.pdf
 
SymfonyLive Online 2023 - Is SOLID dead? .pdf
SymfonyLive Online 2023 - Is SOLID dead? .pdfSymfonyLive Online 2023 - Is SOLID dead? .pdf
SymfonyLive Online 2023 - Is SOLID dead? .pdf
 
Worldwide Software Architecture Summit'23 - BDD and why most of us do it wron...
Worldwide Software Architecture Summit'23 - BDD and why most of us do it wron...Worldwide Software Architecture Summit'23 - BDD and why most of us do it wron...
Worldwide Software Architecture Summit'23 - BDD and why most of us do it wron...
 
4Developers - Rozterki i decyzje.pdf
4Developers - Rozterki i decyzje.pdf4Developers - Rozterki i decyzje.pdf
4Developers - Rozterki i decyzje.pdf
 
4Developers - Sylius CRUD generation revisited.pdf
4Developers - Sylius CRUD generation revisited.pdf4Developers - Sylius CRUD generation revisited.pdf
4Developers - Sylius CRUD generation revisited.pdf
 
BoilingFrogs - Rozterki i decyzje. Czego się nauczyliśmy projektując API Syliusa
BoilingFrogs - Rozterki i decyzje. Czego się nauczyliśmy projektując API SyliusaBoilingFrogs - Rozterki i decyzje. Czego się nauczyliśmy projektując API Syliusa
BoilingFrogs - Rozterki i decyzje. Czego się nauczyliśmy projektując API Syliusa
 
What we've learned designing new Sylius API
What we've learned designing new Sylius APIWhat we've learned designing new Sylius API
What we've learned designing new Sylius API
 
How to optimize background processes.pdf
How to optimize background processes.pdfHow to optimize background processes.pdf
How to optimize background processes.pdf
 
Symfony World - Symfony components and design patterns
Symfony World - Symfony components and design patternsSymfony World - Symfony components and design patterns
Symfony World - Symfony components and design patterns
 
Sylius and Api Platform The story of integration
Sylius and Api Platform The story of integrationSylius and Api Platform The story of integration
Sylius and Api Platform The story of integration
 
Dutch php a short tale about state machine
Dutch php   a short tale about state machineDutch php   a short tale about state machine
Dutch php a short tale about state machine
 
A short tale about state machine
A short tale about state machineA short tale about state machine
A short tale about state machine
 
A short tale about state machine
A short tale about state machineA short tale about state machine
A short tale about state machine
 
BDD in practice based on an open source project
BDD in practice based on an open source projectBDD in practice based on an open source project
BDD in practice based on an open source project
 
Diversified application testing based on a Sylius project
Diversified application testing based on a Sylius projectDiversified application testing based on a Sylius project
Diversified application testing based on a Sylius project
 
Why do I love and hate php?
Why do I love and hate php?Why do I love and hate php?
Why do I love and hate php?
 

Dernier

Glass Ceramics: Processing and Properties
Glass Ceramics: Processing and PropertiesGlass Ceramics: Processing and Properties
Glass Ceramics: Processing and PropertiesPrabhanshu Chaturvedi
 
Java Programming :Event Handling(Types of Events)
Java Programming :Event Handling(Types of Events)Java Programming :Event Handling(Types of Events)
Java Programming :Event Handling(Types of Events)simmis5
 
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...Call Girls in Nagpur High Profile
 
(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...ranjana rawat
 
UNIT-II FMM-Flow Through Circular Conduits
UNIT-II FMM-Flow Through Circular ConduitsUNIT-II FMM-Flow Through Circular Conduits
UNIT-II FMM-Flow Through Circular Conduitsrknatarajan
 
Extrusion Processes and Their Limitations
Extrusion Processes and Their LimitationsExtrusion Processes and Their Limitations
Extrusion Processes and Their Limitations120cr0395
 
Online banking management system project.pdf
Online banking management system project.pdfOnline banking management system project.pdf
Online banking management system project.pdfKamal Acharya
 
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur High Profile
 
Introduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptxIntroduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptxupamatechverse
 
Call Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service Nashik
Call Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service NashikCall Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service Nashik
Call Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service NashikCall Girls in Nagpur High Profile
 
College Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service NashikCollege Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service NashikCall Girls in Nagpur High Profile
 
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...Dr.Costas Sachpazis
 
Call Girls Service Nagpur Tanvi Call 7001035870 Meet With Nagpur Escorts
Call Girls Service Nagpur Tanvi Call 7001035870 Meet With Nagpur EscortsCall Girls Service Nagpur Tanvi Call 7001035870 Meet With Nagpur Escorts
Call Girls Service Nagpur Tanvi Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur High Profile
 
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...ranjana rawat
 
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...Christo Ananth
 
KubeKraft presentation @CloudNativeHooghly
KubeKraft presentation @CloudNativeHooghlyKubeKraft presentation @CloudNativeHooghly
KubeKraft presentation @CloudNativeHooghlysanyuktamishra911
 
MANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLS
MANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLSMANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLS
MANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLSSIVASHANKAR N
 
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...roncy bisnoi
 

Dernier (20)

Glass Ceramics: Processing and Properties
Glass Ceramics: Processing and PropertiesGlass Ceramics: Processing and Properties
Glass Ceramics: Processing and Properties
 
Java Programming :Event Handling(Types of Events)
Java Programming :Event Handling(Types of Events)Java Programming :Event Handling(Types of Events)
Java Programming :Event Handling(Types of Events)
 
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...Top Rated  Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
Top Rated Pune Call Girls Budhwar Peth ⟟ 6297143586 ⟟ Call Me For Genuine Se...
 
(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
(ANJALI) Dange Chowk Call Girls Just Call 7001035870 [ Cash on Delivery ] Pun...
 
UNIT-II FMM-Flow Through Circular Conduits
UNIT-II FMM-Flow Through Circular ConduitsUNIT-II FMM-Flow Through Circular Conduits
UNIT-II FMM-Flow Through Circular Conduits
 
Water Industry Process Automation & Control Monthly - April 2024
Water Industry Process Automation & Control Monthly - April 2024Water Industry Process Automation & Control Monthly - April 2024
Water Industry Process Automation & Control Monthly - April 2024
 
Extrusion Processes and Their Limitations
Extrusion Processes and Their LimitationsExtrusion Processes and Their Limitations
Extrusion Processes and Their Limitations
 
Online banking management system project.pdf
Online banking management system project.pdfOnline banking management system project.pdf
Online banking management system project.pdf
 
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur EscortsCall Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
Call Girls in Nagpur Suman Call 7001035870 Meet With Nagpur Escorts
 
Introduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptxIntroduction and different types of Ethernet.pptx
Introduction and different types of Ethernet.pptx
 
Call Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service Nashik
Call Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service NashikCall Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service Nashik
Call Girls Service Nashik Vaishnavi 7001305949 Independent Escort Service Nashik
 
College Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service NashikCollege Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
College Call Girls Nashik Nehal 7001305949 Independent Escort Service Nashik
 
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
Sheet Pile Wall Design and Construction: A Practical Guide for Civil Engineer...
 
Call Girls Service Nagpur Tanvi Call 7001035870 Meet With Nagpur Escorts
Call Girls Service Nagpur Tanvi Call 7001035870 Meet With Nagpur EscortsCall Girls Service Nagpur Tanvi Call 7001035870 Meet With Nagpur Escorts
Call Girls Service Nagpur Tanvi Call 7001035870 Meet With Nagpur Escorts
 
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
The Most Attractive Pune Call Girls Budhwar Peth 8250192130 Will You Miss Thi...
 
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
Call for Papers - Educational Administration: Theory and Practice, E-ISSN: 21...
 
KubeKraft presentation @CloudNativeHooghly
KubeKraft presentation @CloudNativeHooghlyKubeKraft presentation @CloudNativeHooghly
KubeKraft presentation @CloudNativeHooghly
 
DJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINE
DJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINEDJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINE
DJARUM4D - SLOT GACOR ONLINE | SLOT DEMO ONLINE
 
MANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLS
MANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLSMANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLS
MANUFACTURING PROCESS-II UNIT-5 NC MACHINE TOOLS
 
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
Call Girls Pimpri Chinchwad Call Me 7737669865 Budget Friendly No Advance Boo...
 

SymfonyCon - Dilemmas and decisions..pdf