├── config ├── routes.yaml ├── packages │ ├── test_cached │ │ ├── twig.yaml │ │ ├── sylius_channel.yaml │ │ ├── fos_rest.yaml │ │ ├── sylius_theme.yaml │ │ ├── sylius_uploader.yaml │ │ ├── fidry_alice_data_fixtures.yaml │ │ ├── framework.yaml │ │ ├── swiftmailer.yaml │ │ ├── monolog.yaml │ │ ├── security_checker.yaml │ │ └── doctrine.yaml │ ├── swiftmailer.yaml │ ├── dev │ │ ├── swiftmailer.yaml │ │ ├── framework.yaml │ │ ├── routing.yaml │ │ ├── nelmio_alice.yaml │ │ ├── web_profiler.yaml │ │ ├── jms_serializer.yaml │ │ ├── monolog.yaml │ │ └── security_checker.yaml │ ├── staging │ │ ├── swiftmailer.yaml │ │ └── monolog.yaml │ ├── test │ │ ├── sylius_theme.yaml │ │ ├── nelmio_alice.yaml │ │ ├── fidry_alice_data_fixtures.yaml │ │ ├── framework.yaml │ │ ├── web_profiler.yaml │ │ ├── swiftmailer.yaml │ │ ├── sylius_uploader.yaml │ │ ├── monolog.yaml │ │ └── security_checker.yaml │ ├── routing.yaml │ ├── validator.yaml │ ├── jms_serializer.yaml │ ├── prod │ │ ├── jms_serializer.yaml │ │ ├── monolog.yaml │ │ └── doctrine.yaml │ ├── liip_imagine.yaml │ ├── translation.yaml │ ├── framework.yaml │ ├── doctrine_migrations.yaml │ ├── twig.yaml │ ├── stof_doctrine_extensions.yaml │ ├── fos_rest.yaml │ ├── doctrine.yaml │ ├── security.yaml │ └── _sylius.yaml ├── services_test_cached.yaml ├── routes │ ├── liip_imagine.yaml │ ├── dev │ │ ├── twig.yaml │ │ └── web_profiler.yaml │ ├── sylius_admin.yaml │ ├── sylius_admin_api.yaml │ ├── test │ │ └── sylius_test_plugin.yaml │ ├── test_cached │ │ └── sylius_test_plugin.yaml │ └── sylius_shop.yaml ├── services_test.yaml ├── bootstrap.php ├── services.yaml └── bundles.php ├── tests └── .gitignore ├── themes └── .gitignore ├── etc └── build │ └── .gitignore ├── features └── .gitignore ├── src ├── Entity │ ├── .gitignore │ ├── Order │ │ ├── Order.php │ │ ├── OrderItem.php │ │ ├── Adjustment.php │ │ ├── OrderItemUnit.php │ │ └── OrderSequence.php │ ├── Addressing │ │ ├── Zone.php │ │ ├── Address.php │ │ ├── Country.php │ │ ├── Province.php │ │ └── ZoneMember.php │ ├── Locale │ │ └── Locale.php │ ├── Channel │ │ ├── Channel.php │ │ └── ChannelPricing.php │ ├── Payment │ │ ├── Payment.php │ │ ├── GatewayConfig.php │ │ ├── PaymentSecurityToken.php │ │ ├── PaymentMethodTranslation.php │ │ └── PaymentMethod.php │ ├── Taxation │ │ ├── TaxRate.php │ │ └── TaxCategory.php │ ├── User │ │ ├── ShopUser.php │ │ ├── AdminUser.php │ │ └── UserOAuth.php │ ├── Customer │ │ ├── Customer.php │ │ └── CustomerGroup.php │ ├── Shipping │ │ ├── Shipment.php │ │ ├── ShippingCategory.php │ │ ├── ShippingMethodTranslation.php │ │ └── ShippingMethod.php │ ├── AdminApi │ │ ├── Client.php │ │ ├── AuthCode.php │ │ ├── AccessToken.php │ │ └── RefreshToken.php │ ├── Currency │ │ ├── Currency.php │ │ └── ExchangeRate.php │ ├── Promotion │ │ ├── Promotion.php │ │ ├── PromotionRule.php │ │ ├── PromotionCoupon.php │ │ └── PromotionAction.php │ ├── Taxonomy │ │ ├── TaxonImage.php │ │ ├── TaxonTranslation.php │ │ └── Taxon.php │ └── Product │ │ ├── ProductImage.php │ │ ├── ProductTaxon.php │ │ ├── ProductReview.php │ │ ├── ProductAssociation.php │ │ ├── ProductTranslation.php │ │ ├── ProductAttributeValue.php │ │ ├── ProductOptionTranslation.php │ │ ├── ProductVariantTranslation.php │ │ ├── ProductAttributeTranslation.php │ │ ├── ProductOptionValueTranslation.php │ │ ├── ProductAssociationTypeTranslation.php │ │ ├── Product.php │ │ ├── ProductOption.php │ │ ├── ProductVariant.php │ │ ├── ProductAttribute.php │ │ ├── ProductOptionValue.php │ │ └── ProductAssociationType.php ├── Controller │ └── .gitignore ├── Migrations │ ├── Version20191119131635.php │ ├── Version20180102140039.php │ ├── Version20190109160409.php │ ├── Version20190621035710.php │ ├── Version20190508083953.php │ ├── Version20190109095211.php │ ├── Version20200301170604.php │ ├── Version20170913125128.php │ └── Version20171003103916.php └── Kernel.php ├── templates ├── .gitignore └── bundles │ └── TwigBundle │ └── Exception │ ├── error.html.twig │ ├── error404.html.twig │ └── error500.html.twig ├── translations └── .gitignore ├── public ├── index.html ├── favicon.ico ├── robots.txt ├── index.php └── .htaccess ├── docker ├── nginx │ ├── Dockerfile │ └── conf.d │ │ └── default.conf └── php-fpm │ └── Dockerfile ├── assets ├── shop │ └── entry.js └── admin │ └── entry.js ├── composer.phar ├── easy-coding-standard.yml ├── phpspec.yaml.dist ├── docs └── images │ └── kubernetes-nginx-php-fpm-mysql.png ├── .babelrc ├── kubernetes ├── volumes │ ├── pv-mysql.yaml │ └── pv-www-claim.yaml ├── services │ └── nginx.yaml ├── start.sh ├── configMap.yaml └── pods │ └── nginx-php-fpm-deployment.yaml ├── .dockerignore ├── .eslintrc.js ├── phpstan.neon ├── .gitignore ├── docker-compose.yml ├── LICENSE ├── bin ├── console └── require-symfony-version ├── .env ├── README.md ├── .editorconfig ├── webpack.config.js ├── package.json ├── behat.yml.dist ├── gulpfile.babel.js ├── composer.json ├── .travis.yml └── symfony.lock /config/routes.yaml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /themes/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /etc/build/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /features/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/Entity/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /templates/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /translations/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/Controller/.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | ciaociaociao 2 | -------------------------------------------------------------------------------- /docker/nginx/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx:alpine 2 | -------------------------------------------------------------------------------- /config/packages/test_cached/twig.yaml: -------------------------------------------------------------------------------- 1 | twig: 2 | strict_variables: true 3 | -------------------------------------------------------------------------------- /assets/shop/entry.js: -------------------------------------------------------------------------------- 1 | import 'sylius/bundle/ShopBundle/Resources/private/entry'; 2 | -------------------------------------------------------------------------------- /config/packages/swiftmailer.yaml: -------------------------------------------------------------------------------- 1 | swiftmailer: 2 | url: '%env(MAILER_URL)%' 3 | -------------------------------------------------------------------------------- /assets/admin/entry.js: -------------------------------------------------------------------------------- 1 | import 'sylius/bundle/AdminBundle/Resources/private/entry'; 2 | -------------------------------------------------------------------------------- /config/packages/dev/swiftmailer.yaml: -------------------------------------------------------------------------------- 1 | swiftmailer: 2 | disable_delivery: true 3 | -------------------------------------------------------------------------------- /config/packages/staging/swiftmailer.yaml: -------------------------------------------------------------------------------- 1 | swiftmailer: 2 | disable_delivery: true 3 | -------------------------------------------------------------------------------- /config/packages/test_cached/sylius_channel.yaml: -------------------------------------------------------------------------------- 1 | sylius_channel: 2 | debug: true 3 | -------------------------------------------------------------------------------- /config/packages/test/sylius_theme.yaml: -------------------------------------------------------------------------------- 1 | sylius_theme: 2 | sources: 3 | test: ~ 4 | -------------------------------------------------------------------------------- /config/services_test_cached.yaml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: "services_test.yaml" } 3 | -------------------------------------------------------------------------------- /config/packages/dev/framework.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | profiler: { only_exceptions: false } 3 | -------------------------------------------------------------------------------- /config/packages/routing.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | router: 3 | strict_requirements: ~ 4 | -------------------------------------------------------------------------------- /config/packages/test_cached/fos_rest.yaml: -------------------------------------------------------------------------------- 1 | fos_rest: 2 | exception: 3 | debug: true 4 | -------------------------------------------------------------------------------- /config/packages/dev/routing.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | router: 3 | strict_requirements: true 4 | -------------------------------------------------------------------------------- /config/packages/test/nelmio_alice.yaml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: ../dev/nelmio_alice.yaml } 3 | -------------------------------------------------------------------------------- /config/packages/test_cached/sylius_theme.yaml: -------------------------------------------------------------------------------- 1 | sylius_theme: 2 | sources: 3 | test: ~ 4 | -------------------------------------------------------------------------------- /config/packages/validator.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | validation: 3 | enable_annotations: true 4 | -------------------------------------------------------------------------------- /templates/bundles/TwigBundle/Exception/error.html.twig: -------------------------------------------------------------------------------- 1 | {% include '@SyliusShop/error.html.twig' %} 2 | -------------------------------------------------------------------------------- /config/packages/dev/nelmio_alice.yaml: -------------------------------------------------------------------------------- 1 | nelmio_alice: 2 | functions_blacklist: 3 | - 'current' 4 | -------------------------------------------------------------------------------- /templates/bundles/TwigBundle/Exception/error404.html.twig: -------------------------------------------------------------------------------- 1 | {% include '@SyliusShop/error404.html.twig' %} 2 | -------------------------------------------------------------------------------- /templates/bundles/TwigBundle/Exception/error500.html.twig: -------------------------------------------------------------------------------- 1 | {% include '@SyliusShop/error500.html.twig' %} 2 | -------------------------------------------------------------------------------- /composer.phar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sergioska/k8s-symfony-web-app-as-a-microservice/HEAD/composer.phar -------------------------------------------------------------------------------- /config/packages/dev/web_profiler.yaml: -------------------------------------------------------------------------------- 1 | web_profiler: 2 | toolbar: true 3 | intercept_redirects: false 4 | -------------------------------------------------------------------------------- /config/packages/test_cached/sylius_uploader.yaml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: "../test/sylius_uploader.yaml" } 3 | -------------------------------------------------------------------------------- /config/packages/test/fidry_alice_data_fixtures.yaml: -------------------------------------------------------------------------------- 1 | fidry_alice_data_fixtures: 2 | default_purge_mode: no_purge 3 | -------------------------------------------------------------------------------- /config/routes/liip_imagine.yaml: -------------------------------------------------------------------------------- 1 | _liip_imagine: 2 | resource: "@LiipImagineBundle/Resources/config/routing.yaml" 3 | -------------------------------------------------------------------------------- /easy-coding-standard.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: 'vendor/sylius-labs/coding-standard/easy-coding-standard.yml' } 3 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sergioska/k8s-symfony-web-app-as-a-microservice/HEAD/public/favicon.ico -------------------------------------------------------------------------------- /config/packages/test_cached/fidry_alice_data_fixtures.yaml: -------------------------------------------------------------------------------- 1 | fidry_alice_data_fixtures: 2 | default_purge_mode: no_purge 3 | -------------------------------------------------------------------------------- /config/packages/test/framework.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | test: ~ 3 | session: 4 | storage_id: session.storage.mock_file 5 | -------------------------------------------------------------------------------- /config/routes/dev/twig.yaml: -------------------------------------------------------------------------------- 1 | _errors: 2 | resource: '@TwigBundle/Resources/config/routing/errors.xml' 3 | prefix: /_error 4 | -------------------------------------------------------------------------------- /phpspec.yaml.dist: -------------------------------------------------------------------------------- 1 | suites: 2 | app: 3 | namespace: App 4 | psr4_prefix: App 5 | src_path: src/ 6 | 7 | -------------------------------------------------------------------------------- /config/packages/jms_serializer.yaml: -------------------------------------------------------------------------------- 1 | jms_serializer: 2 | visitors: 3 | xml: 4 | format_output: '%kernel.debug%' 5 | -------------------------------------------------------------------------------- /config/services_test.yaml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: "../vendor/sylius/sylius/src/Sylius/Behat/Resources/config/services.xml" } 3 | -------------------------------------------------------------------------------- /config/packages/test_cached/framework.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | test: ~ 3 | session: 4 | storage_id: session.storage.mock_file 5 | -------------------------------------------------------------------------------- /config/routes/sylius_admin.yaml: -------------------------------------------------------------------------------- 1 | sylius_admin: 2 | resource: "@SyliusAdminBundle/Resources/config/routing.yml" 3 | prefix: /admin 4 | -------------------------------------------------------------------------------- /public/robots.txt: -------------------------------------------------------------------------------- 1 | # www.robotstxt.org/ 2 | # www.google.com/support/webmasters/bin/answer.py?hl=en&answer=156449 3 | 4 | User-agent: * 5 | -------------------------------------------------------------------------------- /config/routes/sylius_admin_api.yaml: -------------------------------------------------------------------------------- 1 | sylius_admin_api: 2 | resource: "@SyliusAdminApiBundle/Resources/config/routing.yml" 3 | prefix: /api 4 | -------------------------------------------------------------------------------- /config/packages/test/web_profiler.yaml: -------------------------------------------------------------------------------- 1 | web_profiler: 2 | toolbar: false 3 | intercept_redirects: false 4 | 5 | framework: 6 | profiler: { collect: false } 7 | -------------------------------------------------------------------------------- /docs/images/kubernetes-nginx-php-fpm-mysql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sergioska/k8s-symfony-web-app-as-a-microservice/HEAD/docs/images/kubernetes-nginx-php-fpm-mysql.png -------------------------------------------------------------------------------- /config/packages/test/swiftmailer.yaml: -------------------------------------------------------------------------------- 1 | swiftmailer: 2 | disable_delivery: true 3 | logging: true 4 | spool: 5 | type: file 6 | path: "%kernel.cache_dir%/spool" 7 | -------------------------------------------------------------------------------- /config/packages/test_cached/swiftmailer.yaml: -------------------------------------------------------------------------------- 1 | swiftmailer: 2 | disable_delivery: true 3 | logging: true 4 | spool: 5 | type: file 6 | path: "%kernel.cache_dir%/spool" 7 | -------------------------------------------------------------------------------- /config/packages/test/sylius_uploader.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | Sylius\Component\Core\Generator\ImagePathGeneratorInterface: 3 | class: Sylius\Behat\Service\Generator\UploadedImagePathGenerator 4 | -------------------------------------------------------------------------------- /config/packages/test/monolog.yaml: -------------------------------------------------------------------------------- 1 | monolog: 2 | handlers: 3 | main: 4 | type: stream 5 | path: "%kernel.logs_dir%/%kernel.environment%.log" 6 | level: error 7 | -------------------------------------------------------------------------------- /config/packages/prod/jms_serializer.yaml: -------------------------------------------------------------------------------- 1 | jms_serializer: 2 | visitors: 3 | json: 4 | options: 5 | - JSON_UNESCAPED_SLASHES 6 | - JSON_PRESERVE_ZERO_FRACTION 7 | -------------------------------------------------------------------------------- /config/packages/test_cached/monolog.yaml: -------------------------------------------------------------------------------- 1 | monolog: 2 | handlers: 3 | main: 4 | type: stream 5 | path: "%kernel.logs_dir%/%kernel.environment%.log" 6 | level: error 7 | -------------------------------------------------------------------------------- /config/packages/liip_imagine.yaml: -------------------------------------------------------------------------------- 1 | liip_imagine: 2 | resolvers: 3 | default: 4 | web_path: 5 | web_root: "%kernel.project_dir%/public" 6 | cache_prefix: "media/cache" 7 | -------------------------------------------------------------------------------- /config/routes/test/sylius_test_plugin.yaml: -------------------------------------------------------------------------------- 1 | sylius_test_plugin_main: 2 | path: /test/main 3 | controller: FrameworkBundle:Template:template 4 | defaults: 5 | template: "@SyliusTestPlugin/main.html.twig" 6 | -------------------------------------------------------------------------------- /config/routes/test_cached/sylius_test_plugin.yaml: -------------------------------------------------------------------------------- 1 | sylius_test_plugin_main: 2 | path: /test/main 3 | controller: FrameworkBundle:Template:template 4 | defaults: 5 | template: "@SyliusTestPlugin/main.html.twig" 6 | -------------------------------------------------------------------------------- /config/packages/translation.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | default_locale: '%locale%' 3 | translator: 4 | paths: 5 | - '%kernel.project_dir%/translations' 6 | fallbacks: 7 | - '%locale%' 8 | - 'en' 9 | -------------------------------------------------------------------------------- /config/packages/dev/jms_serializer.yaml: -------------------------------------------------------------------------------- 1 | jms_serializer: 2 | visitors: 3 | json: 4 | options: 5 | - JSON_PRETTY_PRINT 6 | - JSON_UNESCAPED_SLASHES 7 | - JSON_PRESERVE_ZERO_FRACTION 8 | -------------------------------------------------------------------------------- /config/packages/framework.yaml: -------------------------------------------------------------------------------- 1 | framework: 2 | translator: { fallbacks: ["%locale%"] } 3 | secret: '%env(APP_SECRET)%' 4 | form: true 5 | csrf_protection: true 6 | templating: { engines: ["twig"] } 7 | session: 8 | handler_id: ~ 9 | -------------------------------------------------------------------------------- /config/routes/dev/web_profiler.yaml: -------------------------------------------------------------------------------- 1 | _wdt: 2 | resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml" 3 | prefix: /_wdt 4 | 5 | _profiler: 6 | resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml" 7 | prefix: /_profiler 8 | -------------------------------------------------------------------------------- /config/packages/doctrine_migrations.yaml: -------------------------------------------------------------------------------- 1 | doctrine_migrations: 2 | dir_name: "%kernel.project_dir%/src/Migrations" 3 | 4 | # Namespace is arbitrary but should be different from App\Migrations as migrations classes should NOT be autoloaded 5 | namespace: DoctrineMigrations 6 | -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | ["env", { 4 | "targets": { 5 | "node": "6" 6 | }, 7 | "useBuiltIns": true 8 | }] 9 | ], 10 | "plugins": [ 11 | ["transform-object-rest-spread", { 12 | "useBuiltIns": true 13 | }] 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /config/packages/dev/monolog.yaml: -------------------------------------------------------------------------------- 1 | monolog: 2 | handlers: 3 | main: 4 | type: stream 5 | path: "%kernel.logs_dir%/%kernel.environment%.log" 6 | level: debug 7 | firephp: 8 | type: firephp 9 | level: info 10 | -------------------------------------------------------------------------------- /kubernetes/volumes/pv-mysql.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: PersistentVolumeClaim 3 | metadata: 4 | name: mysql-pvc 5 | spec: 6 | storageClassName: standard 7 | accessModes: 8 | - ReadWriteOnce 9 | resources: 10 | requests: 11 | storage: 1Gi 12 | -------------------------------------------------------------------------------- /kubernetes/volumes/pv-www-claim.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: PersistentVolumeClaim 3 | metadata: 4 | name: pv-www-claim 5 | spec: 6 | storageClassName: standard 7 | accessModes: 8 | - ReadWriteOnce 9 | resources: 10 | requests: 11 | storage: 5Gi 12 | -------------------------------------------------------------------------------- /kubernetes/services/nginx.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: Service 3 | metadata: 4 | name: nginx 5 | labels: 6 | app: app 7 | spec: 8 | ports: 9 | - name: http 10 | port: 80 11 | targetPort: 80 12 | selector: 13 | app: app 14 | type: LoadBalancer 15 | -------------------------------------------------------------------------------- /config/packages/twig.yaml: -------------------------------------------------------------------------------- 1 | twig: 2 | paths: ['%kernel.project_dir%/templates'] 3 | debug: '%kernel.debug%' 4 | strict_variables: '%kernel.debug%' 5 | 6 | services: 7 | _defaults: 8 | public: false 9 | autowire: true 10 | autoconfigure: true 11 | 12 | Twig\Extra\Intl\IntlExtension: ~ 13 | -------------------------------------------------------------------------------- /config/packages/prod/monolog.yaml: -------------------------------------------------------------------------------- 1 | monolog: 2 | handlers: 3 | main: 4 | type: fingers_crossed 5 | action_level: error 6 | handler: nested 7 | nested: 8 | type: stream 9 | path: "%kernel.logs_dir%/%kernel.environment%.log" 10 | level: debug 11 | -------------------------------------------------------------------------------- /config/packages/staging/monolog.yaml: -------------------------------------------------------------------------------- 1 | monolog: 2 | handlers: 3 | main: 4 | type: fingers_crossed 5 | action_level: error 6 | handler: nested 7 | nested: 8 | type: stream 9 | path: "%kernel.logs_dir%/%kernel.environment%.log" 10 | level: debug 11 | -------------------------------------------------------------------------------- /src/Entity/Order/Order.php: -------------------------------------------------------------------------------- 1 | symfony/framework-bundle ### 21 | /.env.* 22 | /public/bundles 23 | /var/ 24 | /vendor/ 25 | ###< symfony/framework-bundle ### 26 | 27 | ###> friendsofphp/php-cs-fixer ### 28 | /.php_cs 29 | /.php_cs.cache 30 | ###< friendsofphp/php-cs-fixer ### 31 | 32 | ###> phpunit/phpunit ### 33 | /phpunit.xml 34 | ###< phpunit/phpunit ### 35 | -------------------------------------------------------------------------------- /src/Entity/Product/ProductAssociationType.php: -------------------------------------------------------------------------------- 1 | > /usr/local/etc/php/php.ini 26 | 27 | EXPOSE 9000 28 | CMD ["php-fpm"] 29 | 30 | -------------------------------------------------------------------------------- /src/Migrations/Version20191119131635.php: -------------------------------------------------------------------------------- 1 | abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); 15 | 16 | $this->addSql('ALTER TABLE sylius_channel ADD type VARCHAR(255) DEFAULT NULL'); 17 | } 18 | 19 | public function down(Schema $schema): void 20 | { 21 | $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); 22 | 23 | $this->addSql('ALTER TABLE sylius_channel DROP type'); 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 | handle($request); 26 | $response->send(); 27 | $kernel->terminate($request, $response); 28 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.5' 2 | services: 3 | web: 4 | image: nginx:alpine 5 | depends_on: 6 | - php-fpm 7 | ports: 8 | - '80:80' 9 | volumes: 10 | - ./docker/nginx/conf.d/:/etc/nginx/conf.d/ 11 | - ./public:/srv/app/public 12 | 13 | php-fpm: 14 | build: docker/php-fpm 15 | working_dir: '/srv/app' 16 | environment: 17 | DATABASE_URL: mysql://root:root@mysql/sylius_dev 18 | volumes: 19 | - ./:/srv/app/ 20 | 21 | mysql: 22 | image: mysql:5.7.26 23 | environment: 24 | MYSQL_ROOT_PASSWORD: root 25 | MYSQL_USER: root 26 | MYSQL_PASSWORD: root 27 | MYSQL_DATABASE: sylius_dev 28 | ports: 29 | - '3306:3306' 30 | 31 | node: 32 | image: node:10-slim 33 | working_dir: '/srv/app' 34 | volumes: 35 | - './:/srv/app' 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /config/packages/prod/doctrine.yaml: -------------------------------------------------------------------------------- 1 | doctrine: 2 | orm: 3 | metadata_cache_driver: 4 | type: service 5 | id: doctrine.system_cache_provider 6 | query_cache_driver: 7 | type: service 8 | id: doctrine.system_cache_provider 9 | result_cache_driver: 10 | type: service 11 | id: doctrine.result_cache_provider 12 | 13 | services: 14 | doctrine.result_cache_provider: 15 | class: Symfony\Component\Cache\DoctrineProvider 16 | public: false 17 | arguments: 18 | - '@doctrine.result_cache_pool' 19 | doctrine.system_cache_provider: 20 | class: Symfony\Component\Cache\DoctrineProvider 21 | public: false 22 | arguments: 23 | - '@doctrine.system_cache_pool' 24 | 25 | framework: 26 | cache: 27 | pools: 28 | doctrine.result_cache_pool: 29 | adapter: cache.app 30 | doctrine.system_cache_pool: 31 | adapter: cache.system 32 | -------------------------------------------------------------------------------- /config/bootstrap.php: -------------------------------------------------------------------------------- 1 | =1.2) 9 | if (is_array($env = @include dirname(__DIR__).'/.env.local.php')) { 10 | $_SERVER += $env; 11 | $_ENV += $env; 12 | } elseif (!class_exists(Dotenv::class)) { 13 | throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); 14 | } else { 15 | // load all the .env files 16 | (new Dotenv(true))->loadEnv(dirname(__DIR__).'/.env'); 17 | } 18 | 19 | $_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; 20 | $_SERVER['APP_DEBUG'] = $_SERVER['APP_DEBUG'] ?? $_ENV['APP_DEBUG'] ?? 'prod' !== $_SERVER['APP_ENV']; 21 | $_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = (int) $_SERVER['APP_DEBUG'] || filter_var($_SERVER['APP_DEBUG'], FILTER_VALIDATE_BOOLEAN) ? '1' : '0'; 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2011-2018 Paweł Jędrzejewski 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is furnished 8 | to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /src/Migrations/Version20180102140039.php: -------------------------------------------------------------------------------- 1 | abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); 19 | 20 | $this->addSql('CREATE INDEX IDX_16C8119EE551C011 ON sylius_channel (hostname)'); 21 | } 22 | 23 | public function down(Schema $schema): void 24 | { 25 | // this down() migration is auto-generated, please modify it to your needs 26 | $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); 27 | 28 | $this->addSql('DROP INDEX IDX_16C8119EE551C011 ON sylius_channel'); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/Migrations/Version20190109160409.php: -------------------------------------------------------------------------------- 1 | abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); 18 | 19 | $this->addSql('ALTER TABLE sylius_shop_user ADD encoder_name VARCHAR(255) DEFAULT NULL'); 20 | $this->addSql('ALTER TABLE sylius_admin_user ADD encoder_name VARCHAR(255) DEFAULT NULL'); 21 | } 22 | 23 | public function down(Schema $schema): void 24 | { 25 | $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); 26 | 27 | $this->addSql('ALTER TABLE sylius_admin_user DROP encoder_name'); 28 | $this->addSql('ALTER TABLE sylius_shop_user DROP encoder_name'); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /bin/console: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | getParameterOption(['--env', '-e'], null, true)) { 19 | putenv('APP_ENV='.$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = $env); 20 | } 21 | 22 | if ($input->hasParameterOption('--no-debug', true)) { 23 | putenv('APP_DEBUG='.$_SERVER['APP_DEBUG'] = $_ENV['APP_DEBUG'] = '0'); 24 | } 25 | 26 | require dirname(__DIR__).'/config/bootstrap.php'; 27 | 28 | if ($_SERVER['APP_DEBUG']) { 29 | umask(0000); 30 | 31 | if (class_exists(Debug::class)) { 32 | Debug::enable(); 33 | } 34 | } 35 | 36 | $kernel = new Kernel($_SERVER['APP_ENV'], (bool) $_SERVER['APP_DEBUG']); 37 | $application = new Application($kernel); 38 | $application->run($input); 39 | -------------------------------------------------------------------------------- /kubernetes/configMap.yaml: -------------------------------------------------------------------------------- 1 | kind: ConfigMap 2 | apiVersion: v1 3 | metadata: 4 | name: nginx-config 5 | data: 6 | default.conf: | 7 | server { 8 | listen 80 default_server; 9 | listen [::]:80 default_server; 10 | server_name _; 11 | root /srv/app/public; 12 | 13 | location / { 14 | try_files $uri /index.php$is_args$args; 15 | } 16 | 17 | location ~ ^/index\.php(/|$) { 18 | fastcgi_pass 127.0.0.1:9000; 19 | fastcgi_read_timeout 300; 20 | proxy_read_timeout 300; 21 | fastcgi_split_path_info ^(.+\.php)(/.*)$; 22 | include fastcgi_params; 23 | fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; 24 | fastcgi_param DOCUMENT_ROOT $realpath_root; 25 | internal; 26 | } 27 | 28 | location ~ \.php$ { 29 | return 404; 30 | } 31 | 32 | client_max_body_size 6m; 33 | 34 | error_log /var/log/nginx/error.log; 35 | access_log /var/log/nginx/access.log; 36 | } 37 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | # This file is a "template" of which env vars needs to be defined in your configuration or in an .env file 2 | # Set variables here that may be different on each deployment target of the app, e.g. development, staging, production. 3 | # https://symfony.com/doc/current/best_practices/configuration.html#infrastructure-related-configuration 4 | 5 | ###> symfony/framework-bundle ### 6 | APP_ENV=dev 7 | APP_DEBUG=1 8 | APP_SECRET=EDITME 9 | ###< symfony/framework-bundle ### 10 | 11 | ###> doctrine/doctrine-bundle ### 12 | # Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url 13 | # For a sqlite database, use: "sqlite:///%kernel.project_dir%/var/data.db" 14 | # Set "serverVersion" to your server version to avoid edge-case exceptions and extra database calls 15 | DATABASE_URL=mysql://root:root@127.0.0.1/sylius_%kernel.environment% 16 | ###< doctrine/doctrine-bundle ### 17 | 18 | ###> symfony/swiftmailer-bundle ### 19 | # For Gmail as a transport, use: "gmail://username:password@localhost" 20 | # For a generic SMTP server, use: "smtp://localhost:25?encryption=&auth_mode=" 21 | # Delivery is disabled by default via "null://localhost" 22 | MAILER_URL=smtp://localhost 23 | ###< symfony/swiftmailer-bundle ### 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Symfony As A Microservice (web app as a microservice) 2 | 3 | ![](docs/images/kubernetes-nginx-php-fpm-mysql.png) 4 | 5 | This Repo made to explain how to integrate a web application in a microservice context. 6 | 7 | [Kubernetes directory](https://github.com/sergioska/sylius-as-a-microservice/tree/master/kubernetes) can be used as a boilerplate in every web based project that works with nginx/php/mysql stack. 8 | 9 | As it show above schema kubernetes node contains: 10 | 11 | * a multi container pod for nginx and php-fpm 12 | * a persistent volume claim to host code 13 | * a volume for configMap (nginx configuration) 14 | * a pod with a container for MySQL service 15 | * a persistent volume claim for mysql storage 16 | * a service to expose throw forward web server port 80 17 | 18 | ## Run in Kubernetes (minikube) 19 | 20 | To deploy application on your local kubernetes cluster you can execute follow bash script command inside kubernetes directory: 21 | 22 | ``` 23 | bash start.sh 24 | ``` 25 | 26 | so copy source code from local to kubernetes node using kubectl cp 27 | 28 | ```bash 29 | # get web pod name 30 | kubectl get pods 31 | # copy source code in web pod 32 | kubectl cp . default/web-5d5c954d8c-76kmq:/srv/app 33 | ``` 34 | 35 | ## Run with docker 36 | 37 | Also you can run this project in your local docker environment running docker-compose from the root project: 38 | 39 | ``` 40 | docker-compose up 41 | ``` 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /kubernetes/pods/nginx-php-fpm-deployment.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | labels: 5 | app: app 6 | name: web 7 | namespace: default 8 | spec: 9 | replicas: 1 10 | selector: 11 | matchLabels: 12 | app: app 13 | strategy: 14 | type: Recreate 15 | template: 16 | metadata: 17 | labels: 18 | app: app 19 | spec: 20 | containers: 21 | - name: sylius-php-fpm 22 | image: php-fpm:v4 23 | imagePullPolicy: Never 24 | ports: 25 | - containerPort: 9000 26 | name: http 27 | protocol: TCP 28 | volumeMounts: 29 | - name: nginx-config-volume 30 | mountPath: /etc/nginx/conf.d/default.conf 31 | subPath: default.conf 32 | - name: www-storage 33 | mountPath: /srv/app/ 34 | - name: nginx 35 | image: nginx:alpine 36 | imagePullPolicy: Always 37 | ports: 38 | - containerPort: 80 39 | name: http 40 | protocol: TCP 41 | volumeMounts: 42 | - name: nginx-config-volume 43 | mountPath: /etc/nginx/conf.d/default.conf 44 | subPath: default.conf 45 | - name: www-storage 46 | mountPath: /srv/app/ 47 | restartPolicy: Always 48 | serviceAccountName: "" 49 | volumes: 50 | - name: www-storage 51 | persistentVolumeClaim: 52 | claimName: pv-www-claim 53 | - name: nginx-config-volume 54 | configMap: 55 | name: nginx-config -------------------------------------------------------------------------------- /config/services.yaml: -------------------------------------------------------------------------------- 1 | # Put parameters here that don't need to change on each machine where the app is deployed 2 | # https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration 3 | parameters: 4 | locale: en_US 5 | 6 | services: 7 | # Default configuration for services in *this* file 8 | _defaults: 9 | # Automatically injects dependencies in your services 10 | autowire: true 11 | 12 | # Automatically registers your services as commands, event subscribers, etc. 13 | autoconfigure: true 14 | 15 | # Allows optimizing the container by removing unused services; this also means 16 | # fetching services directly from the container via $container->get() won't work 17 | public: false 18 | 19 | _instanceof: 20 | Sylius\Bundle\ResourceBundle\Controller\ResourceController: 21 | autowire: false 22 | Sylius\Bundle\ResourceBundle\Form\Type\AbstractResourceType: 23 | autowire: false 24 | 25 | # Makes classes in src/ available to be used as services; 26 | # this creates a service per class whose id is the fully-qualified class name 27 | App\: 28 | resource: '../src/*' 29 | exclude: '../src/{Entity,Migrations,Tests,Kernel.php}' 30 | 31 | # Controllers are imported separately to make sure services can be injected 32 | # as action arguments even if you don't extend any base controller class 33 | App\Controller\: 34 | resource: '../src/Controller' 35 | tags: ['controller.service_arguments'] 36 | -------------------------------------------------------------------------------- /src/Migrations/Version20190621035710.php: -------------------------------------------------------------------------------- 1 | abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); 24 | 25 | $this->addSql('CREATE TABLE sylius_avatar_image (id INT AUTO_INCREMENT NOT NULL, owner_id INT NOT NULL, type VARCHAR(255) DEFAULT NULL, path VARCHAR(255) NOT NULL, UNIQUE INDEX UNIQ_1068A3A97E3C61F9 (owner_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET UTF8 COLLATE UTF8_unicode_ci ENGINE = InnoDB'); 26 | $this->addSql('ALTER TABLE sylius_avatar_image ADD CONSTRAINT FK_1068A3A97E3C61F9 FOREIGN KEY (owner_id) REFERENCES sylius_admin_user (id) ON DELETE CASCADE'); 27 | } 28 | 29 | public function down(Schema $schema): void 30 | { 31 | // this down() migration is auto-generated, please modify it to your needs 32 | $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); 33 | 34 | $this->addSql('DROP TABLE sylius_avatar_image'); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | [*] 8 | # Change these settings to your own preference 9 | indent_style = space 10 | indent_size = 4 11 | 12 | # We recommend you to keep these unchanged 13 | end_of_line = lf 14 | charset = utf-8 15 | trim_trailing_whitespace = true 16 | insert_final_newline = true 17 | 18 | [*.feature] 19 | indent_style = space 20 | indent_size = 4 21 | 22 | [*.js] 23 | indent_style = space 24 | indent_size = 2 25 | 26 | [*.json] 27 | indent_style = space 28 | indent_size = 2 29 | 30 | [*.md] 31 | indent_style = space 32 | indent_size = 4 33 | trim_trailing_whitespace = false 34 | 35 | [*.neon] 36 | indent_style = space 37 | indent_size = 4 38 | 39 | [*.php] 40 | indent_style = space 41 | indent_size = 4 42 | 43 | [*.sh] 44 | indent_style = space 45 | indent_size = 4 46 | 47 | [*.{yaml,yml}] 48 | indent_style = space 49 | indent_size = 4 50 | trim_trailing_whitespace = false 51 | 52 | [.babelrc] 53 | indent_style = space 54 | indent_size = 2 55 | 56 | [.gitmodules] 57 | indent_style = tab 58 | indent_size = 4 59 | 60 | [.php_cs{,.dist}] 61 | indent_style = space 62 | indent_size = 4 63 | 64 | [composer.json] 65 | indent_style = space 66 | indent_size = 4 67 | 68 | [package.json] 69 | indent_style = space 70 | indent_size = 2 71 | 72 | [phpspec.yml{,.dist}] 73 | indent_style = space 74 | indent_size = 4 75 | 76 | [phpstan.neon] 77 | indent_style = space 78 | indent_size = 4 79 | 80 | [phpunit.xml{,.dist}] 81 | indent_style = space 82 | indent_size = 4 83 | -------------------------------------------------------------------------------- /src/Migrations/Version20190508083953.php: -------------------------------------------------------------------------------- 1 | abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); 24 | 25 | $this->addSql('ALTER TABLE sylius_promotion_coupon ADD reusable_from_cancelled_orders TINYINT(1) DEFAULT \'1\' NOT NULL'); 26 | $this->addSql('CREATE INDEX IDX_6196A1F9A393D2FB43625D9F ON sylius_order (state, updated_at)'); 27 | $this->addSql('ALTER TABLE sylius_product_review CHANGE title title VARCHAR(255) DEFAULT NULL'); 28 | } 29 | 30 | public function down(Schema $schema): void 31 | { 32 | // this down() migration is auto-generated, please modify it to your needs 33 | $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); 34 | 35 | $this->addSql('DROP INDEX IDX_6196A1F9A393D2FB43625D9F ON sylius_order'); 36 | $this->addSql('ALTER TABLE sylius_product_review CHANGE title title VARCHAR(255) NOT NULL COLLATE utf8_unicode_ci'); 37 | $this->addSql('ALTER TABLE sylius_promotion_coupon DROP reusable_from_cancelled_orders'); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const Encore = require('@symfony/webpack-encore'); 3 | 4 | const syliusBundles = path.resolve(__dirname, 'vendor/sylius/sylius/src/Sylius/Bundle/'); 5 | const uiBundleScripts = path.resolve(syliusBundles, 'UiBundle/Resources/private/js/'); 6 | const uiBundleResources = path.resolve(syliusBundles, 'UiBundle/Resources/private/'); 7 | 8 | // Shop config 9 | Encore 10 | .setOutputPath('public/build/shop/') 11 | .setPublicPath('/build/shop') 12 | .addEntry('shop-entry', './assets/shop/entry.js') 13 | .disableSingleRuntimeChunk() 14 | .cleanupOutputBeforeBuild() 15 | .enableSourceMaps(!Encore.isProduction()) 16 | .enableVersioning(Encore.isProduction()) 17 | .enableSassLoader(); 18 | 19 | const shopConfig = Encore.getWebpackConfig(); 20 | 21 | shopConfig.resolve.alias['sylius/ui'] = uiBundleScripts; 22 | shopConfig.resolve.alias['sylius/ui-resources'] = uiBundleResources; 23 | shopConfig.resolve.alias['sylius/bundle'] = syliusBundles; 24 | shopConfig.name = 'shop'; 25 | 26 | Encore.reset(); 27 | 28 | // Admin config 29 | Encore 30 | .setOutputPath('public/build/admin/') 31 | .setPublicPath('/build/admin') 32 | .addEntry('admin-entry', './assets/admin/entry.js') 33 | .disableSingleRuntimeChunk() 34 | .cleanupOutputBeforeBuild() 35 | .enableSourceMaps(!Encore.isProduction()) 36 | .enableVersioning(Encore.isProduction()) 37 | .enableSassLoader(); 38 | 39 | const adminConfig = Encore.getWebpackConfig(); 40 | 41 | adminConfig.resolve.alias['sylius/ui'] = uiBundleScripts; 42 | adminConfig.resolve.alias['sylius/ui-resources'] = uiBundleResources; 43 | adminConfig.resolve.alias['sylius/bundle'] = syliusBundles; 44 | adminConfig.externals = Object.assign({}, adminConfig.externals, { window: 'window', document: 'document' }); 45 | adminConfig.name = 'admin'; 46 | 47 | module.exports = [shopConfig, adminConfig]; 48 | -------------------------------------------------------------------------------- /src/Migrations/Version20190109095211.php: -------------------------------------------------------------------------------- 1 | abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); 18 | 19 | $this->addSql('CREATE TABLE sylius_shop_billing_data (id INT AUTO_INCREMENT NOT NULL, company VARCHAR(255) DEFAULT NULL, tax_id VARCHAR(255) DEFAULT NULL, country_code VARCHAR(255) DEFAULT NULL, street VARCHAR(255) DEFAULT NULL, city VARCHAR(255) DEFAULT NULL, postcode VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET UTF8 COLLATE UTF8_unicode_ci ENGINE = InnoDB'); 20 | $this->addSql('ALTER TABLE sylius_channel ADD shop_billing_data_id INT DEFAULT NULL'); 21 | $this->addSql('ALTER TABLE sylius_channel ADD CONSTRAINT FK_16C8119EB5282EDF FOREIGN KEY (shop_billing_data_id) REFERENCES sylius_shop_billing_data (id) ON DELETE CASCADE'); 22 | $this->addSql('CREATE UNIQUE INDEX UNIQ_16C8119EB5282EDF ON sylius_channel (shop_billing_data_id)'); 23 | } 24 | 25 | public function down(Schema $schema): void 26 | { 27 | $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); 28 | 29 | $this->addSql('ALTER TABLE sylius_channel DROP FOREIGN KEY FK_16C8119EB5282EDF'); 30 | $this->addSql('DROP TABLE sylius_shop_billing_data'); 31 | $this->addSql('DROP INDEX UNIQ_16C8119EB5282EDF ON sylius_channel'); 32 | $this->addSql('ALTER TABLE sylius_channel DROP shop_billing_data_id'); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /docker/nginx/conf.d/default.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | server_name localhost; 4 | root /srv/app/public; 5 | 6 | location / { 7 | # try to serve file directly, fallback to index.php 8 | try_files $uri /index.php$is_args$args; 9 | } 10 | 11 | location ~ ^/index\.php(/|$) { 12 | # Comment the next line and uncomment the next to enable dynamic resolution (incompatible with Kubernetes) 13 | fastcgi_pass php-fpm:9000; 14 | #resolver 127.0.0.11; 15 | #set $upstream_host php; 16 | #fastcgi_pass $upstream_host:9000; 17 | 18 | fastcgi_read_timeout 300; 19 | proxy_read_timeout 300; 20 | 21 | fastcgi_split_path_info ^(.+\.php)(/.*)$; 22 | include fastcgi_params; 23 | # When you are using symlinks to link the document root to the 24 | # current version of your application, you should pass the real 25 | # application path instead of the path to the symlink to PHP 26 | # FPM. 27 | # Otherwise, PHP's OPcache may not properly detect changes to 28 | # your PHP files (see https://github.com/zendtech/ZendOptimizerPlus/issues/126 29 | # for more information). 30 | fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; 31 | fastcgi_param DOCUMENT_ROOT $realpath_root; 32 | # Prevents URIs that include the front controller. This will 404: 33 | # http://domain.tld/index.php/some-path 34 | # Remove the internal directive to allow URIs like this 35 | internal; 36 | } 37 | 38 | # return 404 for all other php files not matching the front controller 39 | # this prevents access to other php files you don't want to be accessible. 40 | location ~ \.php$ { 41 | return 404; 42 | } 43 | 44 | client_max_body_size 6m; 45 | 46 | error_log /var/log/nginx/error.log; 47 | access_log /var/log/nginx/access.log; 48 | } 49 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "babel-polyfill": "^6.26.0", 4 | "chart.js": "^2.9.3", 5 | "jquery": "^3.4.0", 6 | "jquery.dirtyforms": "^2.0.0", 7 | "lightbox2": "^2.9.0", 8 | "lodash.template": "^4.5.0", 9 | "semantic-ui-css": "^2.2.0", 10 | "slick-carousel": "^1.8.1" 11 | }, 12 | "devDependencies": { 13 | "@symfony/webpack-encore": "^0.28.0", 14 | "babel-core": "^6.26.3", 15 | "babel-plugin-external-helpers": "^6.22.0", 16 | "babel-plugin-module-resolver": "^3.1.1", 17 | "babel-plugin-transform-object-rest-spread": "^6.26.0", 18 | "babel-preset-env": "^1.7.0", 19 | "babel-register": "^6.26.0", 20 | "dedent": "^0.7.0", 21 | "eslint": "^4.19.1", 22 | "eslint-config-airbnb-base": "^12.1.0", 23 | "eslint-import-resolver-babel-module": "^4.0.0", 24 | "eslint-plugin-import": "^2.12.0", 25 | "fast-async": "^6.3.7", 26 | "gulp": "^4.0.0", 27 | "gulp-chug": "^0.5", 28 | "gulp-concat": "^2.6.0", 29 | "gulp-debug": "^2.1.2", 30 | "gulp-if": "^2.0.0", 31 | "gulp-livereload": "^4.0.1", 32 | "gulp-order": "^1.1.1", 33 | "gulp-sass": "^4.0.1", 34 | "gulp-sourcemaps": "^1.6.0", 35 | "gulp-uglifycss": "^1.0.5", 36 | "merge-stream": "^1.0.0", 37 | "rollup": "^0.60.7", 38 | "rollup-plugin-babel": "^3.0.4", 39 | "rollup-plugin-commonjs": "^9.1.3", 40 | "rollup-plugin-inject": "^2.0.0", 41 | "rollup-plugin-node-resolve": "^3.3.0", 42 | "rollup-plugin-uglify": "^4.0.0", 43 | "sass-loader": "^7.0.1", 44 | "upath": "^1.1.0", 45 | "yargs": "^6.4.0" 46 | }, 47 | "scripts": { 48 | "build": "gulp build", 49 | "gulp": "gulp build", 50 | "lint": "yarn lint:js", 51 | "lint:js": "eslint gulpfile.babel.js", 52 | "watch": "gulp watch" 53 | }, 54 | "repository": { 55 | "type": "git", 56 | "url": "git+https://github.com/Sylius/Sylius.git" 57 | }, 58 | "author": "Paweł Jędrzejewski", 59 | "license": "MIT" 60 | } 61 | -------------------------------------------------------------------------------- /behat.yml.dist: -------------------------------------------------------------------------------- 1 | imports: 2 | - vendor/sylius/sylius/src/Sylius/Behat/Resources/config/suites.yml 3 | 4 | default: 5 | formatters: 6 | pretty: 7 | verbose: true 8 | paths: false 9 | snippets: false 10 | 11 | extensions: 12 | Lakion\Behat\MinkDebugExtension: 13 | directory: etc/build 14 | clean_start: false 15 | screenshot: true 16 | 17 | Behat\MinkExtension: 18 | files_path: "%paths.base%/vendor/sylius/sylius/src/Sylius/Behat/Resources/fixtures/" 19 | base_url: "http://localhost:8080/" 20 | default_session: symfony 21 | javascript_session: chrome 22 | sessions: 23 | symfony: 24 | symfony: ~ 25 | chrome: 26 | selenium2: 27 | browser: chrome 28 | capabilities: 29 | browserName: chrome 30 | browser: chrome 31 | version: "" 32 | marionette: null # https://github.com/Behat/MinkExtension/pull/311 33 | chrome: 34 | switches: 35 | - "start-fullscreen" 36 | - "start-maximized" 37 | - "no-sandbox" 38 | extra_capabilities: 39 | unexpectedAlertBehaviour: accept 40 | firefox: 41 | selenium2: 42 | browser: firefox 43 | show_auto: false 44 | 45 | FriendsOfBehat\SymfonyExtension: ~ 46 | 47 | FriendsOfBehat\VariadicExtension: ~ 48 | 49 | FriendsOfBehat\SuiteSettingsExtension: 50 | paths: 51 | - "vendor/sylius/sylius/features" 52 | - "features" 53 | 54 | gherkin: 55 | filters: 56 | tags: "~@todo && ~@cli" # CLI is excluded as it registers an error handler that mutes fatal errors 57 | -------------------------------------------------------------------------------- /bin/require-symfony-version: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | $value) { 63 | if (in_array($key, $packages, true)) { 64 | $contents['require'][$key] = $version; 65 | } 66 | } 67 | 68 | foreach ($contents['require-dev'] ?? [] as $key => $value) { 69 | if (in_array($key, $packages, true)) { 70 | $contents['require-dev'][$key] = $version; 71 | } 72 | } 73 | 74 | file_put_contents($path, json_encode($contents, \JSON_PRETTY_PRINT | \JSON_UNESCAPED_SLASHES | \JSON_UNESCAPED_UNICODE)); 75 | -------------------------------------------------------------------------------- /gulpfile.babel.js: -------------------------------------------------------------------------------- 1 | import chug from 'gulp-chug'; 2 | import gulp from 'gulp'; 3 | import yargs from 'yargs'; 4 | 5 | const { argv } = yargs 6 | .options({ 7 | rootPath: { 8 | description: ' path to web assets directory', 9 | type: 'string', 10 | requiresArg: true, 11 | required: false, 12 | }, 13 | nodeModulesPath: { 14 | description: ' path to node_modules directory', 15 | type: 'string', 16 | requiresArg: true, 17 | required: false, 18 | }, 19 | }); 20 | 21 | const config = [ 22 | '--rootPath', 23 | argv.rootPath || '../../../../../../../public/assets', 24 | '--nodeModulesPath', 25 | argv.nodeModulesPath || '../../../../../../../node_modules', 26 | ]; 27 | 28 | export const buildAdmin = function buildAdmin() { 29 | return gulp.src('vendor/sylius/sylius/src/Sylius/Bundle/AdminBundle/gulpfile.babel.js', { read: false }) 30 | .pipe(chug({ args: config, tasks: 'build' })); 31 | }; 32 | buildAdmin.description = 'Build admin assets.'; 33 | 34 | export const watchAdmin = function watchAdmin() { 35 | return gulp.src('vendor/sylius/sylius/src/Sylius/Bundle/AdminBundle/gulpfile.babel.js', { read: false }) 36 | .pipe(chug({ args: config, tasks: 'watch' })); 37 | }; 38 | watchAdmin.description = 'Watch admin asset sources and rebuild on changes.'; 39 | 40 | export const buildShop = function buildShop() { 41 | return gulp.src('vendor/sylius/sylius/src/Sylius/Bundle/ShopBundle/gulpfile.babel.js', { read: false }) 42 | .pipe(chug({ args: config, tasks: 'build' })); 43 | }; 44 | buildShop.description = 'Build shop assets.'; 45 | 46 | export const watchShop = function watchShop() { 47 | return gulp.src('vendor/sylius/sylius/src/Sylius/Bundle/ShopBundle/gulpfile.babel.js', { read: false }) 48 | .pipe(chug({ args: config, tasks: 'watch' })); 49 | }; 50 | watchShop.description = 'Watch shop asset sources and rebuild on changes.'; 51 | 52 | export const build = gulp.parallel(buildAdmin, buildShop); 53 | build.description = 'Build assets.'; 54 | 55 | export const watch = gulp.parallel(watchAdmin, watchShop); 56 | watch.description = 'Watch asset sources and rebuild on changes.'; 57 | 58 | gulp.task('admin', buildAdmin); 59 | gulp.task('admin-watch', watchAdmin); 60 | gulp.task('shop', buildShop); 61 | gulp.task('shop-watch', watchShop); 62 | 63 | export default build; 64 | -------------------------------------------------------------------------------- /src/Migrations/Version20200301170604.php: -------------------------------------------------------------------------------- 1 | abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); 24 | 25 | $this->addSql('CREATE TABLE sylius_channel_countries (channel_id INT NOT NULL, country_id INT NOT NULL, INDEX IDX_D96E51AE72F5A1AA (channel_id), INDEX IDX_D96E51AEF92F3E70 (country_id), PRIMARY KEY(channel_id, country_id)) DEFAULT CHARACTER SET UTF8 COLLATE `UTF8_unicode_ci` ENGINE = InnoDB'); 26 | $this->addSql('ALTER TABLE sylius_channel_countries ADD CONSTRAINT FK_D96E51AE72F5A1AA FOREIGN KEY (channel_id) REFERENCES sylius_channel (id) ON DELETE CASCADE'); 27 | $this->addSql('ALTER TABLE sylius_channel_countries ADD CONSTRAINT FK_D96E51AEF92F3E70 FOREIGN KEY (country_id) REFERENCES sylius_country (id) ON DELETE CASCADE'); 28 | $this->addSql('ALTER TABLE sylius_shipment ADD shipped_at DATETIME DEFAULT NULL'); 29 | $this->addSql('ALTER TABLE sylius_channel ADD menu_taxon_id INT DEFAULT NULL, DROP type'); 30 | $this->addSql('ALTER TABLE sylius_channel ADD CONSTRAINT FK_16C8119EF242B1E6 FOREIGN KEY (menu_taxon_id) REFERENCES sylius_taxon (id) ON DELETE SET NULL'); 31 | $this->addSql('CREATE INDEX IDX_16C8119EF242B1E6 ON sylius_channel (menu_taxon_id)'); 32 | } 33 | 34 | public function down(Schema $schema): void 35 | { 36 | // this down() migration is auto-generated, please modify it to your needs 37 | $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); 38 | 39 | $this->addSql('DROP TABLE sylius_channel_countries'); 40 | $this->addSql('ALTER TABLE sylius_channel DROP FOREIGN KEY FK_16C8119EF242B1E6'); 41 | $this->addSql('DROP INDEX IDX_16C8119EF242B1E6 ON sylius_channel'); 42 | $this->addSql('ALTER TABLE sylius_channel ADD type VARCHAR(255) CHARACTER SET utf8 DEFAULT NULL COLLATE `utf8_unicode_ci`, DROP menu_taxon_id'); 43 | $this->addSql('ALTER TABLE sylius_shipment DROP shipped_at'); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/Migrations/Version20170913125128.php: -------------------------------------------------------------------------------- 1 | abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); 19 | 20 | $this->addSql('ALTER TABLE sylius_order_item ADD product_name VARCHAR(255), ADD variant_name VARCHAR(255)'); 21 | 22 | $this->addSql(' 23 | UPDATE sylius_order_item 24 | INNER JOIN sylius_order ON sylius_order_item.order_id = sylius_order.id 25 | INNER JOIN sylius_product_variant ON sylius_order_item.variant_id = sylius_product_variant.id 26 | INNER JOIN sylius_product ON sylius_product_variant.product_id = sylius_product.id 27 | INNER JOIN sylius_product_translation ON sylius_product_translation.translatable_id = sylius_product.id 28 | SET sylius_order_item.product_name = sylius_product_translation.name 29 | WHERE sylius_product_translation.locale = sylius_order.locale_code 30 | 31 | '); 32 | $this->addSql(' 33 | UPDATE sylius_order_item 34 | INNER JOIN sylius_order ON sylius_order_item.order_id = sylius_order.id 35 | INNER JOIN sylius_product_variant ON sylius_order_item.variant_id = sylius_product_variant.id 36 | INNER JOIN sylius_product_variant_translation ON sylius_product_variant_translation.translatable_id = sylius_product_variant.id 37 | SET sylius_order_item.variant_name = sylius_product_variant_translation.name 38 | WHERE sylius_product_variant_translation.locale = sylius_order.locale_code 39 | '); 40 | 41 | $this->addSql('ALTER TABLE sylius_order_item CHANGE product_name product_name VARCHAR(255) DEFAULT NULL, CHANGE variant_name variant_name VARCHAR(255) DEFAULT NULL'); 42 | } 43 | 44 | public function down(Schema $schema): void 45 | { 46 | // this down() migration is auto-generated, please modify it to your needs 47 | $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.'); 48 | 49 | $this->addSql('ALTER TABLE sylius_order_item DROP product_name, DROP variant_name'); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sylius/sylius-standard", 3 | "description": "Starting point for projects powered by Sylius eCommerce.", 4 | "keywords": ["symfony", "sylius", "distribution", "ecommerce", "cart", "shopping"], 5 | "type": "project", 6 | "license": "MIT", 7 | "homepage": "https://sylius.com", 8 | "authors": [ 9 | { 10 | "name": "Paweł Jędrzejewski" 11 | }, 12 | { 13 | "name": "Sylius project" 14 | }, 15 | { 16 | "name": "Community contributions" 17 | } 18 | ], 19 | "require": { 20 | "php": "^7.3", 21 | "sylius/sylius": "~1.7.0@rc", 22 | "symfony/dotenv": "^4.4", 23 | "symfony/flex": "^1.2" 24 | }, 25 | "require-dev": { 26 | "behat/behat": "^3.6.1", 27 | "behat/mink-selenium2-driver": "^1.3", 28 | "friends-of-behat/mink": "^1.7", 29 | "friends-of-behat/mink-browserkit-driver": "^1.3", 30 | "friends-of-behat/mink-extension": "^2.2", 31 | "friends-of-behat/page-object-extension": "^0.3", 32 | "friends-of-behat/suite-settings-extension": "^1.0", 33 | "friends-of-behat/symfony-extension": "^2.0", 34 | "friends-of-behat/variadic-extension": "^1.1", 35 | "lakion/mink-debug-extension": "^1.2.3", 36 | "lchrusciel/api-test-case": "^3.0", 37 | "phpspec/phpspec": "^6.0", 38 | "phpstan/extension-installer": "^1.0", 39 | "phpstan/phpstan": "0.12.3", 40 | "phpstan/phpstan-doctrine": "0.12.3", 41 | "phpstan/phpstan-webmozart-assert": "0.12.0", 42 | "phpunit/phpunit": "^7.0", 43 | "sensiolabs/security-checker": "^6.0", 44 | "stripe/stripe-php": "^6.28", 45 | "sylius-labs/coding-standard": "^3.0", 46 | "symfony/browser-kit": "^4.4", 47 | "symfony/debug-bundle": "^4.4", 48 | "symfony/intl": "^4.4", 49 | "symfony/web-profiler-bundle": "^4.4" 50 | }, 51 | "prefer-stable": true, 52 | "autoload": { 53 | "psr-4": { 54 | "App\\": "src/" 55 | } 56 | }, 57 | "autoload-dev": { 58 | "psr-4": { 59 | "App\\Tests\\": "tests/" 60 | }, 61 | "classmap": ["src/Kernel.php"] 62 | }, 63 | "scripts": { 64 | "auto-scripts": { 65 | "cache:clear": "symfony-cmd", 66 | "assets:install %PUBLIC_DIR%": "symfony-cmd" 67 | }, 68 | "post-install-cmd": [ 69 | "@auto-scripts" 70 | ], 71 | "post-update-cmd": [ 72 | "@auto-scripts" 73 | ], 74 | "post-create-project-cmd": [ 75 | "@php bin/console sylius:inform-about-gus --ansi", 76 | "@php bin/console sylius:show-available-plugins --ansi" 77 | ] 78 | }, 79 | "config": { 80 | "platform": { 81 | "php": "7.3.15" 82 | }, 83 | "preferred-install": { 84 | "*": "dist" 85 | }, 86 | "sort-packages": true 87 | }, 88 | "extra": { 89 | "symfony": { 90 | "allow-contrib": false 91 | }, 92 | "branch-alias": { 93 | "dev-master": "1.7-dev" 94 | } 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /public/.htaccess: -------------------------------------------------------------------------------- 1 | # Use the front controller as index file. It serves as a fallback solution when 2 | # every other rewrite/redirect fails (e.g. in an aliased environment without 3 | # mod_rewrite). Additionally, this reduces the matching process for the 4 | # start page (path "/") because otherwise Apache will apply the rewriting rules 5 | # to each configured DirectoryIndex file (e.g. index.php, index.html, index.pl). 6 | DirectoryIndex index.php 7 | 8 | # By default, Apache does not evaluate symbolic links if you did not enable this 9 | # feature in your server configuration. Uncomment the following line if you 10 | # install assets as symlinks or if you experience problems related to symlinks 11 | # when compiling LESS/Sass/CoffeScript assets. 12 | # Options FollowSymlinks 13 | 14 | # Disabling MultiViews prevents unwanted negotiation, e.g. "/index" should not resolve 15 | # to the front controller "/index.php" but be rewritten to "/index.php/index". 16 | 17 | Options -MultiViews 18 | 19 | 20 | 21 | RewriteEngine On 22 | 23 | # Determine the RewriteBase automatically and set it as environment variable. 24 | # If you are using Apache aliases to do mass virtual hosting or installed the 25 | # project in a subdirectory, the base path will be prepended to allow proper 26 | # resolution of the index.php file and to redirect to the correct URI. It will 27 | # work in environments without path prefix as well, providing a safe, one-size 28 | # fits all solution. But as you do not need it in this case, you can comment 29 | # the following 2 lines to eliminate the overhead. 30 | RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ 31 | RewriteRule ^(.*) - [E=BASE:%1] 32 | 33 | # Sets the HTTP_AUTHORIZATION header removed by Apache 34 | RewriteCond %{HTTP:Authorization} . 35 | RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 36 | 37 | # Redirect to URI without front controller to prevent duplicate content 38 | # (with and without `/index.php`). Only do this redirect on the initial 39 | # rewrite by Apache and not on subsequent cycles. Otherwise we would get an 40 | # endless redirect loop (request -> rewrite to front controller -> 41 | # redirect -> request -> ...). 42 | # So in case you get a "too many redirects" error or you always get redirected 43 | # to the start page because your Apache does not expose the REDIRECT_STATUS 44 | # environment variable, you have 2 choices: 45 | # - disable this feature by commenting the following 2 lines or 46 | # - use Apache >= 2.3.9 and replace all L flags by END flags and remove the 47 | # following RewriteCond (best solution) 48 | RewriteCond %{ENV:REDIRECT_STATUS} ^$ 49 | RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L] 50 | 51 | # If the requested filename exists, simply serve it. 52 | # We only want to let Apache serve files and not directories. 53 | RewriteCond %{REQUEST_FILENAME} -f 54 | RewriteRule ^ - [L] 55 | 56 | # Rewrite all other queries to the front controller. 57 | RewriteRule ^ %{ENV:BASE}/index.php [L] 58 | 59 | 60 | 61 | 62 | # When mod_rewrite is not available, we instruct a temporary redirect of 63 | # the start page to the front controller explicitly so that the website 64 | # and the generated links can still be used. 65 | RedirectMatch 307 ^/$ /index.php/ 66 | # RedirectTemp cannot be used instead 67 | 68 | 69 | -------------------------------------------------------------------------------- /config/bundles.php: -------------------------------------------------------------------------------- 1 | ['all' => true], 5 | Symfony\Bundle\MonologBundle\MonologBundle::class => ['all' => true], 6 | Symfony\Bundle\SecurityBundle\SecurityBundle::class => ['all' => true], 7 | Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle::class => ['all' => true], 8 | Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], 9 | Doctrine\Bundle\DoctrineBundle\DoctrineBundle::class => ['all' => true], 10 | Doctrine\Bundle\DoctrineCacheBundle\DoctrineCacheBundle::class => ['all' => true], 11 | Sylius\Bundle\OrderBundle\SyliusOrderBundle::class => ['all' => true], 12 | Sylius\Bundle\MoneyBundle\SyliusMoneyBundle::class => ['all' => true], 13 | Sylius\Bundle\CurrencyBundle\SyliusCurrencyBundle::class => ['all' => true], 14 | Sylius\Bundle\LocaleBundle\SyliusLocaleBundle::class => ['all' => true], 15 | Sylius\Bundle\ProductBundle\SyliusProductBundle::class => ['all' => true], 16 | Sylius\Bundle\ChannelBundle\SyliusChannelBundle::class => ['all' => true], 17 | Sylius\Bundle\AttributeBundle\SyliusAttributeBundle::class => ['all' => true], 18 | Sylius\Bundle\TaxationBundle\SyliusTaxationBundle::class => ['all' => true], 19 | Sylius\Bundle\ShippingBundle\SyliusShippingBundle::class => ['all' => true], 20 | Sylius\Bundle\PaymentBundle\SyliusPaymentBundle::class => ['all' => true], 21 | Sylius\Bundle\MailerBundle\SyliusMailerBundle::class => ['all' => true], 22 | Sylius\Bundle\PromotionBundle\SyliusPromotionBundle::class => ['all' => true], 23 | Sylius\Bundle\AddressingBundle\SyliusAddressingBundle::class => ['all' => true], 24 | Sylius\Bundle\InventoryBundle\SyliusInventoryBundle::class => ['all' => true], 25 | Sylius\Bundle\TaxonomyBundle\SyliusTaxonomyBundle::class => ['all' => true], 26 | Sylius\Bundle\UserBundle\SyliusUserBundle::class => ['all' => true], 27 | Sylius\Bundle\CustomerBundle\SyliusCustomerBundle::class => ['all' => true], 28 | Sylius\Bundle\UiBundle\SyliusUiBundle::class => ['all' => true], 29 | Sylius\Bundle\ReviewBundle\SyliusReviewBundle::class => ['all' => true], 30 | Sylius\Bundle\CoreBundle\SyliusCoreBundle::class => ['all' => true], 31 | Sylius\Bundle\ResourceBundle\SyliusResourceBundle::class => ['all' => true], 32 | Sylius\Bundle\GridBundle\SyliusGridBundle::class => ['all' => true], 33 | winzou\Bundle\StateMachineBundle\winzouStateMachineBundle::class => ['all' => true], 34 | Sonata\BlockBundle\SonataBlockBundle::class => ['all' => true], 35 | Bazinga\Bundle\HateoasBundle\BazingaHateoasBundle::class => ['all' => true], 36 | JMS\SerializerBundle\JMSSerializerBundle::class => ['all' => true], 37 | FOS\RestBundle\FOSRestBundle::class => ['all' => true], 38 | Knp\Bundle\GaufretteBundle\KnpGaufretteBundle::class => ['all' => true], 39 | Knp\Bundle\MenuBundle\KnpMenuBundle::class => ['all' => true], 40 | Liip\ImagineBundle\LiipImagineBundle::class => ['all' => true], 41 | Payum\Bundle\PayumBundle\PayumBundle::class => ['all' => true], 42 | Stof\DoctrineExtensionsBundle\StofDoctrineExtensionsBundle::class => ['all' => true], 43 | WhiteOctober\PagerfantaBundle\WhiteOctoberPagerfantaBundle::class => ['all' => true], 44 | Doctrine\Bundle\MigrationsBundle\DoctrineMigrationsBundle::class => ['all' => true], 45 | Sylius\Bundle\FixturesBundle\SyliusFixturesBundle::class => ['all' => true], 46 | Sylius\Bundle\PayumBundle\SyliusPayumBundle::class => ['all' => true], 47 | Sylius\Bundle\ThemeBundle\SyliusThemeBundle::class => ['all' => true], 48 | Sylius\Bundle\AdminBundle\SyliusAdminBundle::class => ['all' => true], 49 | Sylius\Bundle\ShopBundle\SyliusShopBundle::class => ['all' => true], 50 | FOS\OAuthServerBundle\FOSOAuthServerBundle::class => ['all' => true], 51 | Sylius\Bundle\AdminApiBundle\SyliusAdminApiBundle::class => ['all' => true], 52 | Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true, 'test' => true, 'test_cached' => true], 53 | Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true, 'test_cached' => true], 54 | Fidry\AliceDataFixtures\Bridge\Symfony\FidryAliceDataFixturesBundle::class => ['dev' => true, 'test' => true, 'test_cached' => true], 55 | Nelmio\Alice\Bridge\Symfony\NelmioAliceBundle::class => ['dev' => true, 'test' => true, 'test_cached' => true], 56 | FriendsOfBehat\SymfonyExtension\Bundle\FriendsOfBehatSymfonyExtensionBundle::class => ['test' => true, 'test_cached' => true], 57 | Sylius\Behat\Application\SyliusTestPlugin\SyliusTestPlugin::class => ['test' => true, 'test_cached' => true], 58 | ]; 59 | -------------------------------------------------------------------------------- /src/Migrations/Version20171003103916.php: -------------------------------------------------------------------------------- 1 | container = $container; 31 | } 32 | 33 | public function up(Schema $schema): void 34 | { 35 | // this up() migration is auto-generated, please modify it to your needs 36 | $this->abortIf($this->connection->getDatabasePlatform()->getName() != 'mysql', 'Migration can only be executed safely on \'mysql\'.'); 37 | 38 | $defaultLocale = $this->container->getParameter('locale'); 39 | $productAttributeRepository = $this->container->get('sylius.repository.product_attribute'); 40 | Assert::isInstanceOf($productAttributeRepository, ObjectRepository::class); 41 | 42 | $productAttributes = $productAttributeRepository->findBy(['type' => SelectAttributeType::TYPE]); 43 | /** @var ProductAttributeInterface $productAttribute */ 44 | foreach ($productAttributes as $productAttribute) { 45 | $configuration = $productAttribute->getConfiguration(); 46 | $upgradedConfiguration = []; 47 | 48 | foreach ($configuration as $configurationKey => $value) { 49 | if ('choices' === $configurationKey) { 50 | foreach ($value as $key => $choice) { 51 | $upgradedConfiguration[$configurationKey][$key][$defaultLocale] = $choice; 52 | } 53 | 54 | continue; 55 | } 56 | 57 | $upgradedConfiguration[$configurationKey] = $value; 58 | } 59 | 60 | $this->addSql('UPDATE sylius_product_attribute SET configuration = :configuration WHERE id = :id', [ 61 | 'id' => $productAttribute->getId(), 62 | 'configuration' => serialize($upgradedConfiguration), 63 | ]); 64 | } 65 | } 66 | 67 | public function down(Schema $schema): void 68 | { 69 | // this down() migration is auto-generated, please modify it to your needs 70 | $this->abortIf($this->connection->getDatabasePlatform()->getName() != 'mysql', 'Migration can only be executed safely on \'mysql\'.'); 71 | 72 | $defaultLocale = $this->container->getParameter('locale'); 73 | $productAttributeRepository = $this->container->get('sylius.repository.product_attribute'); 74 | Assert::isInstanceOf($productAttributeRepository, ObjectRepository::class); 75 | 76 | $productAttributes = $productAttributeRepository->findBy(['type' => SelectAttributeType::TYPE]); 77 | /** @var ProductAttributeInterface $productAttribute */ 78 | foreach ($productAttributes as $productAttribute) { 79 | $configuration = $productAttribute->getConfiguration(); 80 | $downgradedConfiguration = []; 81 | 82 | foreach ($configuration as $configurationKey => $value) { 83 | if ('choices' === $configurationKey) { 84 | foreach ($value as $key => $choice) { 85 | if (array_key_exists($defaultLocale, $choice)) { 86 | $downgradedConfiguration[$configurationKey][$key] = $choice[$defaultLocale]; 87 | } 88 | } 89 | 90 | continue; 91 | } 92 | 93 | $downgradedConfiguration[$configurationKey] = $value; 94 | } 95 | 96 | $this->addSql('UPDATE sylius_product_attribute SET configuration = :configuration WHERE id = :id', [ 97 | 'id' => $productAttribute->getId(), 98 | 'configuration' => serialize($downgradedConfiguration), 99 | ]); 100 | } 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /src/Kernel.php: -------------------------------------------------------------------------------- 1 | getProjectDir() . '/var/cache/' . $this->environment; 45 | } 46 | 47 | public function getLogDir(): string 48 | { 49 | return $this->getProjectDir() . '/var/log'; 50 | } 51 | 52 | public function registerBundles(): iterable 53 | { 54 | $contents = require $this->getProjectDir() . '/config/bundles.php'; 55 | foreach ($contents as $class => $envs) { 56 | if (isset($envs['all']) || isset($envs[$this->environment])) { 57 | yield new $class(); 58 | } 59 | } 60 | } 61 | 62 | protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void 63 | { 64 | $container->addResource(new FileResource($this->getProjectDir() . '/config/bundles.php')); 65 | $container->setParameter('container.dumper.inline_class_loader', true); 66 | $confDir = $this->getProjectDir() . '/config'; 67 | 68 | $loader->load($confDir . '/{packages}/*' . self::CONFIG_EXTS, 'glob'); 69 | $loader->load($confDir . '/{packages}/' . $this->environment . '/**/*' . self::CONFIG_EXTS, 'glob'); 70 | $loader->load($confDir . '/{services}' . self::CONFIG_EXTS, 'glob'); 71 | $loader->load($confDir . '/{services}_' . $this->environment . self::CONFIG_EXTS, 'glob'); 72 | } 73 | 74 | protected function configureRoutes(RouteCollectionBuilder $routes): void 75 | { 76 | $confDir = $this->getProjectDir() . '/config'; 77 | 78 | $routes->import($confDir . '/{routes}/*' . self::CONFIG_EXTS, '/', 'glob'); 79 | $routes->import($confDir . '/{routes}/' . $this->environment . '/**/*' . self::CONFIG_EXTS, '/', 'glob'); 80 | $routes->import($confDir . '/{routes}' . self::CONFIG_EXTS, '/', 'glob'); 81 | } 82 | 83 | protected function getContainerBaseClass(): string 84 | { 85 | if ($this->isTestEnvironment()) { 86 | return MockerContainer::class; 87 | } 88 | 89 | return parent::getContainerBaseClass(); 90 | } 91 | 92 | protected function getContainerLoader(ContainerInterface $container): LoaderInterface 93 | { 94 | Assert::isInstanceOf($container, ContainerBuilder::class); 95 | 96 | $locator = new FileLocator($this, $this->getRootDir() . '/Resources'); 97 | $resolver = new LoaderResolver([ 98 | new XmlFileLoader($container, $locator), 99 | new YamlFileLoader($container, $locator), 100 | new IniFileLoader($container, $locator), 101 | new PhpFileLoader($container, $locator), 102 | new GlobFileLoader($container, $locator), 103 | new DirectoryLoader($container, $locator), 104 | new ClosureLoader($container), 105 | ]); 106 | 107 | return new DelegatingLoader($resolver); 108 | } 109 | 110 | private function isTestEnvironment(): bool 111 | { 112 | return 0 === strpos($this->getEnvironment(), 'test'); 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /config/packages/security.yaml: -------------------------------------------------------------------------------- 1 | parameters: 2 | sylius.security.admin_regex: "^/admin" 3 | sylius.security.api_regex: "^/api" 4 | sylius.security.shop_regex: "^/(?!admin|api/.*|api$|media/.*)[^/]++" 5 | 6 | security: 7 | always_authenticate_before_granting: true 8 | providers: 9 | sylius_admin_user_provider: 10 | id: sylius.admin_user_provider.email_or_name_based 11 | sylius_shop_user_provider: 12 | id: sylius.shop_user_provider.email_or_name_based 13 | encoders: 14 | Sylius\Component\User\Model\UserInterface: argon2i 15 | firewalls: 16 | admin: 17 | switch_user: true 18 | context: admin 19 | pattern: "%sylius.security.admin_regex%" 20 | provider: sylius_admin_user_provider 21 | form_login: 22 | provider: sylius_admin_user_provider 23 | login_path: sylius_admin_login 24 | check_path: sylius_admin_login_check 25 | failure_path: sylius_admin_login 26 | default_target_path: sylius_admin_dashboard 27 | use_forward: false 28 | use_referer: true 29 | csrf_token_generator: security.csrf.token_manager 30 | csrf_parameter: _csrf_admin_security_token 31 | csrf_token_id: admin_authenticate 32 | remember_me: 33 | secret: "%env(APP_SECRET)%" 34 | path: /admin 35 | name: APP_ADMIN_REMEMBER_ME 36 | lifetime: 31536000 37 | remember_me_parameter: _remember_me 38 | logout: 39 | path: sylius_admin_logout 40 | target: sylius_admin_login 41 | anonymous: true 42 | 43 | oauth_token: 44 | pattern: "%sylius.security.api_regex%/oauth/v2/token" 45 | security: false 46 | 47 | api: 48 | pattern: "%sylius.security.api_regex%/.*" 49 | provider: sylius_admin_user_provider 50 | fos_oauth: true 51 | stateless: true 52 | anonymous: true 53 | 54 | shop: 55 | switch_user: { role: ROLE_ALLOWED_TO_SWITCH } 56 | context: shop 57 | pattern: "%sylius.security.shop_regex%" 58 | provider: sylius_shop_user_provider 59 | form_login: 60 | success_handler: sylius.authentication.success_handler 61 | failure_handler: sylius.authentication.failure_handler 62 | provider: sylius_shop_user_provider 63 | login_path: sylius_shop_login 64 | check_path: sylius_shop_login_check 65 | failure_path: sylius_shop_login 66 | default_target_path: sylius_shop_homepage 67 | use_forward: false 68 | use_referer: true 69 | csrf_token_generator: security.csrf.token_manager 70 | csrf_parameter: _csrf_shop_security_token 71 | csrf_token_id: shop_authenticate 72 | remember_me: 73 | secret: "%env(APP_SECRET)%" 74 | name: APP_SHOP_REMEMBER_ME 75 | lifetime: 31536000 76 | remember_me_parameter: _remember_me 77 | logout: 78 | path: sylius_shop_logout 79 | target: sylius_shop_login 80 | invalidate_session: false 81 | success_handler: sylius.handler.shop_user_logout 82 | anonymous: true 83 | 84 | dev: 85 | pattern: ^/(_(profiler|wdt)|css|images|js)/ 86 | security: false 87 | 88 | access_control: 89 | - { path: "%sylius.security.admin_regex%/_partial", role: IS_AUTHENTICATED_ANONYMOUSLY, ips: [127.0.0.1, ::1] } 90 | - { path: "%sylius.security.admin_regex%/_partial", role: ROLE_NO_ACCESS } 91 | - { path: "%sylius.security.shop_regex%/_partial", role: IS_AUTHENTICATED_ANONYMOUSLY, ips: [127.0.0.1, ::1] } 92 | - { path: "%sylius.security.shop_regex%/_partial", role: ROLE_NO_ACCESS } 93 | 94 | - { path: "%sylius.security.admin_regex%/login", role: IS_AUTHENTICATED_ANONYMOUSLY } 95 | - { path: "%sylius.security.api_regex%/login", role: IS_AUTHENTICATED_ANONYMOUSLY } 96 | - { path: "%sylius.security.shop_regex%/login", role: IS_AUTHENTICATED_ANONYMOUSLY } 97 | 98 | - { path: "%sylius.security.shop_regex%/register", role: IS_AUTHENTICATED_ANONYMOUSLY } 99 | - { path: "%sylius.security.shop_regex%/verify", role: IS_AUTHENTICATED_ANONYMOUSLY } 100 | 101 | - { path: "%sylius.security.admin_regex%", role: ROLE_ADMINISTRATION_ACCESS } 102 | - { path: "%sylius.security.api_regex%/.*", role: ROLE_API_ACCESS } 103 | - { path: "%sylius.security.shop_regex%/account", role: ROLE_USER } 104 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | dist: trusty 4 | 5 | php: 6 | - 7.3 7 | 8 | env: 9 | global: 10 | - APP_ENV=test_cached 11 | 12 | jobs: 13 | include: 14 | - &test 15 | stage: test 16 | name: "Symfony 4.4.* build" 17 | 18 | sudo: false 19 | 20 | env: SYMFONY_VERSION="4.4.*" SYLIUS_CACHE_DIR=$HOME/.sylius-cache SYLIUS_BUILD_DIR=etc/build 21 | 22 | cache: 23 | yarn: true 24 | directories: 25 | - ~/.composer/cache/files 26 | - $SYLIUS_CACHE_DIR 27 | 28 | services: 29 | - memcached 30 | - mysql 31 | 32 | before_install: 33 | - phpenv config-rm xdebug.ini || true 34 | 35 | - echo "memory_limit=4096M" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini 36 | - echo "extension = memcached.so" >> ~/.phpenv/versions/$(phpenv version-name)/etc/conf.d/travis.ini 37 | 38 | - composer self-update --snapshot 39 | 40 | install: 41 | - if [ ! -z "${SYMFONY_VERSION}" ]; then bin/require-symfony-version composer.json "${SYMFONY_VERSION}"; fi 42 | - composer update --no-interaction --prefer-dist 43 | - yarn install 44 | 45 | before_script: 46 | - APP_DEBUG=1 bin/console doctrine:database:create -vvv # Have to be run with debug = true, to omit generating proxies before setting up the database 47 | - bin/console cache:warmup -vvv 48 | - bin/console doctrine:migrations:migrate --no-interaction -vvv 49 | 50 | - bin/console assets:install public -vvv 51 | - yarn build 52 | 53 | # Configure display 54 | - /sbin/start-stop-daemon --start --quiet --pidfile /tmp/xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 2880x1800x16 55 | - export DISPLAY=:99 56 | 57 | # Download Symfony command 58 | - wget https://get.symfony.com/cli/installer -O - | bash 59 | 60 | # Download and configure ChromeDriver 61 | - | 62 | if [ ! -f $SYLIUS_CACHE_DIR/chromedriver ] || [ "$($SYLIUS_CACHE_DIR/chromedriver --version | grep -c 2.34)" = "0" ]; then 63 | curl http://chromedriver.storage.googleapis.com/2.34/chromedriver_linux64.zip > chromedriver.zip 64 | unzip chromedriver.zip 65 | chmod +x chromedriver 66 | mv chromedriver $SYLIUS_CACHE_DIR 67 | fi 68 | 69 | # Run ChromeDriver 70 | - $SYLIUS_CACHE_DIR/chromedriver > /dev/null 2>&1 & 71 | 72 | # Download and configure Selenium 73 | - | 74 | if [ ! -f $SYLIUS_CACHE_DIR/selenium.jar ] || [ "$(java -jar $SYLIUS_CACHE_DIR/selenium.jar --version | grep -c 3.4.0)" = "0" ]; then 75 | curl http://selenium-release.storage.googleapis.com/3.4/selenium-server-standalone-3.4.0.jar > selenium.jar 76 | mv selenium.jar $SYLIUS_CACHE_DIR 77 | fi 78 | 79 | # Run Selenium 80 | - java -Dwebdriver.chrome.driver=$SYLIUS_CACHE_DIR/chromedriver -jar $SYLIUS_CACHE_DIR/selenium.jar > /dev/null 2>&1 & 81 | 82 | # Run webserver 83 | - /home/travis/.symfony/bin/symfony server:start --port=8080 --dir=public --allow-http --no-tls --force-php-discovery --daemon 84 | 85 | script: 86 | - composer validate --strict 87 | 88 | - vendor/bin/security-checker security:check 89 | 90 | - vendor/bin/ecs check src 91 | 92 | - vendor/bin/phpstan analyse -c phpstan.neon -l max src/ 93 | 94 | - vendor/bin/phpspec run --no-interaction -f dot 95 | 96 | - bin/console sylius:fixtures:load --no-interaction -vvv 97 | 98 | - echo "Testing (Behat, without javascript scenarios; ~@javascript && ~@todo && ~@cli)" "Sylius" 99 | - vendor/bin/behat --strict --no-interaction -vvv -f progress --tags="~@javascript && ~@todo && ~@cli" 100 | 101 | - echo "Testing (Behat, only javascript scenarios; @javascript && ~@todo && ~@cli)" "Sylius" 102 | - vendor/bin/behat --strict --no-interaction -vvv -f progress --tags="@javascript && ~@todo && ~@cli" || vendor/bin/behat --strict --no-interaction -vvv -f progress --tags="@javascript && ~@todo && ~@cli" --rerun 103 | 104 | - echo "Testing prod requirements (Composer)" "Sylius" 105 | - APP_ENV=prod && APP_DEBUG=0 && composer install --no-dev --no-interaction --prefer-dist 106 | 107 | after_failure: 108 | - vendor/lakion/mink-debug-extension/travis/tools/upload-textfiles "${SYLIUS_BUILD_DIR}/*.log" 109 | - IMGUR_API_KEY=4907fcd89e761c6b07eeb8292d5a9b2a vendor/lakion/mink-debug-extension/travis/tools/upload-screenshots "${SYLIUS_BUILD_DIR}/*.png" 110 | 111 | - 112 | stage: test 113 | name: "Docker build" 114 | 115 | sudo: required 116 | 117 | env: DOCKER_COMPOSE_VERSION=1.22.0 118 | 119 | services: 120 | - docker 121 | 122 | addons: 123 | apt: 124 | packages: 125 | - docker-ce 126 | 127 | before_install: 128 | # Install custom version of docker-composer 129 | - sudo rm /usr/local/bin/docker-compose 130 | - curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose 131 | - chmod +x docker-compose 132 | - sudo mv docker-compose /usr/local/bin 133 | 134 | # Shutdown vanilla mysql 135 | - sudo service mysql stop 136 | - while sudo lsof -Pi :3306 -sTCP:LISTEN -t; do sleep 1; done 137 | 138 | script: 139 | - docker-compose --version 140 | - docker-compose pull --ignore-pull-failures || true 141 | - docker-compose build --pull 142 | - docker-compose up -d 143 | 144 | - sleep 60 145 | 146 | - docker-compose exec php bin/console sylius:fixtures:load --no-interaction 147 | 148 | - curl http://localhost/ 149 | 150 | before_deploy: 151 | - echo "$DOCKER_PASSWORD" | docker login --username "$DOCKER_USERNAME" --password-stdin "$DOCKER_REGISTRY" 152 | 153 | deploy: 154 | provider: script 155 | script: docker-compose push 156 | skip_cleanup: true 157 | on: 158 | repo: Sylius/Sylius-Standard 159 | tags: true 160 | -------------------------------------------------------------------------------- /config/packages/_sylius.yaml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: "@SyliusCoreBundle/Resources/config/app/config.yml" } 3 | 4 | - { resource: "@SyliusAdminBundle/Resources/config/app/config.yml" } 5 | - { resource: "@SyliusAdminApiBundle/Resources/config/app/config.yml" } 6 | 7 | - { resource: "@SyliusShopBundle/Resources/config/app/config.yml" } 8 | 9 | parameters: 10 | sylius_core.public_dir: '%kernel.project_dir%/public' 11 | 12 | sylius_addressing: 13 | resources: 14 | address: 15 | classes: 16 | model: App\Entity\Addressing\Address 17 | country: 18 | classes: 19 | model: App\Entity\Addressing\Country 20 | province: 21 | classes: 22 | model: App\Entity\Addressing\Province 23 | zone: 24 | classes: 25 | model: App\Entity\Addressing\Zone 26 | zone_member: 27 | classes: 28 | model: App\Entity\Addressing\ZoneMember 29 | 30 | sylius_admin_api: 31 | resources: 32 | api_client: 33 | classes: 34 | model: App\Entity\AdminApi\Client 35 | api_access_token: 36 | classes: 37 | model: App\Entity\AdminApi\AccessToken 38 | api_refresh_token: 39 | classes: 40 | model: App\Entity\AdminApi\RefreshToken 41 | api_auth_code: 42 | classes: 43 | model: App\Entity\AdminApi\AuthCode 44 | 45 | sylius_attribute: 46 | resources: 47 | product: 48 | attribute: 49 | classes: 50 | model: App\Entity\Product\ProductAttribute 51 | translation: 52 | classes: 53 | model: App\Entity\Product\ProductAttributeTranslation 54 | attribute_value: 55 | classes: 56 | model: App\Entity\Product\ProductAttributeValue 57 | 58 | sylius_channel: 59 | resources: 60 | channel: 61 | classes: 62 | model: App\Entity\Channel\Channel 63 | sylius_core: 64 | resources: 65 | product_image: 66 | classes: 67 | model: App\Entity\Product\ProductImage 68 | taxon_image: 69 | classes: 70 | model: App\Entity\Taxonomy\TaxonImage 71 | product_taxon: 72 | classes: 73 | model: App\Entity\Product\ProductTaxon 74 | channel_pricing: 75 | classes: 76 | model: App\Entity\Channel\ChannelPricing 77 | 78 | sylius_currency: 79 | resources: 80 | currency: 81 | classes: 82 | model: App\Entity\Currency\Currency 83 | exchange_rate: 84 | classes: 85 | model: App\Entity\Currency\ExchangeRate 86 | 87 | sylius_customer: 88 | resources: 89 | customer: 90 | classes: 91 | model: App\Entity\Customer\Customer 92 | customer_group: 93 | classes: 94 | model: App\Entity\Customer\CustomerGroup 95 | 96 | sylius_locale: 97 | resources: 98 | locale: 99 | classes: 100 | model: App\Entity\Locale\Locale 101 | 102 | sylius_order: 103 | resources: 104 | order: 105 | classes: 106 | model: App\Entity\Order\Order 107 | order_item: 108 | classes: 109 | model: App\Entity\Order\OrderItem 110 | order_item_unit: 111 | classes: 112 | model: App\Entity\Order\OrderItemUnit 113 | adjustment: 114 | classes: 115 | model: App\Entity\Order\Adjustment 116 | order_sequence: 117 | classes: 118 | model: App\Entity\Order\OrderSequence 119 | 120 | sylius_payment: 121 | resources: 122 | payment_method: 123 | classes: 124 | model: App\Entity\Payment\PaymentMethod 125 | translation: 126 | classes: 127 | model: App\Entity\Payment\PaymentMethodTranslation 128 | payment: 129 | classes: 130 | model: App\Entity\Payment\Payment 131 | 132 | sylius_payum: 133 | resources: 134 | payment_security_token: 135 | classes: 136 | model: App\Entity\Payment\PaymentSecurityToken 137 | gateway_config: 138 | classes: 139 | model: App\Entity\Payment\GatewayConfig 140 | 141 | sylius_product: 142 | resources: 143 | product: 144 | classes: 145 | model: App\Entity\Product\Product 146 | translation: 147 | classes: 148 | model: App\Entity\Product\ProductTranslation 149 | product_variant: 150 | classes: 151 | model: App\Entity\Product\ProductVariant 152 | translation: 153 | classes: 154 | model: App\Entity\Product\ProductVariantTranslation 155 | product_option: 156 | classes: 157 | model: App\Entity\Product\ProductOption 158 | translation: 159 | classes: 160 | model: App\Entity\Product\ProductOptionTranslation 161 | product_option_value: 162 | classes: 163 | model: App\Entity\Product\ProductOptionValue 164 | translation: 165 | classes: 166 | model: App\Entity\Product\ProductOptionValueTranslation 167 | product_association: 168 | classes: 169 | model: App\Entity\Product\ProductAssociation 170 | product_association_type: 171 | classes: 172 | model: App\Entity\Product\ProductAssociationType 173 | translation: 174 | classes: 175 | model: App\Entity\Product\ProductAssociationTypeTranslation 176 | 177 | sylius_promotion: 178 | resources: 179 | promotion: 180 | classes: 181 | model: App\Entity\Promotion\Promotion 182 | promotion_rule: 183 | classes: 184 | model: App\Entity\Promotion\PromotionRule 185 | promotion_action: 186 | classes: 187 | model: App\Entity\Promotion\PromotionAction 188 | promotion_coupon: 189 | classes: 190 | model: App\Entity\Promotion\PromotionCoupon 191 | 192 | sylius_review: 193 | resources: 194 | product: 195 | review: 196 | classes: 197 | model: App\Entity\Product\ProductReview 198 | 199 | sylius_shipping: 200 | resources: 201 | shipment: 202 | classes: 203 | model: App\Entity\Shipping\Shipment 204 | shipping_method: 205 | classes: 206 | model: App\Entity\Shipping\ShippingMethod 207 | translation: 208 | classes: 209 | model: App\Entity\Shipping\ShippingMethodTranslation 210 | shipping_category: 211 | classes: 212 | model: App\Entity\Shipping\ShippingCategory 213 | 214 | sylius_taxation: 215 | resources: 216 | tax_category: 217 | classes: 218 | model: App\Entity\Taxation\TaxCategory 219 | tax_rate: 220 | classes: 221 | model: App\Entity\Taxation\TaxRate 222 | 223 | sylius_taxonomy: 224 | resources: 225 | taxon: 226 | classes: 227 | model: App\Entity\Taxonomy\Taxon 228 | translation: 229 | classes: 230 | model: App\Entity\Taxonomy\TaxonTranslation 231 | sylius_user: 232 | resources: 233 | admin: 234 | user: 235 | classes: 236 | model: App\Entity\User\AdminUser 237 | shop: 238 | user: 239 | classes: 240 | model: App\Entity\User\ShopUser 241 | oauth: 242 | user: 243 | classes: 244 | model: App\Entity\User\UserOAuth 245 | 246 | sylius_shop: 247 | product_grid: 248 | include_all_descendants: true 249 | 250 | sylius_theme: 251 | sources: 252 | filesystem: 253 | scan_depth: 1 254 | directories: 255 | - "%kernel.project_dir%/themes" 256 | -------------------------------------------------------------------------------- /symfony.lock: -------------------------------------------------------------------------------- 1 | { 2 | "akeneo/phpspec-skip-example-extension": { 3 | "version": "v3.0.0" 4 | }, 5 | "behat/behat": { 6 | "version": "v3.5.0" 7 | }, 8 | "behat/gherkin": { 9 | "version": "v4.5.1" 10 | }, 11 | "behat/mink": { 12 | "version": "1.7.x-dev" 13 | }, 14 | "behat/mink-browserkit-driver": { 15 | "version": "1.3.3" 16 | }, 17 | "behat/mink-extension": { 18 | "version": "2.3.1" 19 | }, 20 | "behat/mink-selenium2-driver": { 21 | "version": "v1.3.1" 22 | }, 23 | "behat/transliterator": { 24 | "version": "v1.2.0" 25 | }, 26 | "clue/stream-filter": { 27 | "version": "v1.4.0" 28 | }, 29 | "coduo/php-matcher": { 30 | "version": "3.1.0" 31 | }, 32 | "coduo/php-to-string": { 33 | "version": "2.0.1" 34 | }, 35 | "composer/semver": { 36 | "version": "1.4.2" 37 | }, 38 | "composer/xdebug-handler": { 39 | "version": "1.2.0" 40 | }, 41 | "container-interop/container-interop": { 42 | "version": "1.2.0" 43 | }, 44 | "doctrine/annotations": { 45 | "version": "1.0", 46 | "recipe": { 47 | "repo": "github.com/symfony/recipes", 48 | "branch": "master", 49 | "version": "1.0", 50 | "ref": "cb4152ebcadbe620ea2261da1a1c5a9b8cea7672" 51 | } 52 | }, 53 | "doctrine/cache": { 54 | "version": "v1.8.0" 55 | }, 56 | "doctrine/collections": { 57 | "version": "v1.5.0" 58 | }, 59 | "doctrine/common": { 60 | "version": "v2.9.0" 61 | }, 62 | "doctrine/data-fixtures": { 63 | "version": "v1.3.1" 64 | }, 65 | "doctrine/dbal": { 66 | "version": "v2.8.0" 67 | }, 68 | "doctrine/doctrine-bundle": { 69 | "version": "1.6", 70 | "recipe": { 71 | "repo": "github.com/symfony/recipes", 72 | "branch": "master", 73 | "version": "1.6", 74 | "ref": "ae205d5114e719deb64d2110f56ef910787d1e04" 75 | } 76 | }, 77 | "doctrine/doctrine-cache-bundle": { 78 | "version": "1.3.3" 79 | }, 80 | "doctrine/doctrine-migrations-bundle": { 81 | "version": "1.2", 82 | "recipe": { 83 | "repo": "github.com/symfony/recipes", 84 | "branch": "master", 85 | "version": "1.2", 86 | "ref": "c1431086fec31f17fbcfe6d6d7e92059458facc1" 87 | } 88 | }, 89 | "doctrine/event-manager": { 90 | "version": "v1.0.0" 91 | }, 92 | "doctrine/inflector": { 93 | "version": "v1.3.0" 94 | }, 95 | "doctrine/instantiator": { 96 | "version": "1.1.0" 97 | }, 98 | "doctrine/lexer": { 99 | "version": "v1.0.1" 100 | }, 101 | "doctrine/migrations": { 102 | "version": "v1.8.1" 103 | }, 104 | "doctrine/orm": { 105 | "version": "v2.6.2" 106 | }, 107 | "doctrine/persistence": { 108 | "version": "v1.0.0" 109 | }, 110 | "doctrine/reflection": { 111 | "version": "v1.0.0" 112 | }, 113 | "egulias/email-validator": { 114 | "version": "2.1.5" 115 | }, 116 | "friends-of-behat/mink": { 117 | "version": "v1.8.0" 118 | }, 119 | "friends-of-behat/mink-browserkit-driver": { 120 | "version": "v1.4.0" 121 | }, 122 | "friends-of-behat/mink-extension": { 123 | "version": "v2.4.0" 124 | }, 125 | "friends-of-behat/page-object-extension": { 126 | "version": "0.1" 127 | }, 128 | "friends-of-behat/suite-settings-extension": { 129 | "version": "v1.0.1" 130 | }, 131 | "friends-of-behat/symfony-extension": { 132 | "version": "v1.2.2" 133 | }, 134 | "friends-of-behat/variadic-extension": { 135 | "version": "v1.1.0" 136 | }, 137 | "friendsofphp/php-cs-fixer": { 138 | "version": "2.2", 139 | "recipe": { 140 | "repo": "github.com/symfony/recipes", 141 | "branch": "master", 142 | "version": "2.2", 143 | "ref": "81dee417d2cc60cd1c9d6208dff2ec22a1103e93" 144 | } 145 | }, 146 | "friendsofsymfony/oauth-server-bundle": { 147 | "version": "1.6.1" 148 | }, 149 | "friendsofsymfony/oauth2-php": { 150 | "version": "1.2.3" 151 | }, 152 | "friendsofsymfony/rest-bundle": { 153 | "version": "2.2", 154 | "recipe": { 155 | "repo": "github.com/symfony/recipes-contrib", 156 | "branch": "master", 157 | "version": "2.2", 158 | "ref": "258300d52be6ad59b32a888d5ddafbf9638540ff" 159 | } 160 | }, 161 | "fzaninotto/faker": { 162 | "version": "v1.8.0" 163 | }, 164 | "gedmo/doctrine-extensions": { 165 | "version": "v2.4.36" 166 | }, 167 | "guzzlehttp/guzzle": { 168 | "version": "6.3.3" 169 | }, 170 | "guzzlehttp/promises": { 171 | "version": "v1.3.1" 172 | }, 173 | "guzzlehttp/psr7": { 174 | "version": "1.4.2" 175 | }, 176 | "hamcrest/hamcrest-php": { 177 | "version": "v2.0.0" 178 | }, 179 | "hwi/oauth-bundle": { 180 | "version": "0.6", 181 | "recipe": { 182 | "repo": "github.com/symfony/recipes-contrib", 183 | "branch": "master", 184 | "version": "0.6", 185 | "ref": "20cacc9b2da49d96ea55c8a8dd31324c5be88bc9" 186 | } 187 | }, 188 | "imagine/imagine": { 189 | "version": "v0.7.1" 190 | }, 191 | "instaclick/php-webdriver": { 192 | "version": "1.4.5" 193 | }, 194 | "jdorn/sql-formatter": { 195 | "version": "v1.2.17" 196 | }, 197 | "jean85/pretty-package-versions": { 198 | "version": "1.2" 199 | }, 200 | "jms/metadata": { 201 | "version": "1.6.0" 202 | }, 203 | "jms/parser-lib": { 204 | "version": "1.0.0" 205 | }, 206 | "jms/serializer": { 207 | "version": "1.13.0" 208 | }, 209 | "jms/serializer-bundle": { 210 | "version": "2.0", 211 | "recipe": { 212 | "repo": "github.com/symfony/recipes-contrib", 213 | "branch": "master", 214 | "version": "2.0", 215 | "ref": "fe60ce509ef04a3f40da96e3979bc8d9b13b2372" 216 | } 217 | }, 218 | "knplabs/gaufrette": { 219 | "version": "v0.6.0" 220 | }, 221 | "knplabs/knp-gaufrette-bundle": { 222 | "version": "v0.5.3" 223 | }, 224 | "knplabs/knp-menu": { 225 | "version": "2.3.0" 226 | }, 227 | "knplabs/knp-menu-bundle": { 228 | "version": "v2.2.1" 229 | }, 230 | "lakion/mink-debug-extension": { 231 | "version": "v1.2.3" 232 | }, 233 | "lchrusciel/api-test-case": { 234 | "version": "v3.1.3" 235 | }, 236 | "league/uri": { 237 | "version": "5.3.0" 238 | }, 239 | "league/uri-components": { 240 | "version": "1.8.1" 241 | }, 242 | "league/uri-hostname-parser": { 243 | "version": "1.1.1" 244 | }, 245 | "league/uri-interfaces": { 246 | "version": "1.1.0" 247 | }, 248 | "league/uri-manipulations": { 249 | "version": "1.5.0" 250 | }, 251 | "league/uri-parser": { 252 | "version": "1.4.0" 253 | }, 254 | "league/uri-schemes": { 255 | "version": "1.2.0" 256 | }, 257 | "liip/imagine-bundle": { 258 | "version": "1.8", 259 | "recipe": { 260 | "repo": "github.com/symfony/recipes-contrib", 261 | "branch": "master", 262 | "version": "1.8", 263 | "ref": "7f6676627c1ceeeee204553d24a0545d5f918b7b" 264 | } 265 | }, 266 | "matthiasnoback/symfony-config-test": { 267 | "version": "3.1.1" 268 | }, 269 | "matthiasnoback/symfony-dependency-injection-test": { 270 | "version": "v2.3.1" 271 | }, 272 | "mikey179/vfsstream": { 273 | "version": "v1.6.5" 274 | }, 275 | "mockery/mockery": { 276 | "version": "1.1.0" 277 | }, 278 | "monolog/monolog": { 279 | "version": "1.23.0" 280 | }, 281 | "myclabs/deep-copy": { 282 | "version": "1.8.1" 283 | }, 284 | "nelmio/alice": { 285 | "version": "3.2", 286 | "recipe": { 287 | "repo": "github.com/symfony/recipes-contrib", 288 | "branch": "master", 289 | "version": "3.2", 290 | "ref": "5ef2976310e8f9621c1a722a73bfbe115c1559a3" 291 | } 292 | }, 293 | "nette/finder": { 294 | "version": "v2.4.2" 295 | }, 296 | "nette/robot-loader": { 297 | "version": "v3.0.4" 298 | }, 299 | "nette/utils": { 300 | "version": "v2.5.2" 301 | }, 302 | "nikic/php-parser": { 303 | "version": "v4.3.0" 304 | }, 305 | "ocramius/package-versions": { 306 | "version": "1.3.0" 307 | }, 308 | "ocramius/proxy-manager": { 309 | "version": "2.2.0" 310 | }, 311 | "openlss/lib-array2xml": { 312 | "version": "0.0.10" 313 | }, 314 | "pagerfanta/pagerfanta": { 315 | "version": "v2.0.1" 316 | }, 317 | "pamil/prophecy-common": { 318 | "version": "v0.1.0" 319 | }, 320 | "paragonie/random_compat": { 321 | "version": "v2.0.17" 322 | }, 323 | "payum/iso4217": { 324 | "version": "1.0.1" 325 | }, 326 | "payum/payum": { 327 | "version": "1.5.0" 328 | }, 329 | "payum/payum-bundle": { 330 | "version": "2.3.1" 331 | }, 332 | "phar-io/manifest": { 333 | "version": "1.0.1" 334 | }, 335 | "phar-io/version": { 336 | "version": "1.0.1" 337 | }, 338 | "php": { 339 | "version": "7.3.15" 340 | }, 341 | "php-cs-fixer/diff": { 342 | "version": "v1.3.0" 343 | }, 344 | "php-http/client-common": { 345 | "version": "1.7.0" 346 | }, 347 | "php-http/discovery": { 348 | "version": "1.4.0" 349 | }, 350 | "php-http/guzzle6-adapter": { 351 | "version": "v1.1.1" 352 | }, 353 | "php-http/httplug": { 354 | "version": "v1.1.0" 355 | }, 356 | "php-http/message": { 357 | "version": "1.7.0" 358 | }, 359 | "php-http/message-factory": { 360 | "version": "v1.0.2" 361 | }, 362 | "php-http/promise": { 363 | "version": "v1.0.0" 364 | }, 365 | "phpcollection/phpcollection": { 366 | "version": "0.5.0" 367 | }, 368 | "phpdocumentor/reflection-common": { 369 | "version": "1.0.1" 370 | }, 371 | "phpdocumentor/reflection-docblock": { 372 | "version": "4.3.0" 373 | }, 374 | "phpdocumentor/type-resolver": { 375 | "version": "0.4.0" 376 | }, 377 | "phpoption/phpoption": { 378 | "version": "1.5.0" 379 | }, 380 | "phpspec/php-diff": { 381 | "version": "v1.1.0" 382 | }, 383 | "phpspec/phpspec": { 384 | "version": "4.3.1" 385 | }, 386 | "phpspec/prophecy": { 387 | "version": "1.8.0" 388 | }, 389 | "phpstan/extension-installer": { 390 | "version": "1.0.1" 391 | }, 392 | "phpstan/phpdoc-parser": { 393 | "version": "0.3" 394 | }, 395 | "phpstan/phpstan": { 396 | "version": "0.12.3" 397 | }, 398 | "phpstan/phpstan-doctrine": { 399 | "version": "0.11.5" 400 | }, 401 | "phpstan/phpstan-symfony": { 402 | "version": "0.10.1" 403 | }, 404 | "phpstan/phpstan-webmozart-assert": { 405 | "version": "0.11.2" 406 | }, 407 | "phpunit/php-code-coverage": { 408 | "version": "5.3.2" 409 | }, 410 | "phpunit/php-file-iterator": { 411 | "version": "1.4.5" 412 | }, 413 | "phpunit/php-text-template": { 414 | "version": "1.2.1" 415 | }, 416 | "phpunit/php-timer": { 417 | "version": "1.0.9" 418 | }, 419 | "phpunit/php-token-stream": { 420 | "version": "2.0.2" 421 | }, 422 | "phpunit/phpunit": { 423 | "version": "4.7", 424 | "recipe": { 425 | "repo": "github.com/symfony/recipes", 426 | "branch": "master", 427 | "version": "4.7", 428 | "ref": "c276fa48d4713de91eb410289b3b1834acb7e403" 429 | } 430 | }, 431 | "polishsymfonycommunity/symfony-mocker-container": { 432 | "version": "v1.0.2" 433 | }, 434 | "psr/cache": { 435 | "version": "1.0.1" 436 | }, 437 | "psr/container": { 438 | "version": "1.0.0" 439 | }, 440 | "psr/http-client": { 441 | "version": "1.0.0" 442 | }, 443 | "psr/http-message": { 444 | "version": "1.0.1" 445 | }, 446 | "psr/log": { 447 | "version": "1.0.2" 448 | }, 449 | "psr/simple-cache": { 450 | "version": "1.0.1" 451 | }, 452 | "ralouphie/getallheaders": { 453 | "version": "2.0.5" 454 | }, 455 | "ramsey/uuid": { 456 | "version": "3.8.0" 457 | }, 458 | "sebastian/code-unit-reverse-lookup": { 459 | "version": "1.0.1" 460 | }, 461 | "sebastian/comparator": { 462 | "version": "2.1.3" 463 | }, 464 | "sebastian/diff": { 465 | "version": "2.0.1" 466 | }, 467 | "sebastian/environment": { 468 | "version": "3.1.0" 469 | }, 470 | "sebastian/exporter": { 471 | "version": "3.1.0" 472 | }, 473 | "sebastian/global-state": { 474 | "version": "2.0.0" 475 | }, 476 | "sebastian/object-enumerator": { 477 | "version": "3.0.3" 478 | }, 479 | "sebastian/object-reflector": { 480 | "version": "1.1.1" 481 | }, 482 | "sebastian/recursion-context": { 483 | "version": "3.0.0" 484 | }, 485 | "sebastian/resource-operations": { 486 | "version": "1.0.0" 487 | }, 488 | "sebastian/version": { 489 | "version": "2.0.1" 490 | }, 491 | "sensiolabs/security-checker": { 492 | "version": "4.0", 493 | "recipe": { 494 | "repo": "github.com/symfony/recipes", 495 | "branch": "master", 496 | "version": "4.0", 497 | "ref": "421933bf8f0e75546ac8e00cb3eb12904fa2ac1a" 498 | } 499 | }, 500 | "slevomat/coding-standard": { 501 | "version": "4.6.3" 502 | }, 503 | "sonata-project/block-bundle": { 504 | "version": "3.12.1" 505 | }, 506 | "sonata-project/cache": { 507 | "version": "2.0.1" 508 | }, 509 | "sonata-project/doctrine-extensions": { 510 | "version": "1.1.0" 511 | }, 512 | "sonata-project/form-extensions": { 513 | "version": "1.0.0" 514 | }, 515 | "sonata-project/twig-extensions": { 516 | "version": "1.1.1" 517 | }, 518 | "squizlabs/php_codesniffer": { 519 | "version": "3.3.1" 520 | }, 521 | "stof/doctrine-extensions-bundle": { 522 | "version": "1.2", 523 | "recipe": { 524 | "repo": "github.com/symfony/recipes-contrib", 525 | "branch": "master", 526 | "version": "1.2", 527 | "ref": "6c1ceb662f8997085f739cd089bfbef67f245983" 528 | } 529 | }, 530 | "stripe/stripe-php": { 531 | "version": "v6.28.1" 532 | }, 533 | "swiftmailer/swiftmailer": { 534 | "version": "v6.1.2" 535 | }, 536 | "sylius-labs/association-hydrator": { 537 | "version": "v1.1.0" 538 | }, 539 | "sylius-labs/coding-standard": { 540 | "version": "v2.0.0" 541 | }, 542 | "sylius-labs/polyfill-symfony-event-dispatcher": { 543 | "version": "v1.0.0" 544 | }, 545 | "sylius/fixtures-bundle": { 546 | "version": "v1.4.1" 547 | }, 548 | "sylius/grid-bundle": { 549 | "version": "v1.5.1" 550 | }, 551 | "sylius/mailer-bundle": { 552 | "version": "v1.4.4" 553 | }, 554 | "sylius/registry": { 555 | "version": "v1.4.1" 556 | }, 557 | "sylius/resource-bundle": { 558 | "version": "v1.4.4" 559 | }, 560 | "sylius/sylius": { 561 | "version": "v1.3.6" 562 | }, 563 | "sylius/theme-bundle": { 564 | "version": "v1.4.6" 565 | }, 566 | "symfony/asset": { 567 | "version": "v4.1.3" 568 | }, 569 | "symfony/browser-kit": { 570 | "version": "v4.1.3" 571 | }, 572 | "symfony/cache": { 573 | "version": "v4.1.3" 574 | }, 575 | "symfony/cache-contracts": { 576 | "version": "v1.1.5" 577 | }, 578 | "symfony/config": { 579 | "version": "v4.1.3" 580 | }, 581 | "symfony/console": { 582 | "version": "3.3", 583 | "recipe": { 584 | "repo": "github.com/symfony/recipes", 585 | "branch": "master", 586 | "version": "3.3", 587 | "ref": "e3868d2f4a5104f19f844fe551099a00c6562527" 588 | } 589 | }, 590 | "symfony/contracts": { 591 | "version": "v1.1.8" 592 | }, 593 | "symfony/css-selector": { 594 | "version": "v4.1.3" 595 | }, 596 | "symfony/debug": { 597 | "version": "v4.1.3" 598 | }, 599 | "symfony/debug-bundle": { 600 | "version": "4.1", 601 | "recipe": { 602 | "repo": "github.com/symfony/recipes", 603 | "branch": "master", 604 | "version": "4.1", 605 | "ref": "f8863cbad2f2e58c4b65fa1eac892ab189971bea" 606 | } 607 | }, 608 | "symfony/dependency-injection": { 609 | "version": "v4.1.3" 610 | }, 611 | "symfony/doctrine-bridge": { 612 | "version": "v4.1.3" 613 | }, 614 | "symfony/dom-crawler": { 615 | "version": "v4.1.3" 616 | }, 617 | "symfony/dotenv": { 618 | "version": "v4.1.3" 619 | }, 620 | "symfony/error-handler": { 621 | "version": "v4.4.5" 622 | }, 623 | "symfony/event-dispatcher": { 624 | "version": "v4.1.3" 625 | }, 626 | "symfony/event-dispatcher-contracts": { 627 | "version": "v1.1.5" 628 | }, 629 | "symfony/expression-language": { 630 | "version": "v4.1.3" 631 | }, 632 | "symfony/filesystem": { 633 | "version": "v4.1.3" 634 | }, 635 | "symfony/finder": { 636 | "version": "v4.1.3" 637 | }, 638 | "symfony/flex": { 639 | "version": "1.0", 640 | "recipe": { 641 | "repo": "github.com/symfony/recipes", 642 | "branch": "master", 643 | "version": "1.0", 644 | "ref": "e921bdbfe20cdefa3b82f379d1cd36df1bc8d115" 645 | } 646 | }, 647 | "symfony/form": { 648 | "version": "v4.1.3" 649 | }, 650 | "symfony/framework-bundle": { 651 | "version": "3.3", 652 | "recipe": { 653 | "repo": "github.com/symfony/recipes", 654 | "branch": "master", 655 | "version": "3.3", 656 | "ref": "87c585d24de9f43bca80ebcfd5cf5cb39445d95f" 657 | } 658 | }, 659 | "symfony/http-client": { 660 | "version": "v5.0.5" 661 | }, 662 | "symfony/http-foundation": { 663 | "version": "v4.1.3" 664 | }, 665 | "symfony/http-kernel": { 666 | "version": "v4.1.3" 667 | }, 668 | "symfony/inflector": { 669 | "version": "v4.1.3" 670 | }, 671 | "symfony/intl": { 672 | "version": "v4.1.3" 673 | }, 674 | "symfony/mime": { 675 | "version": "v4.3.1" 676 | }, 677 | "symfony/monolog-bridge": { 678 | "version": "v4.1.3" 679 | }, 680 | "symfony/monolog-bundle": { 681 | "version": "3.1", 682 | "recipe": { 683 | "repo": "github.com/symfony/recipes", 684 | "branch": "master", 685 | "version": "3.1", 686 | "ref": "18ebf5a940573a20de06f9c4060101eeb438cf3d" 687 | } 688 | }, 689 | "symfony/options-resolver": { 690 | "version": "v4.1.3" 691 | }, 692 | "symfony/polyfill-ctype": { 693 | "version": "v1.9.0" 694 | }, 695 | "symfony/polyfill-iconv": { 696 | "version": "v1.9.0" 697 | }, 698 | "symfony/polyfill-intl-icu": { 699 | "version": "v1.9.0" 700 | }, 701 | "symfony/polyfill-intl-idn": { 702 | "version": "v1.11.0" 703 | }, 704 | "symfony/polyfill-mbstring": { 705 | "version": "v1.9.0" 706 | }, 707 | "symfony/polyfill-php70": { 708 | "version": "v1.9.0" 709 | }, 710 | "symfony/polyfill-php72": { 711 | "version": "v1.9.0" 712 | }, 713 | "symfony/polyfill-php73": { 714 | "version": "v1.11.0" 715 | }, 716 | "symfony/process": { 717 | "version": "v4.1.3" 718 | }, 719 | "symfony/property-access": { 720 | "version": "v4.1.3" 721 | }, 722 | "symfony/proxy-manager-bridge": { 723 | "version": "v4.1.3" 724 | }, 725 | "symfony/routing": { 726 | "version": "4.0", 727 | "recipe": { 728 | "repo": "github.com/symfony/recipes", 729 | "branch": "master", 730 | "version": "4.0", 731 | "ref": "cda8b550123383d25827705d05a42acf6819fe4e" 732 | } 733 | }, 734 | "symfony/security": { 735 | "version": "v4.1.3" 736 | }, 737 | "symfony/security-bundle": { 738 | "version": "3.3", 739 | "recipe": { 740 | "repo": "github.com/symfony/recipes", 741 | "branch": "master", 742 | "version": "3.3", 743 | "ref": "f8a63faa0d9521526499c0a8f403c9964ecb0527" 744 | } 745 | }, 746 | "symfony/service-contracts": { 747 | "version": "v1.1.6" 748 | }, 749 | "symfony/stopwatch": { 750 | "version": "v4.1.3" 751 | }, 752 | "symfony/swiftmailer-bundle": { 753 | "version": "2.5", 754 | "recipe": { 755 | "repo": "github.com/symfony/recipes", 756 | "branch": "master", 757 | "version": "2.5", 758 | "ref": "3db029c03e452b4a23f7fc45cec7c922c2247eb8" 759 | } 760 | }, 761 | "symfony/templating": { 762 | "version": "v4.1.3" 763 | }, 764 | "symfony/thanks": { 765 | "version": "v1.0.8" 766 | }, 767 | "symfony/translation": { 768 | "version": "3.3", 769 | "recipe": { 770 | "repo": "github.com/symfony/recipes", 771 | "branch": "master", 772 | "version": "3.3", 773 | "ref": "6bcd6c570c017ea6ae5a7a6a027c929fd3542cd8" 774 | } 775 | }, 776 | "symfony/translation-contracts": { 777 | "version": "v1.1.6" 778 | }, 779 | "symfony/twig-bridge": { 780 | "version": "v4.1.3" 781 | }, 782 | "symfony/twig-bundle": { 783 | "version": "3.3", 784 | "recipe": { 785 | "repo": "github.com/symfony/recipes", 786 | "branch": "master", 787 | "version": "3.3", 788 | "ref": "f75ac166398e107796ca94cc57fa1edaa06ec47f" 789 | } 790 | }, 791 | "symfony/validator": { 792 | "version": "4.1", 793 | "recipe": { 794 | "repo": "github.com/symfony/recipes", 795 | "branch": "master", 796 | "version": "4.1", 797 | "ref": "0cdc982334f45d554957a6167e030482795bf9d7" 798 | } 799 | }, 800 | "symfony/var-dumper": { 801 | "version": "v4.1.3" 802 | }, 803 | "symfony/var-exporter": { 804 | "version": "v4.2.1" 805 | }, 806 | "symfony/web-profiler-bundle": { 807 | "version": "3.3", 808 | "recipe": { 809 | "repo": "github.com/symfony/recipes", 810 | "branch": "master", 811 | "version": "3.3", 812 | "ref": "6bdfa1a95f6b2e677ab985cd1af2eae35d62e0f6" 813 | } 814 | }, 815 | "symfony/yaml": { 816 | "version": "v4.1.3" 817 | }, 818 | "symplify/coding-standard": { 819 | "version": "v4.6.1" 820 | }, 821 | "symplify/easy-coding-standard": { 822 | "version": "v4.6.1" 823 | }, 824 | "symplify/package-builder": { 825 | "version": "v4.6.1" 826 | }, 827 | "symplify/set-config-resolver": { 828 | "version": "v7.1.3" 829 | }, 830 | "symplify/smart-file-system": { 831 | "version": "v7.1.3" 832 | }, 833 | "theofidry/alice-data-fixtures": { 834 | "version": "1.0", 835 | "recipe": { 836 | "repo": "github.com/symfony/recipes-contrib", 837 | "branch": "master", 838 | "version": "1.0", 839 | "ref": "fe5a50faf580eb58f08ada2abe8afbd2d4941e05" 840 | } 841 | }, 842 | "theseer/tokenizer": { 843 | "version": "1.1.0" 844 | }, 845 | "twig/intl-extra": { 846 | "version": "v2.12.5" 847 | }, 848 | "twig/twig": { 849 | "version": "v2.5.0" 850 | }, 851 | "webmozart/assert": { 852 | "version": "1.3.0" 853 | }, 854 | "white-october/pagerfanta-bundle": { 855 | "version": "v1.2.1" 856 | }, 857 | "willdurand/hateoas": { 858 | "version": "2.12.0" 859 | }, 860 | "willdurand/hateoas-bundle": { 861 | "version": "1.4.0" 862 | }, 863 | "willdurand/jsonp-callback-validator": { 864 | "version": "v1.1.0" 865 | }, 866 | "willdurand/negotiation": { 867 | "version": "v2.3.1" 868 | }, 869 | "winzou/state-machine": { 870 | "version": "0.3.3" 871 | }, 872 | "winzou/state-machine-bundle": { 873 | "version": "v0.3.1" 874 | }, 875 | "zendframework/zend-code": { 876 | "version": "3.3.1" 877 | }, 878 | "zendframework/zend-eventmanager": { 879 | "version": "3.2.1" 880 | }, 881 | "zendframework/zend-hydrator": { 882 | "version": "2.4.0" 883 | }, 884 | "zendframework/zend-stdlib": { 885 | "version": "3.2.0" 886 | } 887 | } 888 | --------------------------------------------------------------------------------