Symfony: Why we chose this framework for the PosiFlora accounting system
Kind of tool
Symfony — PHP framework
Where we use it
On the server side of the accounting system for floristry business PosiFlora
Reason to use Symfony
Symfony creates new components quickly, and doesn’t burden the system
Symfony helps programmers re-use code and make fewer errors
Symfony organizes the environment around an easy-to-use code base
We launched the app in 9 months
8,500 users by June 2021
Supports nearly every type of device
The application is compatible with all popular online cash registers: Evotor, ATOL, and Shtrih-M
Only 2 developers are needed for development and support
The PosiFlora app places orders, processes payments, and stores customer data
PosiFlora is a stock control and sales development system for florists. It’s used by online delivery shops, supermarkets, and small retail shops. As of June 2021, PosiFlora is used by 8,500 customers. OrbitSoft developed this total solution from scratch.
With the app, floral managers can:
- Enter a customer’s phone number, name and address, and place orders
- Accept cash and non-cash payments
- Print out receipts
- Store order information in a database
- Keep track of stock levels
- Write off flowers if they are spoiled or wilted
- Assign shifts to employees
- Analyze customer activity
- Plan ongoing and future development for the business
To make it easy for businesses to work with PosiFlora, the system works on any device: executives use computers, managers use tablets, and phones are used by florists to place orders and by couriers for deliveries.
What Symfony offers you
In the course of development we decided to use the popular Symfony framework. Following are the advantages it brings to the service…
Creates new components quickly and doesn’t bog down the system. Developers don’t need to write a lot of code to connect new features to the system. The Symfony framework evolution is perfomed by centralized components creation and new versions, and not by forking.
Example of installing and configuring an optional component for an application:
Once the dependencies are set, the commands in the next section of the composer. json file will be automatically executed. For example cache: clear performs file cache cleanup for the application:
Symfony helps by re-utilizing commonly used code, resulting in fewer mistakes. Many projects need to use a given solution over and over again between different components, for example: for storing data for different platforms.
Symfony has an original system of multiple code use called The Bundle System. This is an out-of-the-box library with a recipe for integrating Dependency Injection into the application container and describing the necessary configuration options. We often use these bundles in our work.
For example, a bundle from which different backend applications communicate with each other and also between client applications in the JSON format with predefined entity schemas.
An example of the bundle:
Symfony organizes the environment around the code base, which is very easy to work with. To make it convenient for the programmer, the framework creates a special environment where it stores files with passwords and addresses in different file formats.
Symfony supports all file formats: native PHP files as well as XML, INI, and YAML. For PosiFlora, we use the YAML format. It’s easy to read and organically describes the necessary parameter structures. The framework by default caches the results of parsing the YAML configuration file. Thanks to this, the performance of the framework isn’t affected.
Example of a configuration file in YAML format:
Symfony results: we launched the application in just 9 months
PosiFlora supports all iPad versions, iPhone versions from 6 up, and over 10,000 Android devices. A single tablet is enough for a retail outlet. Most customers use iPads.
The app adapts according to a client’s needs. If a client has a new task for the system, we try to solve it. For example, we implemented a ranking of supplies according to European markings, added barcode support, and the ability to connect information from different advertising offices. In just two years, we solved more than 2 thousand.
We released 87 new versions of the app in two years. It was automatically updated on all devices at once, without any additional developer involvement.
The app works quickly. When any button is clicked, only part of the page is updated, rather than reloading the whole page as on normal websites. This is possible because the client-server paradigm allows the server-side and the interface-side to be separated.
All order data is stored, even if florists/clients have entered it offline. Interaction with the back-end takes place over the network using the JSON API protocol. On the server-side, the Symfony app accepts and serves requests from clients, communicating with each other via the JSON API, or asynchronously via RabbitMQ message queues.
The application won’t crash, even on holidays when requests increase. Each module is packaged in a container on the server and can be horizontally scaled depending on the load.
Saves money on maintenance. The framework helps save on a company’s development expenditures: only two programmers are needed to write updates and maintain the application. There is no need to pay for the use of the framework and technical support.
8,500 retail shops
1600 Every second, the system processes requests
175,000 sales per day
- Backend: Symfony
- Web Front End: Angular
- Mobile/Desktop App: Qt
- Backend: PHP 7.3–7.4
- Web Front End: TypeScript
- Mobile/Desktop App: C++
- Doctrine ORM
- Swift Maile
- Apache Kafka
Platforms and third-party software:
- Docker, Docker Compose, Docker Swarm
- HashiCorp Consul
- HashiCorp Vault
- Kafka Connect
- Grafana, Graphite, StatsD