├── .env ├── .gitignore ├── Makefile ├── README.md ├── app ├── .gitignore ├── README.md ├── app │ ├── .htaccess │ ├── AppCache.php │ ├── AppKernel.php │ ├── Resources │ │ └── views │ │ │ ├── base.html.twig │ │ │ └── default │ │ │ └── index.html.twig │ └── config │ │ ├── config.yml │ │ ├── config_dev.yml │ │ ├── config_prod.yml │ │ ├── config_test.yml │ │ ├── parameters.yml.dist │ │ ├── routing.yml │ │ ├── routing_dev.yml │ │ ├── security.yml │ │ └── services.yml ├── bin │ ├── console │ └── symfony_requirements ├── composer.json ├── composer.lock ├── phpunit.xml.dist ├── src │ ├── .htaccess │ └── AppBundle │ │ ├── AppBundle.php │ │ └── Controller │ │ └── DefaultController.php ├── tests │ └── AppBundle │ │ └── Controller │ │ └── DefaultControllerTest.php ├── var │ ├── SymfonyRequirements.php │ ├── cache │ │ └── .gitkeep │ ├── logs │ │ └── .gitkeep │ └── sessions │ │ └── .gitkeep └── web │ ├── .htaccess │ ├── app.php │ ├── app_dev.php │ ├── apple-touch-icon.png │ ├── config.php │ ├── favicon.ico │ └── robots.txt └── docker-compose.yml /.env: -------------------------------------------------------------------------------- 1 | SECRET_KEY=somesupersecretkey 2 | MYSQL_HOST=db 3 | MYSQL_PORT=3306 4 | MYSQL_DATABASE=db_dev 5 | MYSQL_USER=dbuser 6 | MYSQL_PASSWORD=dbpassword 7 | MYSQL_ROOT_PASSWORD=root_dbpassword 8 | MAILER_HOST=127.0.0.1 9 | MAILER_USER=~ 10 | MAILER_PASSWORD=~ 11 | MAILER_PORT=465 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ``` 2 | # Cache and logs (Symfony2) 3 | /app/cache/* 4 | /app/logs/* 5 | !app/cache/.gitkeep 6 | !app/logs/.gitkeep 7 | 8 | # Cache and logs (Symfony3) 9 | /var/cache/* 10 | /var/logs/* 11 | /var/sessions/* 12 | !var/cache/.gitkeep 13 | !var/logs/.gitkeep 14 | !var/sessions/.gitkeep 15 | 16 | # Parameters 17 | /app/config/.env 18 | /app/config/parameters.yml 19 | /app/config/parameters.ini 20 | 21 | # Managed by Composer 22 | /app/bootstrap.php.cache 23 | /var/bootstrap.php.cache 24 | /bin/* 25 | !bin/console 26 | !bin/symfony_requirements 27 | /vendor/ 28 | 29 | # Assets and user uploads 30 | /web/bundles/ 31 | /web/uploads/ 32 | 33 | # PHPUnit 34 | /app/phpunit.xml 35 | /phpunit.xml 36 | 37 | # Build data 38 | /build/ 39 | 40 | # Bower components 41 | /bower_components/ 42 | 43 | # Node modules 44 | /node_modules/ 45 | 46 | # Codeception output 47 | /tests/_output/* 48 | 49 | # Composer PHAR 50 | /composer.phar 51 | .idea/* 52 | workspace.xml 53 | 54 | # Blog 55 | !web/blog/.htaccess 56 | web/blog/* 57 | /web/blog/* 58 | 59 | # Documentation Temp Files 60 | *.~vsdx 61 | 62 | # Docker 63 | /volumes/* 64 | ``` -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | dev: 2 | @docker-compose down && \ 3 | docker-compose build --pull --no-cache && \ 4 | docker-compose \ 5 | -f docker-compose.yml \ 6 | up -d --remove-orphans 7 | 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # docker-symfony-mysql-nginx-example 2 | An example of Docker with Symfony, nginx, and MySQL 3 | 4 | ## Instructions for use 5 | 6 | ``` language-shell 7 | git clone https://github.com/codereviewvideos/docker-symfony-mysql-nginx-example.git 8 | cd docker-symfony-mysql-nginx-example 9 | 10 | # docker user will run as www-data, a member of the www-data group 11 | sudo chown -R $(whoami):1000 app 12 | 13 | # bring up the environment 14 | # this creates a ./volumes directory in the project root 15 | make dev 16 | 17 | # we need to sort out some permissions still, so down the environment momentarily 18 | docker-compose down 19 | 20 | # make the required permissions change to the php volume 21 | sudo chown -R 1000:1000 volumes/php 22 | 23 | # bring the environment back up 24 | make dev 25 | 26 | # get a terminal session open to the php container 27 | docker-compose exec php /bin/bash 28 | ``` 29 | 30 | From here, you should be able to `composer install`: 31 | 32 | ``` 33 | www-data@49454f3566f0:~/dev$ composer install 34 | Cannot create cache directory /var/www/.composer/cache/repo/https---packagist.org/, or directory is not writable. Proceeding without cache 35 | Cannot create cache directory /var/www/.composer/cache/files/, or directory is not writable. Proceeding without cache 36 | Loading composer repositories with package information 37 | Installing dependencies (including require-dev) from lock file 38 | Package operations: 38 installs, 0 updates, 0 removals 39 | - Installing doctrine/lexer (v1.0.1): Downloading (100%) 40 | - Installing doctrine/annotations (v1.2.7): Downloading (100%) 41 | - Installing twig/twig (v1.34.4): Downloading (100%) 42 | - Installing symfony/polyfill-util (v1.4.0): Downloading (100%) 43 | - Installing paragonie/random_compat (v2.0.10): Downloading (100%) 44 | - Installing symfony/polyfill-php70 (v1.4.0): Downloading (100%) 45 | - Installing symfony/polyfill-php56 (v1.4.0): Downloading (100%) 46 | - Installing symfony/polyfill-mbstring (v1.4.0): Downloading (100%) 47 | - Installing symfony/symfony (v3.3.6): Downloading (100%) 48 | - Installing symfony/polyfill-intl-icu (v1.4.0): Downloading (100%) 49 | - Installing psr/simple-cache (1.0.0): Downloading (100%) 50 | - Installing psr/log (1.0.2): Downloading (100%) 51 | - Installing psr/link (1.0.0): Downloading (100%) 52 | - Installing psr/container (1.0.0): Downloading (100%) 53 | - Installing psr/cache (1.0.1): Downloading (100%) 54 | - Installing fig/link-util (1.0.0): Downloading (100%) 55 | - Installing doctrine/inflector (v1.1.0): Downloading (100%) 56 | - Installing doctrine/collections (v1.3.0): Downloading (100%) 57 | - Installing doctrine/cache (v1.6.2): Downloading (100%) 58 | - Installing doctrine/common (v2.6.2): Downloading (100%) 59 | - Installing jdorn/sql-formatter (v1.2.17): Downloading (100%) 60 | - Installing doctrine/doctrine-cache-bundle (1.3.0): Downloading (100%) 61 | - Installing doctrine/dbal (v2.5.13): Downloading (100%) 62 | - Installing doctrine/doctrine-bundle (1.6.8): Downloading (100%) 63 | - Installing doctrine/instantiator (1.0.5): Downloading (100%) 64 | - Installing doctrine/orm (v2.5.6): Downloading (100%) 65 | - Installing incenteev/composer-parameter-handler (v2.1.2): Downloading (100%) 66 | - Installing composer/ca-bundle (1.0.7): Downloading (100%) 67 | - Installing sensiolabs/security-checker (v4.1.1): Downloading (100%) 68 | - Installing sensio/distribution-bundle (v5.0.20): Downloading (100%) 69 | - Installing sensio/framework-extra-bundle (v3.0.26): Downloading (100%) 70 | - Installing monolog/monolog (1.23.0): Downloading (100%) 71 | - Installing symfony/monolog-bundle (v3.1.0): Downloading (100%) 72 | - Installing symfony/polyfill-apcu (v1.4.0): Downloading (100%) 73 | - Installing swiftmailer/swiftmailer (v5.4.8): Downloading (100%) 74 | - Installing symfony/swiftmailer-bundle (v2.6.3): Downloading (100%) 75 | - Installing sensio/generator-bundle (v3.1.6): Downloading (100%) 76 | - Installing symfony/phpunit-bridge (v3.3.6): Downloading (100%) 77 | paragonie/random_compat suggests installing ext-libsodium (Provides a modern crypto API that can be used to generate random bytes.) 78 | doctrine/doctrine-cache-bundle suggests installing symfony/security-acl (For using this bundle to cache ACLs) 79 | sensio/framework-extra-bundle suggests installing symfony/psr-http-message-bridge (To use the PSR-7 converters) 80 | monolog/monolog suggests installing aws/aws-sdk-php (Allow sending log messages to AWS services like DynamoDB) 81 | monolog/monolog suggests installing doctrine/couchdb (Allow sending log messages to a CouchDB server) 82 | monolog/monolog suggests installing ext-amqp (Allow sending log messages to an AMQP server (1.0+ required)) 83 | monolog/monolog suggests installing ext-mongo (Allow sending log messages to a MongoDB server) 84 | monolog/monolog suggests installing graylog2/gelf-php (Allow sending log messages to a GrayLog2 server) 85 | monolog/monolog suggests installing mongodb/mongodb (Allow sending log messages to a MongoDB server via PHP Driver) 86 | monolog/monolog suggests installing php-amqplib/php-amqplib (Allow sending log messages to an AMQP server using php-amqplib) 87 | monolog/monolog suggests installing php-console/php-console (Allow sending log messages to Google Chrome) 88 | monolog/monolog suggests installing rollbar/rollbar (Allow sending log messages to Rollbar) 89 | monolog/monolog suggests installing ruflin/elastica (Allow sending log messages to an Elastic Search server) 90 | monolog/monolog suggests installing sentry/sentry (Allow sending log messages to a Sentry server) 91 | Generating autoload files 92 | > Incenteev\ParameterHandler\ScriptHandler::buildParameters 93 | Creating the "app/config/parameters.yml" file 94 | Some parameters are missing. Please provide them. 95 | database_host ('%env(MYSQL_HOST)%'): 96 | database_port ('%env(MYSQL_PORT)%'): 97 | database_name ('%env(MYSQL_DATABASE)%'): 98 | database_user ('%env(MYSQL_USER)%'): 99 | database_password ('%env(MYSQL_PASSWORD)%'): 100 | mailer_transport (smtp): 101 | mailer_host ('%env(MAILER_HOST)%'): 102 | mailer_user ('%env(MAILER_USER)%'): 103 | mailer_password ('%env(MAILER_PASSWORD)%'): 104 | mailer_port ('%env(MAILER_PORT)%'): 105 | mailer_encryption (ssl): 106 | mailer_auth_mode (login): 107 | secret ('%env(SECRET_KEY)%'): 108 | > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::buildBootstrap 109 | 110 | 111 | > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache 112 | 113 | // Clearing the cache for the dev environment with debug 114 | // true 115 | 116 | 117 | [OK] Cache for the "dev" environment (debug=true) was successfully cleared. 118 | 119 | 120 | > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::installAssets 121 | 122 | Trying to install assets as relative symbolic links. 123 | 124 | -- -------- ---------------- 125 | Bundle Method / Error 126 | -- -------- ---------------- 127 | 128 | 129 | [OK] All assets were successfully installed. 130 | 131 | 132 | > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::installRequirementsFile 133 | > Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::prepareDeploymentTarget 134 | www-data@49454f3566f0:~/dev$ 135 | ``` 136 | 137 | You will only need to do the permissions changes once. After this / subsequent development sessions, just run `make dev`. 138 | 139 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /.web-server-pid 2 | /app/config/parameters.yml 3 | /build/ 4 | /phpunit.xml 5 | /var/* 6 | !/var/cache 7 | /var/cache/* 8 | !var/cache/.gitkeep 9 | !/var/logs 10 | /var/logs/* 11 | !var/logs/.gitkeep 12 | !/var/sessions 13 | /var/sessions/* 14 | !var/sessions/.gitkeep 15 | !var/SymfonyRequirements.php 16 | /vendor/ 17 | /web/bundles/ 18 | -------------------------------------------------------------------------------- /app/README.md: -------------------------------------------------------------------------------- 1 | app 2 | === 3 | 4 | A Symfony project created on August 21, 2017, 3:14 pm. 5 | -------------------------------------------------------------------------------- /app/app/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | Require all denied 3 | 4 | 5 | Order deny,allow 6 | Deny from all 7 | 8 | -------------------------------------------------------------------------------- /app/app/AppCache.php: -------------------------------------------------------------------------------- 1 | getEnvironment(), ['dev', 'test'], true)) { 22 | $bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle(); 23 | $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle(); 24 | $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle(); 25 | 26 | if ('dev' === $this->getEnvironment()) { 27 | $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle(); 28 | $bundles[] = new Symfony\Bundle\WebServerBundle\WebServerBundle(); 29 | } 30 | } 31 | 32 | return $bundles; 33 | } 34 | 35 | public function getRootDir() 36 | { 37 | return __DIR__; 38 | } 39 | 40 | public function getCacheDir() 41 | { 42 | return dirname(__DIR__).'/var/cache/'.$this->getEnvironment(); 43 | } 44 | 45 | public function getLogDir() 46 | { 47 | return dirname(__DIR__).'/var/logs'; 48 | } 49 | 50 | public function registerContainerConfiguration(LoaderInterface $loader) 51 | { 52 | $loader->load($this->getRootDir().'/config/config_'.$this->getEnvironment().'.yml'); 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /app/app/Resources/views/base.html.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | {% block title %}Welcome!{% endblock %} 6 | {% block stylesheets %}{% endblock %} 7 | 8 | 9 | 10 | {% block body %}{% endblock %} 11 | {% block javascripts %}{% endblock %} 12 | 13 | 14 | -------------------------------------------------------------------------------- /app/app/Resources/views/default/index.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'base.html.twig' %} 2 | 3 | {% block body %} 4 |
5 |
6 |
7 |

Welcome to Symfony {{ constant('Symfony\\Component\\HttpKernel\\Kernel::VERSION') }}

8 |
9 | 10 |
11 |

12 | 13 | 14 | Your application is now ready. You can start working on it at: 15 | {{ base_dir }} 16 |

17 |
18 | 19 | 44 | 45 |
46 |
47 | {% endblock %} 48 | 49 | {% block stylesheets %} 50 | 76 | {% endblock %} 77 | -------------------------------------------------------------------------------- /app/app/config/config.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: parameters.yml } 3 | - { resource: security.yml } 4 | - { resource: services.yml } 5 | 6 | # Put parameters here that don't need to change on each machine where the app is deployed 7 | # https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration 8 | parameters: 9 | locale: en 10 | 11 | framework: 12 | #esi: ~ 13 | #translator: { fallbacks: ['%locale%'] } 14 | secret: '%secret%' 15 | router: 16 | resource: '%kernel.project_dir%/app/config/routing.yml' 17 | strict_requirements: ~ 18 | form: ~ 19 | csrf_protection: ~ 20 | validation: { enable_annotations: true } 21 | #serializer: { enable_annotations: true } 22 | templating: 23 | engines: ['twig'] 24 | default_locale: '%locale%' 25 | trusted_hosts: ~ 26 | session: 27 | # https://symfony.com/doc/current/reference/configuration/framework.html#handler-id 28 | handler_id: session.handler.native_file 29 | save_path: '%kernel.project_dir%/var/sessions/%kernel.environment%' 30 | fragments: ~ 31 | http_method_override: true 32 | assets: ~ 33 | php_errors: 34 | log: true 35 | 36 | # Twig Configuration 37 | twig: 38 | debug: '%kernel.debug%' 39 | strict_variables: '%kernel.debug%' 40 | 41 | # Doctrine Configuration 42 | doctrine: 43 | dbal: 44 | driver: pdo_mysql 45 | host: '%database_host%' 46 | port: '%database_port%' 47 | dbname: '%database_name%' 48 | user: '%database_user%' 49 | password: '%database_password%' 50 | charset: UTF8 51 | # if using pdo_sqlite as your database driver: 52 | # 1. add the path in parameters.yml 53 | # e.g. database_path: '%kernel.project_dir%/var/data/data.sqlite' 54 | # 2. Uncomment database_path in parameters.yml.dist 55 | # 3. Uncomment next line: 56 | #path: '%database_path%' 57 | 58 | orm: 59 | auto_generate_proxy_classes: '%kernel.debug%' 60 | naming_strategy: doctrine.orm.naming_strategy.underscore 61 | auto_mapping: true 62 | 63 | # Swiftmailer Configuration 64 | swiftmailer: 65 | transport: '%mailer_transport%' 66 | host: '%mailer_host%' 67 | username: '%mailer_user%' 68 | password: '%mailer_password%' 69 | spool: { type: memory } 70 | -------------------------------------------------------------------------------- /app/app/config/config_dev.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: config.yml } 3 | 4 | framework: 5 | router: 6 | resource: '%kernel.project_dir%/app/config/routing_dev.yml' 7 | strict_requirements: true 8 | profiler: { only_exceptions: false } 9 | 10 | web_profiler: 11 | toolbar: true 12 | intercept_redirects: false 13 | 14 | monolog: 15 | handlers: 16 | main: 17 | type: stream 18 | path: '%kernel.logs_dir%/%kernel.environment%.log' 19 | level: debug 20 | channels: ['!event'] 21 | console: 22 | type: console 23 | process_psr_3_messages: false 24 | channels: ['!event', '!doctrine', '!console'] 25 | # To follow logs in real time, execute the following command: 26 | # `bin/console server:log -vv` 27 | server_log: 28 | type: server_log 29 | process_psr_3_messages: false 30 | host: 127.0.0.1:9911 31 | # uncomment to get logging in your browser 32 | # you may have to allow bigger header sizes in your Web server configuration 33 | #firephp: 34 | # type: firephp 35 | # level: info 36 | #chromephp: 37 | # type: chromephp 38 | # level: info 39 | 40 | #swiftmailer: 41 | # delivery_addresses: ['me@example.com'] 42 | -------------------------------------------------------------------------------- /app/app/config/config_prod.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: config.yml } 3 | 4 | #doctrine: 5 | # orm: 6 | # metadata_cache_driver: apc 7 | # result_cache_driver: apc 8 | # query_cache_driver: apc 9 | 10 | monolog: 11 | handlers: 12 | main: 13 | type: fingers_crossed 14 | action_level: error 15 | handler: nested 16 | nested: 17 | type: stream 18 | path: '%kernel.logs_dir%/%kernel.environment%.log' 19 | level: debug 20 | console: 21 | type: console 22 | process_psr_3_messages: false 23 | -------------------------------------------------------------------------------- /app/app/config/config_test.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: config_dev.yml } 3 | 4 | framework: 5 | test: ~ 6 | session: 7 | storage_id: session.storage.mock_file 8 | profiler: 9 | collect: false 10 | 11 | web_profiler: 12 | toolbar: false 13 | intercept_redirects: false 14 | 15 | swiftmailer: 16 | disable_delivery: true 17 | -------------------------------------------------------------------------------- /app/app/config/parameters.yml.dist: -------------------------------------------------------------------------------- 1 | parameters: 2 | 3 | database_host: '%env(MYSQL_HOST)%' 4 | database_port: '%env(MYSQL_PORT)%' 5 | database_name: '%env(MYSQL_DATABASE)%' 6 | database_user: '%env(MYSQL_USER)%' 7 | database_password: '%env(MYSQL_PASSWORD)%' 8 | 9 | mailer_transport: "smtp" 10 | mailer_host: '%env(MAILER_HOST)%' 11 | mailer_user: '%env(MAILER_USER)%' 12 | mailer_password: '%env(MAILER_PASSWORD)%' 13 | mailer_port: '%env(MAILER_PORT)%' 14 | mailer_encryption: 'ssl' 15 | mailer_auth_mode: 'login' 16 | 17 | # A secret key that's used to generate certain security-related tokens 18 | secret: '%env(SECRET_KEY)%' 19 | -------------------------------------------------------------------------------- /app/app/config/routing.yml: -------------------------------------------------------------------------------- 1 | app: 2 | resource: '@AppBundle/Controller/' 3 | type: annotation 4 | -------------------------------------------------------------------------------- /app/app/config/routing_dev.yml: -------------------------------------------------------------------------------- 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 | 9 | _errors: 10 | resource: '@TwigBundle/Resources/config/routing/errors.xml' 11 | prefix: /_error 12 | 13 | _main: 14 | resource: routing.yml 15 | -------------------------------------------------------------------------------- /app/app/config/security.yml: -------------------------------------------------------------------------------- 1 | # To get started with security, check out the documentation: 2 | # https://symfony.com/doc/current/security.html 3 | security: 4 | 5 | # https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded 6 | providers: 7 | in_memory: 8 | memory: ~ 9 | 10 | firewalls: 11 | # disables authentication for assets and the profiler, adapt it according to your needs 12 | dev: 13 | pattern: ^/(_(profiler|wdt)|css|images|js)/ 14 | security: false 15 | 16 | main: 17 | anonymous: ~ 18 | # activate different ways to authenticate 19 | 20 | # https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate 21 | #http_basic: ~ 22 | 23 | # https://symfony.com/doc/current/security/form_login_setup.html 24 | #form_login: ~ 25 | -------------------------------------------------------------------------------- /app/app/config/services.yml: -------------------------------------------------------------------------------- 1 | # Learn more about services, parameters and containers at 2 | # https://symfony.com/doc/current/service_container.html 3 | parameters: 4 | #parameter_name: value 5 | 6 | services: 7 | # default configuration for services in *this* file 8 | _defaults: 9 | # automatically injects dependencies in your services 10 | autowire: true 11 | # automatically registers your services as commands, event subscribers, etc. 12 | autoconfigure: true 13 | # this means you cannot fetch services directly from the container via $container->get() 14 | # if you need to do this, you can override this setting on individual services 15 | public: false 16 | 17 | # makes classes in src/AppBundle available to be used as services 18 | # this creates a service per class whose id is the fully-qualified class name 19 | AppBundle\: 20 | resource: '../../src/AppBundle/*' 21 | # you can exclude directories or files 22 | # but if a service is unused, it's removed anyway 23 | exclude: '../../src/AppBundle/{Entity,Repository,Tests}' 24 | 25 | # controllers are imported separately to make sure they're public 26 | # and have a tag that allows actions to type-hint services 27 | AppBundle\Controller\: 28 | resource: '../../src/AppBundle/Controller' 29 | public: true 30 | tags: ['controller.service_arguments'] 31 | 32 | # add more services, or override services that need manual wiring 33 | # AppBundle\Service\ExampleService: 34 | # arguments: 35 | # $someArgument: 'some_value' 36 | -------------------------------------------------------------------------------- /app/bin/console: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | getParameterOption(['--env', '-e'], getenv('SYMFONY_ENV') ?: 'dev'); 19 | $debug = getenv('SYMFONY_DEBUG') !== '0' && !$input->hasParameterOption(['--no-debug', '']) && $env !== 'prod'; 20 | 21 | if ($debug) { 22 | Debug::enable(); 23 | } 24 | 25 | $kernel = new AppKernel($env, $debug); 26 | $application = new Application($kernel); 27 | $application->run($input); 28 | -------------------------------------------------------------------------------- /app/bin/symfony_requirements: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | getPhpIniConfigPath(); 9 | 10 | echo_title('Symfony Requirements Checker'); 11 | 12 | echo '> PHP is using the following php.ini file:'.PHP_EOL; 13 | if ($iniPath) { 14 | echo_style('green', ' '.$iniPath); 15 | } else { 16 | echo_style('yellow', ' WARNING: No configuration file (php.ini) used by PHP!'); 17 | } 18 | 19 | echo PHP_EOL.PHP_EOL; 20 | 21 | echo '> Checking Symfony requirements:'.PHP_EOL.' '; 22 | 23 | $messages = array(); 24 | foreach ($symfonyRequirements->getRequirements() as $req) { 25 | if ($helpText = get_error_message($req, $lineSize)) { 26 | echo_style('red', 'E'); 27 | $messages['error'][] = $helpText; 28 | } else { 29 | echo_style('green', '.'); 30 | } 31 | } 32 | 33 | $checkPassed = empty($messages['error']); 34 | 35 | foreach ($symfonyRequirements->getRecommendations() as $req) { 36 | if ($helpText = get_error_message($req, $lineSize)) { 37 | echo_style('yellow', 'W'); 38 | $messages['warning'][] = $helpText; 39 | } else { 40 | echo_style('green', '.'); 41 | } 42 | } 43 | 44 | if ($checkPassed) { 45 | echo_block('success', 'OK', 'Your system is ready to run Symfony projects'); 46 | } else { 47 | echo_block('error', 'ERROR', 'Your system is not ready to run Symfony projects'); 48 | 49 | echo_title('Fix the following mandatory requirements', 'red'); 50 | 51 | foreach ($messages['error'] as $helpText) { 52 | echo ' * '.$helpText.PHP_EOL; 53 | } 54 | } 55 | 56 | if (!empty($messages['warning'])) { 57 | echo_title('Optional recommendations to improve your setup', 'yellow'); 58 | 59 | foreach ($messages['warning'] as $helpText) { 60 | echo ' * '.$helpText.PHP_EOL; 61 | } 62 | } 63 | 64 | echo PHP_EOL; 65 | echo_style('title', 'Note'); 66 | echo ' The command console could use a different php.ini file'.PHP_EOL; 67 | echo_style('title', '~~~~'); 68 | echo ' than the one used with your web server. To be on the'.PHP_EOL; 69 | echo ' safe side, please check the requirements from your web'.PHP_EOL; 70 | echo ' server using the '; 71 | echo_style('yellow', 'web/config.php'); 72 | echo ' script.'.PHP_EOL; 73 | echo PHP_EOL; 74 | 75 | exit($checkPassed ? 0 : 1); 76 | 77 | function get_error_message(Requirement $requirement, $lineSize) 78 | { 79 | if ($requirement->isFulfilled()) { 80 | return; 81 | } 82 | 83 | $errorMessage = wordwrap($requirement->getTestMessage(), $lineSize - 3, PHP_EOL.' ').PHP_EOL; 84 | $errorMessage .= ' > '.wordwrap($requirement->getHelpText(), $lineSize - 5, PHP_EOL.' > ').PHP_EOL; 85 | 86 | return $errorMessage; 87 | } 88 | 89 | function echo_title($title, $style = null) 90 | { 91 | $style = $style ?: 'title'; 92 | 93 | echo PHP_EOL; 94 | echo_style($style, $title.PHP_EOL); 95 | echo_style($style, str_repeat('~', strlen($title)).PHP_EOL); 96 | echo PHP_EOL; 97 | } 98 | 99 | function echo_style($style, $message) 100 | { 101 | // ANSI color codes 102 | $styles = array( 103 | 'reset' => "\033[0m", 104 | 'red' => "\033[31m", 105 | 'green' => "\033[32m", 106 | 'yellow' => "\033[33m", 107 | 'error' => "\033[37;41m", 108 | 'success' => "\033[37;42m", 109 | 'title' => "\033[34m", 110 | ); 111 | $supports = has_color_support(); 112 | 113 | echo($supports ? $styles[$style] : '').$message.($supports ? $styles['reset'] : ''); 114 | } 115 | 116 | function echo_block($style, $title, $message) 117 | { 118 | $message = ' '.trim($message).' '; 119 | $width = strlen($message); 120 | 121 | echo PHP_EOL.PHP_EOL; 122 | 123 | echo_style($style, str_repeat(' ', $width)); 124 | echo PHP_EOL; 125 | echo_style($style, str_pad(' ['.$title.']', $width, ' ', STR_PAD_RIGHT)); 126 | echo PHP_EOL; 127 | echo_style($style, $message); 128 | echo PHP_EOL; 129 | echo_style($style, str_repeat(' ', $width)); 130 | echo PHP_EOL; 131 | } 132 | 133 | function has_color_support() 134 | { 135 | static $support; 136 | 137 | if (null === $support) { 138 | if (DIRECTORY_SEPARATOR == '\\') { 139 | $support = false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI'); 140 | } else { 141 | $support = function_exists('posix_isatty') && @posix_isatty(STDOUT); 142 | } 143 | } 144 | 145 | return $support; 146 | } 147 | -------------------------------------------------------------------------------- /app/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "codereview/app", 3 | "license": "proprietary", 4 | "type": "project", 5 | "autoload": { 6 | "psr-4": { 7 | "AppBundle\\": "src/AppBundle" 8 | }, 9 | "classmap": [ 10 | "app/AppKernel.php", 11 | "app/AppCache.php" 12 | ] 13 | }, 14 | "autoload-dev": { 15 | "psr-4": { 16 | "Tests\\": "tests/" 17 | }, 18 | "files": [ 19 | "vendor/symfony/symfony/src/Symfony/Component/VarDumper/Resources/functions/dump.php" 20 | ] 21 | }, 22 | "require": { 23 | "php": ">=5.5.9", 24 | "doctrine/doctrine-bundle": "^1.6", 25 | "doctrine/orm": "^2.5", 26 | "incenteev/composer-parameter-handler": "^2.0", 27 | "sensio/distribution-bundle": "^5.0.19", 28 | "sensio/framework-extra-bundle": "^3.0.2", 29 | "symfony/monolog-bundle": "^3.1.0", 30 | "symfony/polyfill-apcu": "^1.0", 31 | "symfony/swiftmailer-bundle": "^2.3.10", 32 | "symfony/symfony": "3.3.*", 33 | "twig/twig": "^1.0||^2.0" 34 | }, 35 | "require-dev": { 36 | "sensio/generator-bundle": "^3.0", 37 | "symfony/phpunit-bridge": "^3.0" 38 | }, 39 | "scripts": { 40 | "symfony-scripts": [ 41 | "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters", 42 | "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap", 43 | "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache", 44 | "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets", 45 | "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile", 46 | "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::prepareDeploymentTarget" 47 | ], 48 | "post-install-cmd": [ 49 | "@symfony-scripts" 50 | ], 51 | "post-update-cmd": [ 52 | "@symfony-scripts" 53 | ] 54 | }, 55 | "config": { 56 | "sort-packages": true 57 | }, 58 | "extra": { 59 | "symfony-app-dir": "app", 60 | "symfony-bin-dir": "bin", 61 | "symfony-var-dir": "var", 62 | "symfony-web-dir": "web", 63 | "symfony-tests-dir": "tests", 64 | "symfony-assets-install": "relative", 65 | "incenteev-parameters": { 66 | "file": "app/config/parameters.yml" 67 | }, 68 | "branch-alias": null 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /app/composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "84b94b022500157a93bc8449dda7237e", 8 | "packages": [ 9 | { 10 | "name": "composer/ca-bundle", 11 | "version": "1.0.7", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/composer/ca-bundle.git", 15 | "reference": "b17e6153cb7f33c7e44eb59578dc12eee5dc8e12" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/composer/ca-bundle/zipball/b17e6153cb7f33c7e44eb59578dc12eee5dc8e12", 20 | "reference": "b17e6153cb7f33c7e44eb59578dc12eee5dc8e12", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "ext-openssl": "*", 25 | "ext-pcre": "*", 26 | "php": "^5.3.2 || ^7.0" 27 | }, 28 | "require-dev": { 29 | "phpunit/phpunit": "^4.5", 30 | "psr/log": "^1.0", 31 | "symfony/process": "^2.5 || ^3.0" 32 | }, 33 | "suggest": { 34 | "symfony/process": "This is necessary to reliably check whether openssl_x509_parse is vulnerable on older php versions, but can be ignored on PHP 5.5.6+" 35 | }, 36 | "type": "library", 37 | "extra": { 38 | "branch-alias": { 39 | "dev-master": "1.x-dev" 40 | } 41 | }, 42 | "autoload": { 43 | "psr-4": { 44 | "Composer\\CaBundle\\": "src" 45 | } 46 | }, 47 | "notification-url": "https://packagist.org/downloads/", 48 | "license": [ 49 | "MIT" 50 | ], 51 | "authors": [ 52 | { 53 | "name": "Jordi Boggiano", 54 | "email": "j.boggiano@seld.be", 55 | "homepage": "http://seld.be" 56 | } 57 | ], 58 | "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", 59 | "keywords": [ 60 | "cabundle", 61 | "cacert", 62 | "certificate", 63 | "ssl", 64 | "tls" 65 | ], 66 | "time": "2017-03-06T11:59:08+00:00" 67 | }, 68 | { 69 | "name": "doctrine/annotations", 70 | "version": "v1.2.7", 71 | "source": { 72 | "type": "git", 73 | "url": "https://github.com/doctrine/annotations.git", 74 | "reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535" 75 | }, 76 | "dist": { 77 | "type": "zip", 78 | "url": "https://api.github.com/repos/doctrine/annotations/zipball/f25c8aab83e0c3e976fd7d19875f198ccf2f7535", 79 | "reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535", 80 | "shasum": "" 81 | }, 82 | "require": { 83 | "doctrine/lexer": "1.*", 84 | "php": ">=5.3.2" 85 | }, 86 | "require-dev": { 87 | "doctrine/cache": "1.*", 88 | "phpunit/phpunit": "4.*" 89 | }, 90 | "type": "library", 91 | "extra": { 92 | "branch-alias": { 93 | "dev-master": "1.3.x-dev" 94 | } 95 | }, 96 | "autoload": { 97 | "psr-0": { 98 | "Doctrine\\Common\\Annotations\\": "lib/" 99 | } 100 | }, 101 | "notification-url": "https://packagist.org/downloads/", 102 | "license": [ 103 | "MIT" 104 | ], 105 | "authors": [ 106 | { 107 | "name": "Roman Borschel", 108 | "email": "roman@code-factory.org" 109 | }, 110 | { 111 | "name": "Benjamin Eberlei", 112 | "email": "kontakt@beberlei.de" 113 | }, 114 | { 115 | "name": "Guilherme Blanco", 116 | "email": "guilhermeblanco@gmail.com" 117 | }, 118 | { 119 | "name": "Jonathan Wage", 120 | "email": "jonwage@gmail.com" 121 | }, 122 | { 123 | "name": "Johannes Schmitt", 124 | "email": "schmittjoh@gmail.com" 125 | } 126 | ], 127 | "description": "Docblock Annotations Parser", 128 | "homepage": "http://www.doctrine-project.org", 129 | "keywords": [ 130 | "annotations", 131 | "docblock", 132 | "parser" 133 | ], 134 | "time": "2015-08-31T12:32:49+00:00" 135 | }, 136 | { 137 | "name": "doctrine/cache", 138 | "version": "v1.6.2", 139 | "source": { 140 | "type": "git", 141 | "url": "https://github.com/doctrine/cache.git", 142 | "reference": "eb152c5100571c7a45470ff2a35095ab3f3b900b" 143 | }, 144 | "dist": { 145 | "type": "zip", 146 | "url": "https://api.github.com/repos/doctrine/cache/zipball/eb152c5100571c7a45470ff2a35095ab3f3b900b", 147 | "reference": "eb152c5100571c7a45470ff2a35095ab3f3b900b", 148 | "shasum": "" 149 | }, 150 | "require": { 151 | "php": "~5.5|~7.0" 152 | }, 153 | "conflict": { 154 | "doctrine/common": ">2.2,<2.4" 155 | }, 156 | "require-dev": { 157 | "phpunit/phpunit": "~4.8|~5.0", 158 | "predis/predis": "~1.0", 159 | "satooshi/php-coveralls": "~0.6" 160 | }, 161 | "type": "library", 162 | "extra": { 163 | "branch-alias": { 164 | "dev-master": "1.6.x-dev" 165 | } 166 | }, 167 | "autoload": { 168 | "psr-4": { 169 | "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" 170 | } 171 | }, 172 | "notification-url": "https://packagist.org/downloads/", 173 | "license": [ 174 | "MIT" 175 | ], 176 | "authors": [ 177 | { 178 | "name": "Roman Borschel", 179 | "email": "roman@code-factory.org" 180 | }, 181 | { 182 | "name": "Benjamin Eberlei", 183 | "email": "kontakt@beberlei.de" 184 | }, 185 | { 186 | "name": "Guilherme Blanco", 187 | "email": "guilhermeblanco@gmail.com" 188 | }, 189 | { 190 | "name": "Jonathan Wage", 191 | "email": "jonwage@gmail.com" 192 | }, 193 | { 194 | "name": "Johannes Schmitt", 195 | "email": "schmittjoh@gmail.com" 196 | } 197 | ], 198 | "description": "Caching library offering an object-oriented API for many cache backends", 199 | "homepage": "http://www.doctrine-project.org", 200 | "keywords": [ 201 | "cache", 202 | "caching" 203 | ], 204 | "time": "2017-07-22T12:49:21+00:00" 205 | }, 206 | { 207 | "name": "doctrine/collections", 208 | "version": "v1.3.0", 209 | "source": { 210 | "type": "git", 211 | "url": "https://github.com/doctrine/collections.git", 212 | "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a" 213 | }, 214 | "dist": { 215 | "type": "zip", 216 | "url": "https://api.github.com/repos/doctrine/collections/zipball/6c1e4eef75f310ea1b3e30945e9f06e652128b8a", 217 | "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a", 218 | "shasum": "" 219 | }, 220 | "require": { 221 | "php": ">=5.3.2" 222 | }, 223 | "require-dev": { 224 | "phpunit/phpunit": "~4.0" 225 | }, 226 | "type": "library", 227 | "extra": { 228 | "branch-alias": { 229 | "dev-master": "1.2.x-dev" 230 | } 231 | }, 232 | "autoload": { 233 | "psr-0": { 234 | "Doctrine\\Common\\Collections\\": "lib/" 235 | } 236 | }, 237 | "notification-url": "https://packagist.org/downloads/", 238 | "license": [ 239 | "MIT" 240 | ], 241 | "authors": [ 242 | { 243 | "name": "Roman Borschel", 244 | "email": "roman@code-factory.org" 245 | }, 246 | { 247 | "name": "Benjamin Eberlei", 248 | "email": "kontakt@beberlei.de" 249 | }, 250 | { 251 | "name": "Guilherme Blanco", 252 | "email": "guilhermeblanco@gmail.com" 253 | }, 254 | { 255 | "name": "Jonathan Wage", 256 | "email": "jonwage@gmail.com" 257 | }, 258 | { 259 | "name": "Johannes Schmitt", 260 | "email": "schmittjoh@gmail.com" 261 | } 262 | ], 263 | "description": "Collections Abstraction library", 264 | "homepage": "http://www.doctrine-project.org", 265 | "keywords": [ 266 | "array", 267 | "collections", 268 | "iterator" 269 | ], 270 | "time": "2015-04-14T22:21:58+00:00" 271 | }, 272 | { 273 | "name": "doctrine/common", 274 | "version": "v2.6.2", 275 | "source": { 276 | "type": "git", 277 | "url": "https://github.com/doctrine/common.git", 278 | "reference": "7bce00698899aa2c06fe7365c76e4d78ddb15fa3" 279 | }, 280 | "dist": { 281 | "type": "zip", 282 | "url": "https://api.github.com/repos/doctrine/common/zipball/7bce00698899aa2c06fe7365c76e4d78ddb15fa3", 283 | "reference": "7bce00698899aa2c06fe7365c76e4d78ddb15fa3", 284 | "shasum": "" 285 | }, 286 | "require": { 287 | "doctrine/annotations": "1.*", 288 | "doctrine/cache": "1.*", 289 | "doctrine/collections": "1.*", 290 | "doctrine/inflector": "1.*", 291 | "doctrine/lexer": "1.*", 292 | "php": "~5.5|~7.0" 293 | }, 294 | "require-dev": { 295 | "phpunit/phpunit": "~4.8|~5.0" 296 | }, 297 | "type": "library", 298 | "extra": { 299 | "branch-alias": { 300 | "dev-master": "2.7.x-dev" 301 | } 302 | }, 303 | "autoload": { 304 | "psr-4": { 305 | "Doctrine\\Common\\": "lib/Doctrine/Common" 306 | } 307 | }, 308 | "notification-url": "https://packagist.org/downloads/", 309 | "license": [ 310 | "MIT" 311 | ], 312 | "authors": [ 313 | { 314 | "name": "Roman Borschel", 315 | "email": "roman@code-factory.org" 316 | }, 317 | { 318 | "name": "Benjamin Eberlei", 319 | "email": "kontakt@beberlei.de" 320 | }, 321 | { 322 | "name": "Guilherme Blanco", 323 | "email": "guilhermeblanco@gmail.com" 324 | }, 325 | { 326 | "name": "Jonathan Wage", 327 | "email": "jonwage@gmail.com" 328 | }, 329 | { 330 | "name": "Johannes Schmitt", 331 | "email": "schmittjoh@gmail.com" 332 | } 333 | ], 334 | "description": "Common Library for Doctrine projects", 335 | "homepage": "http://www.doctrine-project.org", 336 | "keywords": [ 337 | "annotations", 338 | "collections", 339 | "eventmanager", 340 | "persistence", 341 | "spl" 342 | ], 343 | "time": "2016-11-30T16:50:46+00:00" 344 | }, 345 | { 346 | "name": "doctrine/dbal", 347 | "version": "v2.5.13", 348 | "source": { 349 | "type": "git", 350 | "url": "https://github.com/doctrine/dbal.git", 351 | "reference": "729340d8d1eec8f01bff708e12e449a3415af873" 352 | }, 353 | "dist": { 354 | "type": "zip", 355 | "url": "https://api.github.com/repos/doctrine/dbal/zipball/729340d8d1eec8f01bff708e12e449a3415af873", 356 | "reference": "729340d8d1eec8f01bff708e12e449a3415af873", 357 | "shasum": "" 358 | }, 359 | "require": { 360 | "doctrine/common": ">=2.4,<2.8-dev", 361 | "php": ">=5.3.2" 362 | }, 363 | "require-dev": { 364 | "phpunit/phpunit": "4.*", 365 | "symfony/console": "2.*||^3.0" 366 | }, 367 | "suggest": { 368 | "symfony/console": "For helpful console commands such as SQL execution and import of files." 369 | }, 370 | "bin": [ 371 | "bin/doctrine-dbal" 372 | ], 373 | "type": "library", 374 | "extra": { 375 | "branch-alias": { 376 | "dev-master": "2.5.x-dev" 377 | } 378 | }, 379 | "autoload": { 380 | "psr-0": { 381 | "Doctrine\\DBAL\\": "lib/" 382 | } 383 | }, 384 | "notification-url": "https://packagist.org/downloads/", 385 | "license": [ 386 | "MIT" 387 | ], 388 | "authors": [ 389 | { 390 | "name": "Roman Borschel", 391 | "email": "roman@code-factory.org" 392 | }, 393 | { 394 | "name": "Benjamin Eberlei", 395 | "email": "kontakt@beberlei.de" 396 | }, 397 | { 398 | "name": "Guilherme Blanco", 399 | "email": "guilhermeblanco@gmail.com" 400 | }, 401 | { 402 | "name": "Jonathan Wage", 403 | "email": "jonwage@gmail.com" 404 | } 405 | ], 406 | "description": "Database Abstraction Layer", 407 | "homepage": "http://www.doctrine-project.org", 408 | "keywords": [ 409 | "database", 410 | "dbal", 411 | "persistence", 412 | "queryobject" 413 | ], 414 | "time": "2017-07-22T20:44:48+00:00" 415 | }, 416 | { 417 | "name": "doctrine/doctrine-bundle", 418 | "version": "1.6.8", 419 | "source": { 420 | "type": "git", 421 | "url": "https://github.com/doctrine/DoctrineBundle.git", 422 | "reference": "6e96577cbbdbb5b6dcca2ff203d665976b51beb0" 423 | }, 424 | "dist": { 425 | "type": "zip", 426 | "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/6e96577cbbdbb5b6dcca2ff203d665976b51beb0", 427 | "reference": "6e96577cbbdbb5b6dcca2ff203d665976b51beb0", 428 | "shasum": "" 429 | }, 430 | "require": { 431 | "doctrine/dbal": "~2.3", 432 | "doctrine/doctrine-cache-bundle": "~1.2", 433 | "jdorn/sql-formatter": "~1.1", 434 | "php": ">=5.5.9", 435 | "symfony/console": "~2.7|~3.0|~4.0", 436 | "symfony/dependency-injection": "~2.7|~3.0|~4.0", 437 | "symfony/doctrine-bridge": "~2.7|~3.0|~4.0", 438 | "symfony/framework-bundle": "~2.7|~3.0|~4.0" 439 | }, 440 | "require-dev": { 441 | "doctrine/orm": "~2.3", 442 | "phpunit/phpunit": "~4", 443 | "satooshi/php-coveralls": "^1.0", 444 | "symfony/phpunit-bridge": "~2.7|~3.0|~4.0", 445 | "symfony/property-info": "~2.8|~3.0|~4.0", 446 | "symfony/validator": "~2.7|~3.0|~4.0", 447 | "symfony/yaml": "~2.7|~3.0|~4.0", 448 | "twig/twig": "~1.12|~2.0" 449 | }, 450 | "suggest": { 451 | "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", 452 | "symfony/web-profiler-bundle": "To use the data collector." 453 | }, 454 | "type": "symfony-bundle", 455 | "extra": { 456 | "branch-alias": { 457 | "dev-master": "1.6.x-dev" 458 | } 459 | }, 460 | "autoload": { 461 | "psr-4": { 462 | "Doctrine\\Bundle\\DoctrineBundle\\": "" 463 | } 464 | }, 465 | "notification-url": "https://packagist.org/downloads/", 466 | "license": [ 467 | "MIT" 468 | ], 469 | "authors": [ 470 | { 471 | "name": "Symfony Community", 472 | "homepage": "http://symfony.com/contributors" 473 | }, 474 | { 475 | "name": "Benjamin Eberlei", 476 | "email": "kontakt@beberlei.de" 477 | }, 478 | { 479 | "name": "Doctrine Project", 480 | "homepage": "http://www.doctrine-project.org/" 481 | }, 482 | { 483 | "name": "Fabien Potencier", 484 | "email": "fabien@symfony.com" 485 | } 486 | ], 487 | "description": "Symfony DoctrineBundle", 488 | "homepage": "http://www.doctrine-project.org", 489 | "keywords": [ 490 | "database", 491 | "dbal", 492 | "orm", 493 | "persistence" 494 | ], 495 | "time": "2017-05-18T08:15:18+00:00" 496 | }, 497 | { 498 | "name": "doctrine/doctrine-cache-bundle", 499 | "version": "1.3.0", 500 | "source": { 501 | "type": "git", 502 | "url": "https://github.com/doctrine/DoctrineCacheBundle.git", 503 | "reference": "18c600a9b82f6454d2e81ca4957cdd56a1cf3504" 504 | }, 505 | "dist": { 506 | "type": "zip", 507 | "url": "https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/18c600a9b82f6454d2e81ca4957cdd56a1cf3504", 508 | "reference": "18c600a9b82f6454d2e81ca4957cdd56a1cf3504", 509 | "shasum": "" 510 | }, 511 | "require": { 512 | "doctrine/cache": "^1.4.2", 513 | "doctrine/inflector": "~1.0", 514 | "php": ">=5.3.2", 515 | "symfony/doctrine-bridge": "~2.2|~3.0" 516 | }, 517 | "require-dev": { 518 | "instaclick/coding-standard": "~1.1", 519 | "instaclick/object-calisthenics-sniffs": "dev-master", 520 | "instaclick/symfony2-coding-standard": "dev-remaster", 521 | "phpunit/phpunit": "~4", 522 | "predis/predis": "~0.8", 523 | "satooshi/php-coveralls": "~0.6.1", 524 | "squizlabs/php_codesniffer": "~1.5", 525 | "symfony/console": "~2.2|~3.0", 526 | "symfony/finder": "~2.2|~3.0", 527 | "symfony/framework-bundle": "~2.2|~3.0", 528 | "symfony/phpunit-bridge": "~2.7|~3.0", 529 | "symfony/security-acl": "~2.3|~3.0", 530 | "symfony/validator": "~2.2|~3.0", 531 | "symfony/yaml": "~2.2|~3.0" 532 | }, 533 | "suggest": { 534 | "symfony/security-acl": "For using this bundle to cache ACLs" 535 | }, 536 | "type": "symfony-bundle", 537 | "extra": { 538 | "branch-alias": { 539 | "dev-master": "1.2.x-dev" 540 | } 541 | }, 542 | "autoload": { 543 | "psr-4": { 544 | "Doctrine\\Bundle\\DoctrineCacheBundle\\": "" 545 | } 546 | }, 547 | "notification-url": "https://packagist.org/downloads/", 548 | "license": [ 549 | "MIT" 550 | ], 551 | "authors": [ 552 | { 553 | "name": "Symfony Community", 554 | "homepage": "http://symfony.com/contributors" 555 | }, 556 | { 557 | "name": "Benjamin Eberlei", 558 | "email": "kontakt@beberlei.de" 559 | }, 560 | { 561 | "name": "Fabio B. Silva", 562 | "email": "fabio.bat.silva@gmail.com" 563 | }, 564 | { 565 | "name": "Guilherme Blanco", 566 | "email": "guilhermeblanco@hotmail.com" 567 | }, 568 | { 569 | "name": "Doctrine Project", 570 | "homepage": "http://www.doctrine-project.org/" 571 | }, 572 | { 573 | "name": "Fabien Potencier", 574 | "email": "fabien@symfony.com" 575 | } 576 | ], 577 | "description": "Symfony Bundle for Doctrine Cache", 578 | "homepage": "http://www.doctrine-project.org", 579 | "keywords": [ 580 | "cache", 581 | "caching" 582 | ], 583 | "time": "2016-01-26T17:28:51+00:00" 584 | }, 585 | { 586 | "name": "doctrine/inflector", 587 | "version": "v1.1.0", 588 | "source": { 589 | "type": "git", 590 | "url": "https://github.com/doctrine/inflector.git", 591 | "reference": "90b2128806bfde671b6952ab8bea493942c1fdae" 592 | }, 593 | "dist": { 594 | "type": "zip", 595 | "url": "https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae", 596 | "reference": "90b2128806bfde671b6952ab8bea493942c1fdae", 597 | "shasum": "" 598 | }, 599 | "require": { 600 | "php": ">=5.3.2" 601 | }, 602 | "require-dev": { 603 | "phpunit/phpunit": "4.*" 604 | }, 605 | "type": "library", 606 | "extra": { 607 | "branch-alias": { 608 | "dev-master": "1.1.x-dev" 609 | } 610 | }, 611 | "autoload": { 612 | "psr-0": { 613 | "Doctrine\\Common\\Inflector\\": "lib/" 614 | } 615 | }, 616 | "notification-url": "https://packagist.org/downloads/", 617 | "license": [ 618 | "MIT" 619 | ], 620 | "authors": [ 621 | { 622 | "name": "Roman Borschel", 623 | "email": "roman@code-factory.org" 624 | }, 625 | { 626 | "name": "Benjamin Eberlei", 627 | "email": "kontakt@beberlei.de" 628 | }, 629 | { 630 | "name": "Guilherme Blanco", 631 | "email": "guilhermeblanco@gmail.com" 632 | }, 633 | { 634 | "name": "Jonathan Wage", 635 | "email": "jonwage@gmail.com" 636 | }, 637 | { 638 | "name": "Johannes Schmitt", 639 | "email": "schmittjoh@gmail.com" 640 | } 641 | ], 642 | "description": "Common String Manipulations with regard to casing and singular/plural rules.", 643 | "homepage": "http://www.doctrine-project.org", 644 | "keywords": [ 645 | "inflection", 646 | "pluralize", 647 | "singularize", 648 | "string" 649 | ], 650 | "time": "2015-11-06T14:35:42+00:00" 651 | }, 652 | { 653 | "name": "doctrine/instantiator", 654 | "version": "1.0.5", 655 | "source": { 656 | "type": "git", 657 | "url": "https://github.com/doctrine/instantiator.git", 658 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d" 659 | }, 660 | "dist": { 661 | "type": "zip", 662 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d", 663 | "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d", 664 | "shasum": "" 665 | }, 666 | "require": { 667 | "php": ">=5.3,<8.0-DEV" 668 | }, 669 | "require-dev": { 670 | "athletic/athletic": "~0.1.8", 671 | "ext-pdo": "*", 672 | "ext-phar": "*", 673 | "phpunit/phpunit": "~4.0", 674 | "squizlabs/php_codesniffer": "~2.0" 675 | }, 676 | "type": "library", 677 | "extra": { 678 | "branch-alias": { 679 | "dev-master": "1.0.x-dev" 680 | } 681 | }, 682 | "autoload": { 683 | "psr-4": { 684 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 685 | } 686 | }, 687 | "notification-url": "https://packagist.org/downloads/", 688 | "license": [ 689 | "MIT" 690 | ], 691 | "authors": [ 692 | { 693 | "name": "Marco Pivetta", 694 | "email": "ocramius@gmail.com", 695 | "homepage": "http://ocramius.github.com/" 696 | } 697 | ], 698 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 699 | "homepage": "https://github.com/doctrine/instantiator", 700 | "keywords": [ 701 | "constructor", 702 | "instantiate" 703 | ], 704 | "time": "2015-06-14T21:17:01+00:00" 705 | }, 706 | { 707 | "name": "doctrine/lexer", 708 | "version": "v1.0.1", 709 | "source": { 710 | "type": "git", 711 | "url": "https://github.com/doctrine/lexer.git", 712 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" 713 | }, 714 | "dist": { 715 | "type": "zip", 716 | "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", 717 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", 718 | "shasum": "" 719 | }, 720 | "require": { 721 | "php": ">=5.3.2" 722 | }, 723 | "type": "library", 724 | "extra": { 725 | "branch-alias": { 726 | "dev-master": "1.0.x-dev" 727 | } 728 | }, 729 | "autoload": { 730 | "psr-0": { 731 | "Doctrine\\Common\\Lexer\\": "lib/" 732 | } 733 | }, 734 | "notification-url": "https://packagist.org/downloads/", 735 | "license": [ 736 | "MIT" 737 | ], 738 | "authors": [ 739 | { 740 | "name": "Roman Borschel", 741 | "email": "roman@code-factory.org" 742 | }, 743 | { 744 | "name": "Guilherme Blanco", 745 | "email": "guilhermeblanco@gmail.com" 746 | }, 747 | { 748 | "name": "Johannes Schmitt", 749 | "email": "schmittjoh@gmail.com" 750 | } 751 | ], 752 | "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", 753 | "homepage": "http://www.doctrine-project.org", 754 | "keywords": [ 755 | "lexer", 756 | "parser" 757 | ], 758 | "time": "2014-09-09T13:34:57+00:00" 759 | }, 760 | { 761 | "name": "doctrine/orm", 762 | "version": "v2.5.6", 763 | "source": { 764 | "type": "git", 765 | "url": "https://github.com/doctrine/doctrine2.git", 766 | "reference": "e6c434196c8ef058239aaa0724b4aadb0107940b" 767 | }, 768 | "dist": { 769 | "type": "zip", 770 | "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/e6c434196c8ef058239aaa0724b4aadb0107940b", 771 | "reference": "e6c434196c8ef058239aaa0724b4aadb0107940b", 772 | "shasum": "" 773 | }, 774 | "require": { 775 | "doctrine/cache": "~1.4", 776 | "doctrine/collections": "~1.2", 777 | "doctrine/common": ">=2.5-dev,<2.8-dev", 778 | "doctrine/dbal": ">=2.5-dev,<2.6-dev", 779 | "doctrine/instantiator": "~1.0.1", 780 | "ext-pdo": "*", 781 | "php": ">=5.4", 782 | "symfony/console": "~2.5|~3.0" 783 | }, 784 | "require-dev": { 785 | "phpunit/phpunit": "~4.0", 786 | "symfony/yaml": "~2.3|~3.0" 787 | }, 788 | "suggest": { 789 | "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" 790 | }, 791 | "bin": [ 792 | "bin/doctrine", 793 | "bin/doctrine.php" 794 | ], 795 | "type": "library", 796 | "extra": { 797 | "branch-alias": { 798 | "dev-master": "2.6.x-dev" 799 | } 800 | }, 801 | "autoload": { 802 | "psr-0": { 803 | "Doctrine\\ORM\\": "lib/" 804 | } 805 | }, 806 | "notification-url": "https://packagist.org/downloads/", 807 | "license": [ 808 | "MIT" 809 | ], 810 | "authors": [ 811 | { 812 | "name": "Roman Borschel", 813 | "email": "roman@code-factory.org" 814 | }, 815 | { 816 | "name": "Benjamin Eberlei", 817 | "email": "kontakt@beberlei.de" 818 | }, 819 | { 820 | "name": "Guilherme Blanco", 821 | "email": "guilhermeblanco@gmail.com" 822 | }, 823 | { 824 | "name": "Jonathan Wage", 825 | "email": "jonwage@gmail.com" 826 | } 827 | ], 828 | "description": "Object-Relational-Mapper for PHP", 829 | "homepage": "http://www.doctrine-project.org", 830 | "keywords": [ 831 | "database", 832 | "orm" 833 | ], 834 | "time": "2016-12-18T15:42:34+00:00" 835 | }, 836 | { 837 | "name": "fig/link-util", 838 | "version": "1.0.0", 839 | "source": { 840 | "type": "git", 841 | "url": "https://github.com/php-fig/link-util.git", 842 | "reference": "1a07821801a148be4add11ab0603e4af55a72fac" 843 | }, 844 | "dist": { 845 | "type": "zip", 846 | "url": "https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac", 847 | "reference": "1a07821801a148be4add11ab0603e4af55a72fac", 848 | "shasum": "" 849 | }, 850 | "require": { 851 | "php": ">=5.5.0", 852 | "psr/link": "~1.0@dev" 853 | }, 854 | "require-dev": { 855 | "phpunit/phpunit": "^5.1", 856 | "squizlabs/php_codesniffer": "^2.3.1" 857 | }, 858 | "type": "library", 859 | "extra": { 860 | "branch-alias": { 861 | "dev-master": "1.0.x-dev" 862 | } 863 | }, 864 | "autoload": { 865 | "psr-4": { 866 | "Fig\\Link\\": "src/" 867 | } 868 | }, 869 | "notification-url": "https://packagist.org/downloads/", 870 | "license": [ 871 | "MIT" 872 | ], 873 | "authors": [ 874 | { 875 | "name": "PHP-FIG", 876 | "homepage": "http://www.php-fig.org/" 877 | } 878 | ], 879 | "description": "Common utility implementations for HTTP links", 880 | "keywords": [ 881 | "http", 882 | "http-link", 883 | "link", 884 | "psr", 885 | "psr-13", 886 | "rest" 887 | ], 888 | "time": "2016-10-17T18:31:11+00:00" 889 | }, 890 | { 891 | "name": "incenteev/composer-parameter-handler", 892 | "version": "v2.1.2", 893 | "source": { 894 | "type": "git", 895 | "url": "https://github.com/Incenteev/ParameterHandler.git", 896 | "reference": "d7ce7f06136109e81d1cb9d57066c4d4a99cf1cc" 897 | }, 898 | "dist": { 899 | "type": "zip", 900 | "url": "https://api.github.com/repos/Incenteev/ParameterHandler/zipball/d7ce7f06136109e81d1cb9d57066c4d4a99cf1cc", 901 | "reference": "d7ce7f06136109e81d1cb9d57066c4d4a99cf1cc", 902 | "shasum": "" 903 | }, 904 | "require": { 905 | "php": ">=5.3.3", 906 | "symfony/yaml": "~2.3|~3.0" 907 | }, 908 | "require-dev": { 909 | "composer/composer": "1.0.*@dev", 910 | "phpspec/prophecy-phpunit": "~1.0", 911 | "symfony/filesystem": "~2.2" 912 | }, 913 | "type": "library", 914 | "extra": { 915 | "branch-alias": { 916 | "dev-master": "2.1.x-dev" 917 | } 918 | }, 919 | "autoload": { 920 | "psr-4": { 921 | "Incenteev\\ParameterHandler\\": "" 922 | } 923 | }, 924 | "notification-url": "https://packagist.org/downloads/", 925 | "license": [ 926 | "MIT" 927 | ], 928 | "authors": [ 929 | { 930 | "name": "Christophe Coevoet", 931 | "email": "stof@notk.org" 932 | } 933 | ], 934 | "description": "Composer script handling your ignored parameter file", 935 | "homepage": "https://github.com/Incenteev/ParameterHandler", 936 | "keywords": [ 937 | "parameters management" 938 | ], 939 | "time": "2015-11-10T17:04:01+00:00" 940 | }, 941 | { 942 | "name": "jdorn/sql-formatter", 943 | "version": "v1.2.17", 944 | "source": { 945 | "type": "git", 946 | "url": "https://github.com/jdorn/sql-formatter.git", 947 | "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc" 948 | }, 949 | "dist": { 950 | "type": "zip", 951 | "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc", 952 | "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc", 953 | "shasum": "" 954 | }, 955 | "require": { 956 | "php": ">=5.2.4" 957 | }, 958 | "require-dev": { 959 | "phpunit/phpunit": "3.7.*" 960 | }, 961 | "type": "library", 962 | "extra": { 963 | "branch-alias": { 964 | "dev-master": "1.3.x-dev" 965 | } 966 | }, 967 | "autoload": { 968 | "classmap": [ 969 | "lib" 970 | ] 971 | }, 972 | "notification-url": "https://packagist.org/downloads/", 973 | "license": [ 974 | "MIT" 975 | ], 976 | "authors": [ 977 | { 978 | "name": "Jeremy Dorn", 979 | "email": "jeremy@jeremydorn.com", 980 | "homepage": "http://jeremydorn.com/" 981 | } 982 | ], 983 | "description": "a PHP SQL highlighting library", 984 | "homepage": "https://github.com/jdorn/sql-formatter/", 985 | "keywords": [ 986 | "highlight", 987 | "sql" 988 | ], 989 | "time": "2014-01-12T16:20:24+00:00" 990 | }, 991 | { 992 | "name": "monolog/monolog", 993 | "version": "1.23.0", 994 | "source": { 995 | "type": "git", 996 | "url": "https://github.com/Seldaek/monolog.git", 997 | "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4" 998 | }, 999 | "dist": { 1000 | "type": "zip", 1001 | "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4", 1002 | "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4", 1003 | "shasum": "" 1004 | }, 1005 | "require": { 1006 | "php": ">=5.3.0", 1007 | "psr/log": "~1.0" 1008 | }, 1009 | "provide": { 1010 | "psr/log-implementation": "1.0.0" 1011 | }, 1012 | "require-dev": { 1013 | "aws/aws-sdk-php": "^2.4.9 || ^3.0", 1014 | "doctrine/couchdb": "~1.0@dev", 1015 | "graylog2/gelf-php": "~1.0", 1016 | "jakub-onderka/php-parallel-lint": "0.9", 1017 | "php-amqplib/php-amqplib": "~2.4", 1018 | "php-console/php-console": "^3.1.3", 1019 | "phpunit/phpunit": "~4.5", 1020 | "phpunit/phpunit-mock-objects": "2.3.0", 1021 | "ruflin/elastica": ">=0.90 <3.0", 1022 | "sentry/sentry": "^0.13", 1023 | "swiftmailer/swiftmailer": "^5.3|^6.0" 1024 | }, 1025 | "suggest": { 1026 | "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", 1027 | "doctrine/couchdb": "Allow sending log messages to a CouchDB server", 1028 | "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", 1029 | "ext-mongo": "Allow sending log messages to a MongoDB server", 1030 | "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", 1031 | "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", 1032 | "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", 1033 | "php-console/php-console": "Allow sending log messages to Google Chrome", 1034 | "rollbar/rollbar": "Allow sending log messages to Rollbar", 1035 | "ruflin/elastica": "Allow sending log messages to an Elastic Search server", 1036 | "sentry/sentry": "Allow sending log messages to a Sentry server" 1037 | }, 1038 | "type": "library", 1039 | "extra": { 1040 | "branch-alias": { 1041 | "dev-master": "2.0.x-dev" 1042 | } 1043 | }, 1044 | "autoload": { 1045 | "psr-4": { 1046 | "Monolog\\": "src/Monolog" 1047 | } 1048 | }, 1049 | "notification-url": "https://packagist.org/downloads/", 1050 | "license": [ 1051 | "MIT" 1052 | ], 1053 | "authors": [ 1054 | { 1055 | "name": "Jordi Boggiano", 1056 | "email": "j.boggiano@seld.be", 1057 | "homepage": "http://seld.be" 1058 | } 1059 | ], 1060 | "description": "Sends your logs to files, sockets, inboxes, databases and various web services", 1061 | "homepage": "http://github.com/Seldaek/monolog", 1062 | "keywords": [ 1063 | "log", 1064 | "logging", 1065 | "psr-3" 1066 | ], 1067 | "time": "2017-06-19T01:22:40+00:00" 1068 | }, 1069 | { 1070 | "name": "paragonie/random_compat", 1071 | "version": "v2.0.10", 1072 | "source": { 1073 | "type": "git", 1074 | "url": "https://github.com/paragonie/random_compat.git", 1075 | "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d" 1076 | }, 1077 | "dist": { 1078 | "type": "zip", 1079 | "url": "https://api.github.com/repos/paragonie/random_compat/zipball/634bae8e911eefa89c1abfbf1b66da679ac8f54d", 1080 | "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d", 1081 | "shasum": "" 1082 | }, 1083 | "require": { 1084 | "php": ">=5.2.0" 1085 | }, 1086 | "require-dev": { 1087 | "phpunit/phpunit": "4.*|5.*" 1088 | }, 1089 | "suggest": { 1090 | "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." 1091 | }, 1092 | "type": "library", 1093 | "autoload": { 1094 | "files": [ 1095 | "lib/random.php" 1096 | ] 1097 | }, 1098 | "notification-url": "https://packagist.org/downloads/", 1099 | "license": [ 1100 | "MIT" 1101 | ], 1102 | "authors": [ 1103 | { 1104 | "name": "Paragon Initiative Enterprises", 1105 | "email": "security@paragonie.com", 1106 | "homepage": "https://paragonie.com" 1107 | } 1108 | ], 1109 | "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", 1110 | "keywords": [ 1111 | "csprng", 1112 | "pseudorandom", 1113 | "random" 1114 | ], 1115 | "time": "2017-03-13T16:27:32+00:00" 1116 | }, 1117 | { 1118 | "name": "psr/cache", 1119 | "version": "1.0.1", 1120 | "source": { 1121 | "type": "git", 1122 | "url": "https://github.com/php-fig/cache.git", 1123 | "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" 1124 | }, 1125 | "dist": { 1126 | "type": "zip", 1127 | "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", 1128 | "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", 1129 | "shasum": "" 1130 | }, 1131 | "require": { 1132 | "php": ">=5.3.0" 1133 | }, 1134 | "type": "library", 1135 | "extra": { 1136 | "branch-alias": { 1137 | "dev-master": "1.0.x-dev" 1138 | } 1139 | }, 1140 | "autoload": { 1141 | "psr-4": { 1142 | "Psr\\Cache\\": "src/" 1143 | } 1144 | }, 1145 | "notification-url": "https://packagist.org/downloads/", 1146 | "license": [ 1147 | "MIT" 1148 | ], 1149 | "authors": [ 1150 | { 1151 | "name": "PHP-FIG", 1152 | "homepage": "http://www.php-fig.org/" 1153 | } 1154 | ], 1155 | "description": "Common interface for caching libraries", 1156 | "keywords": [ 1157 | "cache", 1158 | "psr", 1159 | "psr-6" 1160 | ], 1161 | "time": "2016-08-06T20:24:11+00:00" 1162 | }, 1163 | { 1164 | "name": "psr/container", 1165 | "version": "1.0.0", 1166 | "source": { 1167 | "type": "git", 1168 | "url": "https://github.com/php-fig/container.git", 1169 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 1170 | }, 1171 | "dist": { 1172 | "type": "zip", 1173 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 1174 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 1175 | "shasum": "" 1176 | }, 1177 | "require": { 1178 | "php": ">=5.3.0" 1179 | }, 1180 | "type": "library", 1181 | "extra": { 1182 | "branch-alias": { 1183 | "dev-master": "1.0.x-dev" 1184 | } 1185 | }, 1186 | "autoload": { 1187 | "psr-4": { 1188 | "Psr\\Container\\": "src/" 1189 | } 1190 | }, 1191 | "notification-url": "https://packagist.org/downloads/", 1192 | "license": [ 1193 | "MIT" 1194 | ], 1195 | "authors": [ 1196 | { 1197 | "name": "PHP-FIG", 1198 | "homepage": "http://www.php-fig.org/" 1199 | } 1200 | ], 1201 | "description": "Common Container Interface (PHP FIG PSR-11)", 1202 | "homepage": "https://github.com/php-fig/container", 1203 | "keywords": [ 1204 | "PSR-11", 1205 | "container", 1206 | "container-interface", 1207 | "container-interop", 1208 | "psr" 1209 | ], 1210 | "time": "2017-02-14T16:28:37+00:00" 1211 | }, 1212 | { 1213 | "name": "psr/link", 1214 | "version": "1.0.0", 1215 | "source": { 1216 | "type": "git", 1217 | "url": "https://github.com/php-fig/link.git", 1218 | "reference": "eea8e8662d5cd3ae4517c9b864493f59fca95562" 1219 | }, 1220 | "dist": { 1221 | "type": "zip", 1222 | "url": "https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562", 1223 | "reference": "eea8e8662d5cd3ae4517c9b864493f59fca95562", 1224 | "shasum": "" 1225 | }, 1226 | "require": { 1227 | "php": ">=5.3.0" 1228 | }, 1229 | "type": "library", 1230 | "extra": { 1231 | "branch-alias": { 1232 | "dev-master": "1.0.x-dev" 1233 | } 1234 | }, 1235 | "autoload": { 1236 | "psr-4": { 1237 | "Psr\\Link\\": "src/" 1238 | } 1239 | }, 1240 | "notification-url": "https://packagist.org/downloads/", 1241 | "license": [ 1242 | "MIT" 1243 | ], 1244 | "authors": [ 1245 | { 1246 | "name": "PHP-FIG", 1247 | "homepage": "http://www.php-fig.org/" 1248 | } 1249 | ], 1250 | "description": "Common interfaces for HTTP links", 1251 | "keywords": [ 1252 | "http", 1253 | "http-link", 1254 | "link", 1255 | "psr", 1256 | "psr-13", 1257 | "rest" 1258 | ], 1259 | "time": "2016-10-28T16:06:13+00:00" 1260 | }, 1261 | { 1262 | "name": "psr/log", 1263 | "version": "1.0.2", 1264 | "source": { 1265 | "type": "git", 1266 | "url": "https://github.com/php-fig/log.git", 1267 | "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" 1268 | }, 1269 | "dist": { 1270 | "type": "zip", 1271 | "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", 1272 | "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", 1273 | "shasum": "" 1274 | }, 1275 | "require": { 1276 | "php": ">=5.3.0" 1277 | }, 1278 | "type": "library", 1279 | "extra": { 1280 | "branch-alias": { 1281 | "dev-master": "1.0.x-dev" 1282 | } 1283 | }, 1284 | "autoload": { 1285 | "psr-4": { 1286 | "Psr\\Log\\": "Psr/Log/" 1287 | } 1288 | }, 1289 | "notification-url": "https://packagist.org/downloads/", 1290 | "license": [ 1291 | "MIT" 1292 | ], 1293 | "authors": [ 1294 | { 1295 | "name": "PHP-FIG", 1296 | "homepage": "http://www.php-fig.org/" 1297 | } 1298 | ], 1299 | "description": "Common interface for logging libraries", 1300 | "homepage": "https://github.com/php-fig/log", 1301 | "keywords": [ 1302 | "log", 1303 | "psr", 1304 | "psr-3" 1305 | ], 1306 | "time": "2016-10-10T12:19:37+00:00" 1307 | }, 1308 | { 1309 | "name": "psr/simple-cache", 1310 | "version": "1.0.0", 1311 | "source": { 1312 | "type": "git", 1313 | "url": "https://github.com/php-fig/simple-cache.git", 1314 | "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24" 1315 | }, 1316 | "dist": { 1317 | "type": "zip", 1318 | "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24", 1319 | "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24", 1320 | "shasum": "" 1321 | }, 1322 | "require": { 1323 | "php": ">=5.3.0" 1324 | }, 1325 | "type": "library", 1326 | "extra": { 1327 | "branch-alias": { 1328 | "dev-master": "1.0.x-dev" 1329 | } 1330 | }, 1331 | "autoload": { 1332 | "psr-4": { 1333 | "Psr\\SimpleCache\\": "src/" 1334 | } 1335 | }, 1336 | "notification-url": "https://packagist.org/downloads/", 1337 | "license": [ 1338 | "MIT" 1339 | ], 1340 | "authors": [ 1341 | { 1342 | "name": "PHP-FIG", 1343 | "homepage": "http://www.php-fig.org/" 1344 | } 1345 | ], 1346 | "description": "Common interfaces for simple caching", 1347 | "keywords": [ 1348 | "cache", 1349 | "caching", 1350 | "psr", 1351 | "psr-16", 1352 | "simple-cache" 1353 | ], 1354 | "time": "2017-01-02T13:31:39+00:00" 1355 | }, 1356 | { 1357 | "name": "sensio/distribution-bundle", 1358 | "version": "v5.0.20", 1359 | "source": { 1360 | "type": "git", 1361 | "url": "https://github.com/sensiolabs/SensioDistributionBundle.git", 1362 | "reference": "4b019d4c0bd64438c42e4b6b0726085b409be8d9" 1363 | }, 1364 | "dist": { 1365 | "type": "zip", 1366 | "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/4b019d4c0bd64438c42e4b6b0726085b409be8d9", 1367 | "reference": "4b019d4c0bd64438c42e4b6b0726085b409be8d9", 1368 | "shasum": "" 1369 | }, 1370 | "require": { 1371 | "php": ">=5.3.9", 1372 | "sensiolabs/security-checker": "~3.0|~4.0", 1373 | "symfony/class-loader": "~2.3|~3.0", 1374 | "symfony/config": "~2.3|~3.0", 1375 | "symfony/dependency-injection": "~2.3|~3.0", 1376 | "symfony/filesystem": "~2.3|~3.0", 1377 | "symfony/http-kernel": "~2.3|~3.0", 1378 | "symfony/process": "~2.3|~3.0" 1379 | }, 1380 | "type": "symfony-bundle", 1381 | "extra": { 1382 | "branch-alias": { 1383 | "dev-master": "5.0.x-dev" 1384 | } 1385 | }, 1386 | "autoload": { 1387 | "psr-4": { 1388 | "Sensio\\Bundle\\DistributionBundle\\": "" 1389 | } 1390 | }, 1391 | "notification-url": "https://packagist.org/downloads/", 1392 | "license": [ 1393 | "MIT" 1394 | ], 1395 | "authors": [ 1396 | { 1397 | "name": "Fabien Potencier", 1398 | "email": "fabien@symfony.com" 1399 | } 1400 | ], 1401 | "description": "Base bundle for Symfony Distributions", 1402 | "keywords": [ 1403 | "configuration", 1404 | "distribution" 1405 | ], 1406 | "time": "2017-05-11T16:21:03+00:00" 1407 | }, 1408 | { 1409 | "name": "sensio/framework-extra-bundle", 1410 | "version": "v3.0.26", 1411 | "source": { 1412 | "type": "git", 1413 | "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", 1414 | "reference": "6d6cbe971554f0a2cc84965850481eb04a2a0059" 1415 | }, 1416 | "dist": { 1417 | "type": "zip", 1418 | "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/6d6cbe971554f0a2cc84965850481eb04a2a0059", 1419 | "reference": "6d6cbe971554f0a2cc84965850481eb04a2a0059", 1420 | "shasum": "" 1421 | }, 1422 | "require": { 1423 | "doctrine/common": "~2.2", 1424 | "symfony/dependency-injection": "~2.3|~3.0", 1425 | "symfony/framework-bundle": "~2.3|~3.0" 1426 | }, 1427 | "require-dev": { 1428 | "doctrine/doctrine-bundle": "~1.5", 1429 | "doctrine/orm": "~2.4,>=2.4.5", 1430 | "symfony/asset": "~2.7|~3.0", 1431 | "symfony/browser-kit": "~2.3|~3.0", 1432 | "symfony/dom-crawler": "~2.3|~3.0", 1433 | "symfony/expression-language": "~2.4|~3.0", 1434 | "symfony/finder": "~2.3|~3.0", 1435 | "symfony/phpunit-bridge": "~3.2", 1436 | "symfony/psr-http-message-bridge": "^0.3", 1437 | "symfony/security-bundle": "~2.4|~3.0", 1438 | "symfony/templating": "~2.3|~3.0", 1439 | "symfony/translation": "~2.3|~3.0", 1440 | "symfony/twig-bundle": "~2.3|~3.0", 1441 | "symfony/yaml": "~2.3|~3.0", 1442 | "twig/twig": "~1.12|~2.0", 1443 | "zendframework/zend-diactoros": "^1.3" 1444 | }, 1445 | "suggest": { 1446 | "symfony/expression-language": "", 1447 | "symfony/psr-http-message-bridge": "To use the PSR-7 converters", 1448 | "symfony/security-bundle": "" 1449 | }, 1450 | "type": "symfony-bundle", 1451 | "extra": { 1452 | "branch-alias": { 1453 | "dev-master": "3.0.x-dev" 1454 | } 1455 | }, 1456 | "autoload": { 1457 | "psr-4": { 1458 | "Sensio\\Bundle\\FrameworkExtraBundle\\": "" 1459 | } 1460 | }, 1461 | "notification-url": "https://packagist.org/downloads/", 1462 | "license": [ 1463 | "MIT" 1464 | ], 1465 | "authors": [ 1466 | { 1467 | "name": "Fabien Potencier", 1468 | "email": "fabien@symfony.com" 1469 | } 1470 | ], 1471 | "description": "This bundle provides a way to configure your controllers with annotations", 1472 | "keywords": [ 1473 | "annotations", 1474 | "controllers" 1475 | ], 1476 | "time": "2017-05-11T17:01:57+00:00" 1477 | }, 1478 | { 1479 | "name": "sensiolabs/security-checker", 1480 | "version": "v4.1.1", 1481 | "source": { 1482 | "type": "git", 1483 | "url": "https://github.com/sensiolabs/security-checker.git", 1484 | "reference": "cf61ce9d9706ba35e60a894fe6f3584c6d0e5c9f" 1485 | }, 1486 | "dist": { 1487 | "type": "zip", 1488 | "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/cf61ce9d9706ba35e60a894fe6f3584c6d0e5c9f", 1489 | "reference": "cf61ce9d9706ba35e60a894fe6f3584c6d0e5c9f", 1490 | "shasum": "" 1491 | }, 1492 | "require": { 1493 | "composer/ca-bundle": "^1.0", 1494 | "symfony/console": "~2.7|~3.0" 1495 | }, 1496 | "bin": [ 1497 | "security-checker" 1498 | ], 1499 | "type": "library", 1500 | "extra": { 1501 | "branch-alias": { 1502 | "dev-master": "4.1-dev" 1503 | } 1504 | }, 1505 | "autoload": { 1506 | "psr-0": { 1507 | "SensioLabs\\Security": "" 1508 | } 1509 | }, 1510 | "notification-url": "https://packagist.org/downloads/", 1511 | "license": [ 1512 | "MIT" 1513 | ], 1514 | "authors": [ 1515 | { 1516 | "name": "Fabien Potencier", 1517 | "email": "fabien.potencier@gmail.com" 1518 | } 1519 | ], 1520 | "description": "A security checker for your composer.lock", 1521 | "time": "2017-07-28T18:31:05+00:00" 1522 | }, 1523 | { 1524 | "name": "swiftmailer/swiftmailer", 1525 | "version": "v5.4.8", 1526 | "source": { 1527 | "type": "git", 1528 | "url": "https://github.com/swiftmailer/swiftmailer.git", 1529 | "reference": "9a06dc570a0367850280eefd3f1dc2da45aef517" 1530 | }, 1531 | "dist": { 1532 | "type": "zip", 1533 | "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/9a06dc570a0367850280eefd3f1dc2da45aef517", 1534 | "reference": "9a06dc570a0367850280eefd3f1dc2da45aef517", 1535 | "shasum": "" 1536 | }, 1537 | "require": { 1538 | "php": ">=5.3.3" 1539 | }, 1540 | "require-dev": { 1541 | "mockery/mockery": "~0.9.1", 1542 | "symfony/phpunit-bridge": "~3.2" 1543 | }, 1544 | "type": "library", 1545 | "extra": { 1546 | "branch-alias": { 1547 | "dev-master": "5.4-dev" 1548 | } 1549 | }, 1550 | "autoload": { 1551 | "files": [ 1552 | "lib/swift_required.php" 1553 | ] 1554 | }, 1555 | "notification-url": "https://packagist.org/downloads/", 1556 | "license": [ 1557 | "MIT" 1558 | ], 1559 | "authors": [ 1560 | { 1561 | "name": "Chris Corbyn" 1562 | }, 1563 | { 1564 | "name": "Fabien Potencier", 1565 | "email": "fabien@symfony.com" 1566 | } 1567 | ], 1568 | "description": "Swiftmailer, free feature-rich PHP mailer", 1569 | "homepage": "http://swiftmailer.org", 1570 | "keywords": [ 1571 | "email", 1572 | "mail", 1573 | "mailer" 1574 | ], 1575 | "time": "2017-05-01T15:54:03+00:00" 1576 | }, 1577 | { 1578 | "name": "symfony/monolog-bundle", 1579 | "version": "v3.1.0", 1580 | "source": { 1581 | "type": "git", 1582 | "url": "https://github.com/symfony/monolog-bundle.git", 1583 | "reference": "6f96c7dbb6b2ef70b307a1a6f897153cbca3da47" 1584 | }, 1585 | "dist": { 1586 | "type": "zip", 1587 | "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/6f96c7dbb6b2ef70b307a1a6f897153cbca3da47", 1588 | "reference": "6f96c7dbb6b2ef70b307a1a6f897153cbca3da47", 1589 | "shasum": "" 1590 | }, 1591 | "require": { 1592 | "monolog/monolog": "~1.22", 1593 | "php": ">=5.3.2", 1594 | "symfony/config": "~2.7|~3.0", 1595 | "symfony/dependency-injection": "~2.7|~3.0", 1596 | "symfony/http-kernel": "~2.7|~3.0", 1597 | "symfony/monolog-bridge": "~2.7|~3.0" 1598 | }, 1599 | "require-dev": { 1600 | "phpunit/phpunit": "^4.8", 1601 | "symfony/console": "~2.3|~3.0", 1602 | "symfony/yaml": "~2.3|~3.0" 1603 | }, 1604 | "type": "symfony-bundle", 1605 | "extra": { 1606 | "branch-alias": { 1607 | "dev-master": "3.x-dev" 1608 | } 1609 | }, 1610 | "autoload": { 1611 | "psr-4": { 1612 | "Symfony\\Bundle\\MonologBundle\\": "" 1613 | } 1614 | }, 1615 | "notification-url": "https://packagist.org/downloads/", 1616 | "license": [ 1617 | "MIT" 1618 | ], 1619 | "authors": [ 1620 | { 1621 | "name": "Symfony Community", 1622 | "homepage": "http://symfony.com/contributors" 1623 | }, 1624 | { 1625 | "name": "Fabien Potencier", 1626 | "email": "fabien@symfony.com" 1627 | } 1628 | ], 1629 | "description": "Symfony MonologBundle", 1630 | "homepage": "http://symfony.com", 1631 | "keywords": [ 1632 | "log", 1633 | "logging" 1634 | ], 1635 | "time": "2017-03-26T11:55:59+00:00" 1636 | }, 1637 | { 1638 | "name": "symfony/polyfill-apcu", 1639 | "version": "v1.4.0", 1640 | "source": { 1641 | "type": "git", 1642 | "url": "https://github.com/symfony/polyfill-apcu.git", 1643 | "reference": "2e7965b8cdfbba50d0092d3f6dca97dddec409e2" 1644 | }, 1645 | "dist": { 1646 | "type": "zip", 1647 | "url": "https://api.github.com/repos/symfony/polyfill-apcu/zipball/2e7965b8cdfbba50d0092d3f6dca97dddec409e2", 1648 | "reference": "2e7965b8cdfbba50d0092d3f6dca97dddec409e2", 1649 | "shasum": "" 1650 | }, 1651 | "require": { 1652 | "php": ">=5.3.3" 1653 | }, 1654 | "type": "library", 1655 | "extra": { 1656 | "branch-alias": { 1657 | "dev-master": "1.4-dev" 1658 | } 1659 | }, 1660 | "autoload": { 1661 | "files": [ 1662 | "bootstrap.php" 1663 | ] 1664 | }, 1665 | "notification-url": "https://packagist.org/downloads/", 1666 | "license": [ 1667 | "MIT" 1668 | ], 1669 | "authors": [ 1670 | { 1671 | "name": "Nicolas Grekas", 1672 | "email": "p@tchwork.com" 1673 | }, 1674 | { 1675 | "name": "Symfony Community", 1676 | "homepage": "https://symfony.com/contributors" 1677 | } 1678 | ], 1679 | "description": "Symfony polyfill backporting apcu_* functions to lower PHP versions", 1680 | "homepage": "https://symfony.com", 1681 | "keywords": [ 1682 | "apcu", 1683 | "compatibility", 1684 | "polyfill", 1685 | "portable", 1686 | "shim" 1687 | ], 1688 | "time": "2017-06-09T08:25:21+00:00" 1689 | }, 1690 | { 1691 | "name": "symfony/polyfill-intl-icu", 1692 | "version": "v1.4.0", 1693 | "source": { 1694 | "type": "git", 1695 | "url": "https://github.com/symfony/polyfill-intl-icu.git", 1696 | "reference": "3191cbe0ce64987bd382daf6724af31c53daae01" 1697 | }, 1698 | "dist": { 1699 | "type": "zip", 1700 | "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/3191cbe0ce64987bd382daf6724af31c53daae01", 1701 | "reference": "3191cbe0ce64987bd382daf6724af31c53daae01", 1702 | "shasum": "" 1703 | }, 1704 | "require": { 1705 | "php": ">=5.3.3", 1706 | "symfony/intl": "~2.3|~3.0|~4.0" 1707 | }, 1708 | "suggest": { 1709 | "ext-intl": "For best performance" 1710 | }, 1711 | "type": "library", 1712 | "extra": { 1713 | "branch-alias": { 1714 | "dev-master": "1.4-dev" 1715 | } 1716 | }, 1717 | "autoload": { 1718 | "files": [ 1719 | "bootstrap.php" 1720 | ] 1721 | }, 1722 | "notification-url": "https://packagist.org/downloads/", 1723 | "license": [ 1724 | "MIT" 1725 | ], 1726 | "authors": [ 1727 | { 1728 | "name": "Nicolas Grekas", 1729 | "email": "p@tchwork.com" 1730 | }, 1731 | { 1732 | "name": "Symfony Community", 1733 | "homepage": "https://symfony.com/contributors" 1734 | } 1735 | ], 1736 | "description": "Symfony polyfill for intl's ICU-related data and classes", 1737 | "homepage": "https://symfony.com", 1738 | "keywords": [ 1739 | "compatibility", 1740 | "icu", 1741 | "intl", 1742 | "polyfill", 1743 | "portable", 1744 | "shim" 1745 | ], 1746 | "time": "2017-06-09T08:25:21+00:00" 1747 | }, 1748 | { 1749 | "name": "symfony/polyfill-mbstring", 1750 | "version": "v1.4.0", 1751 | "source": { 1752 | "type": "git", 1753 | "url": "https://github.com/symfony/polyfill-mbstring.git", 1754 | "reference": "f29dca382a6485c3cbe6379f0c61230167681937" 1755 | }, 1756 | "dist": { 1757 | "type": "zip", 1758 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/f29dca382a6485c3cbe6379f0c61230167681937", 1759 | "reference": "f29dca382a6485c3cbe6379f0c61230167681937", 1760 | "shasum": "" 1761 | }, 1762 | "require": { 1763 | "php": ">=5.3.3" 1764 | }, 1765 | "suggest": { 1766 | "ext-mbstring": "For best performance" 1767 | }, 1768 | "type": "library", 1769 | "extra": { 1770 | "branch-alias": { 1771 | "dev-master": "1.4-dev" 1772 | } 1773 | }, 1774 | "autoload": { 1775 | "psr-4": { 1776 | "Symfony\\Polyfill\\Mbstring\\": "" 1777 | }, 1778 | "files": [ 1779 | "bootstrap.php" 1780 | ] 1781 | }, 1782 | "notification-url": "https://packagist.org/downloads/", 1783 | "license": [ 1784 | "MIT" 1785 | ], 1786 | "authors": [ 1787 | { 1788 | "name": "Nicolas Grekas", 1789 | "email": "p@tchwork.com" 1790 | }, 1791 | { 1792 | "name": "Symfony Community", 1793 | "homepage": "https://symfony.com/contributors" 1794 | } 1795 | ], 1796 | "description": "Symfony polyfill for the Mbstring extension", 1797 | "homepage": "https://symfony.com", 1798 | "keywords": [ 1799 | "compatibility", 1800 | "mbstring", 1801 | "polyfill", 1802 | "portable", 1803 | "shim" 1804 | ], 1805 | "time": "2017-06-09T14:24:12+00:00" 1806 | }, 1807 | { 1808 | "name": "symfony/polyfill-php56", 1809 | "version": "v1.4.0", 1810 | "source": { 1811 | "type": "git", 1812 | "url": "https://github.com/symfony/polyfill-php56.git", 1813 | "reference": "bc0b7d6cb36b10cfabb170a3e359944a95174929" 1814 | }, 1815 | "dist": { 1816 | "type": "zip", 1817 | "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/bc0b7d6cb36b10cfabb170a3e359944a95174929", 1818 | "reference": "bc0b7d6cb36b10cfabb170a3e359944a95174929", 1819 | "shasum": "" 1820 | }, 1821 | "require": { 1822 | "php": ">=5.3.3", 1823 | "symfony/polyfill-util": "~1.0" 1824 | }, 1825 | "type": "library", 1826 | "extra": { 1827 | "branch-alias": { 1828 | "dev-master": "1.4-dev" 1829 | } 1830 | }, 1831 | "autoload": { 1832 | "psr-4": { 1833 | "Symfony\\Polyfill\\Php56\\": "" 1834 | }, 1835 | "files": [ 1836 | "bootstrap.php" 1837 | ] 1838 | }, 1839 | "notification-url": "https://packagist.org/downloads/", 1840 | "license": [ 1841 | "MIT" 1842 | ], 1843 | "authors": [ 1844 | { 1845 | "name": "Nicolas Grekas", 1846 | "email": "p@tchwork.com" 1847 | }, 1848 | { 1849 | "name": "Symfony Community", 1850 | "homepage": "https://symfony.com/contributors" 1851 | } 1852 | ], 1853 | "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", 1854 | "homepage": "https://symfony.com", 1855 | "keywords": [ 1856 | "compatibility", 1857 | "polyfill", 1858 | "portable", 1859 | "shim" 1860 | ], 1861 | "time": "2017-06-09T08:25:21+00:00" 1862 | }, 1863 | { 1864 | "name": "symfony/polyfill-php70", 1865 | "version": "v1.4.0", 1866 | "source": { 1867 | "type": "git", 1868 | "url": "https://github.com/symfony/polyfill-php70.git", 1869 | "reference": "032fd647d5c11a9ceab8ee8747e13b5448e93874" 1870 | }, 1871 | "dist": { 1872 | "type": "zip", 1873 | "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/032fd647d5c11a9ceab8ee8747e13b5448e93874", 1874 | "reference": "032fd647d5c11a9ceab8ee8747e13b5448e93874", 1875 | "shasum": "" 1876 | }, 1877 | "require": { 1878 | "paragonie/random_compat": "~1.0|~2.0", 1879 | "php": ">=5.3.3" 1880 | }, 1881 | "type": "library", 1882 | "extra": { 1883 | "branch-alias": { 1884 | "dev-master": "1.4-dev" 1885 | } 1886 | }, 1887 | "autoload": { 1888 | "psr-4": { 1889 | "Symfony\\Polyfill\\Php70\\": "" 1890 | }, 1891 | "files": [ 1892 | "bootstrap.php" 1893 | ], 1894 | "classmap": [ 1895 | "Resources/stubs" 1896 | ] 1897 | }, 1898 | "notification-url": "https://packagist.org/downloads/", 1899 | "license": [ 1900 | "MIT" 1901 | ], 1902 | "authors": [ 1903 | { 1904 | "name": "Nicolas Grekas", 1905 | "email": "p@tchwork.com" 1906 | }, 1907 | { 1908 | "name": "Symfony Community", 1909 | "homepage": "https://symfony.com/contributors" 1910 | } 1911 | ], 1912 | "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", 1913 | "homepage": "https://symfony.com", 1914 | "keywords": [ 1915 | "compatibility", 1916 | "polyfill", 1917 | "portable", 1918 | "shim" 1919 | ], 1920 | "time": "2017-06-09T14:24:12+00:00" 1921 | }, 1922 | { 1923 | "name": "symfony/polyfill-util", 1924 | "version": "v1.4.0", 1925 | "source": { 1926 | "type": "git", 1927 | "url": "https://github.com/symfony/polyfill-util.git", 1928 | "reference": "ebccbde4aad410f6438d86d7d261c6b4d2b9a51d" 1929 | }, 1930 | "dist": { 1931 | "type": "zip", 1932 | "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/ebccbde4aad410f6438d86d7d261c6b4d2b9a51d", 1933 | "reference": "ebccbde4aad410f6438d86d7d261c6b4d2b9a51d", 1934 | "shasum": "" 1935 | }, 1936 | "require": { 1937 | "php": ">=5.3.3" 1938 | }, 1939 | "type": "library", 1940 | "extra": { 1941 | "branch-alias": { 1942 | "dev-master": "1.4-dev" 1943 | } 1944 | }, 1945 | "autoload": { 1946 | "psr-4": { 1947 | "Symfony\\Polyfill\\Util\\": "" 1948 | } 1949 | }, 1950 | "notification-url": "https://packagist.org/downloads/", 1951 | "license": [ 1952 | "MIT" 1953 | ], 1954 | "authors": [ 1955 | { 1956 | "name": "Nicolas Grekas", 1957 | "email": "p@tchwork.com" 1958 | }, 1959 | { 1960 | "name": "Symfony Community", 1961 | "homepage": "https://symfony.com/contributors" 1962 | } 1963 | ], 1964 | "description": "Symfony utilities for portability of PHP codes", 1965 | "homepage": "https://symfony.com", 1966 | "keywords": [ 1967 | "compat", 1968 | "compatibility", 1969 | "polyfill", 1970 | "shim" 1971 | ], 1972 | "time": "2017-06-09T08:25:21+00:00" 1973 | }, 1974 | { 1975 | "name": "symfony/swiftmailer-bundle", 1976 | "version": "v2.6.3", 1977 | "source": { 1978 | "type": "git", 1979 | "url": "https://github.com/symfony/swiftmailer-bundle.git", 1980 | "reference": "11555c338f3c367b0a1bd2f024a53aa813f4ce00" 1981 | }, 1982 | "dist": { 1983 | "type": "zip", 1984 | "url": "https://api.github.com/repos/symfony/swiftmailer-bundle/zipball/11555c338f3c367b0a1bd2f024a53aa813f4ce00", 1985 | "reference": "11555c338f3c367b0a1bd2f024a53aa813f4ce00", 1986 | "shasum": "" 1987 | }, 1988 | "require": { 1989 | "php": ">=5.3.2", 1990 | "swiftmailer/swiftmailer": "~4.2|~5.0", 1991 | "symfony/config": "~2.7|~3.0", 1992 | "symfony/dependency-injection": "~2.7|~3.0", 1993 | "symfony/http-kernel": "~2.7|~3.0" 1994 | }, 1995 | "require-dev": { 1996 | "symfony/console": "~2.7|~3.0", 1997 | "symfony/framework-bundle": "~2.7|~3.0", 1998 | "symfony/phpunit-bridge": "~3.3@dev", 1999 | "symfony/yaml": "~2.7|~3.0" 2000 | }, 2001 | "suggest": { 2002 | "psr/log": "Allows logging" 2003 | }, 2004 | "type": "symfony-bundle", 2005 | "extra": { 2006 | "branch-alias": { 2007 | "dev-master": "2.6-dev" 2008 | } 2009 | }, 2010 | "autoload": { 2011 | "psr-4": { 2012 | "Symfony\\Bundle\\SwiftmailerBundle\\": "" 2013 | } 2014 | }, 2015 | "notification-url": "https://packagist.org/downloads/", 2016 | "license": [ 2017 | "MIT" 2018 | ], 2019 | "authors": [ 2020 | { 2021 | "name": "Symfony Community", 2022 | "homepage": "http://symfony.com/contributors" 2023 | }, 2024 | { 2025 | "name": "Fabien Potencier", 2026 | "email": "fabien@symfony.com" 2027 | } 2028 | ], 2029 | "description": "Symfony SwiftmailerBundle", 2030 | "homepage": "http://symfony.com", 2031 | "time": "2017-07-22T07:18:13+00:00" 2032 | }, 2033 | { 2034 | "name": "symfony/symfony", 2035 | "version": "v3.3.6", 2036 | "source": { 2037 | "type": "git", 2038 | "url": "https://github.com/symfony/symfony.git", 2039 | "reference": "6f80cbd2dd89c5308b14e03d806356fac72c263e" 2040 | }, 2041 | "dist": { 2042 | "type": "zip", 2043 | "url": "https://api.github.com/repos/symfony/symfony/zipball/6f80cbd2dd89c5308b14e03d806356fac72c263e", 2044 | "reference": "6f80cbd2dd89c5308b14e03d806356fac72c263e", 2045 | "shasum": "" 2046 | }, 2047 | "require": { 2048 | "doctrine/common": "~2.4", 2049 | "ext-xml": "*", 2050 | "fig/link-util": "^1.0", 2051 | "php": ">=5.5.9", 2052 | "psr/cache": "~1.0", 2053 | "psr/container": "^1.0", 2054 | "psr/link": "^1.0", 2055 | "psr/log": "~1.0", 2056 | "psr/simple-cache": "^1.0", 2057 | "symfony/polyfill-intl-icu": "~1.0", 2058 | "symfony/polyfill-mbstring": "~1.0", 2059 | "symfony/polyfill-php56": "~1.0", 2060 | "symfony/polyfill-php70": "~1.0", 2061 | "symfony/polyfill-util": "~1.0", 2062 | "twig/twig": "~1.34|~2.4" 2063 | }, 2064 | "conflict": { 2065 | "phpdocumentor/reflection-docblock": "<3.0||>=3.2.0", 2066 | "phpdocumentor/type-resolver": "<0.2.0", 2067 | "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" 2068 | }, 2069 | "provide": { 2070 | "psr/cache-implementation": "1.0", 2071 | "psr/container-implementation": "1.0", 2072 | "psr/simple-cache-implementation": "1.0" 2073 | }, 2074 | "replace": { 2075 | "symfony/asset": "self.version", 2076 | "symfony/browser-kit": "self.version", 2077 | "symfony/cache": "self.version", 2078 | "symfony/class-loader": "self.version", 2079 | "symfony/config": "self.version", 2080 | "symfony/console": "self.version", 2081 | "symfony/css-selector": "self.version", 2082 | "symfony/debug": "self.version", 2083 | "symfony/debug-bundle": "self.version", 2084 | "symfony/dependency-injection": "self.version", 2085 | "symfony/doctrine-bridge": "self.version", 2086 | "symfony/dom-crawler": "self.version", 2087 | "symfony/dotenv": "self.version", 2088 | "symfony/event-dispatcher": "self.version", 2089 | "symfony/expression-language": "self.version", 2090 | "symfony/filesystem": "self.version", 2091 | "symfony/finder": "self.version", 2092 | "symfony/form": "self.version", 2093 | "symfony/framework-bundle": "self.version", 2094 | "symfony/http-foundation": "self.version", 2095 | "symfony/http-kernel": "self.version", 2096 | "symfony/inflector": "self.version", 2097 | "symfony/intl": "self.version", 2098 | "symfony/ldap": "self.version", 2099 | "symfony/monolog-bridge": "self.version", 2100 | "symfony/options-resolver": "self.version", 2101 | "symfony/process": "self.version", 2102 | "symfony/property-access": "self.version", 2103 | "symfony/property-info": "self.version", 2104 | "symfony/proxy-manager-bridge": "self.version", 2105 | "symfony/routing": "self.version", 2106 | "symfony/security": "self.version", 2107 | "symfony/security-bundle": "self.version", 2108 | "symfony/security-core": "self.version", 2109 | "symfony/security-csrf": "self.version", 2110 | "symfony/security-guard": "self.version", 2111 | "symfony/security-http": "self.version", 2112 | "symfony/serializer": "self.version", 2113 | "symfony/stopwatch": "self.version", 2114 | "symfony/templating": "self.version", 2115 | "symfony/translation": "self.version", 2116 | "symfony/twig-bridge": "self.version", 2117 | "symfony/twig-bundle": "self.version", 2118 | "symfony/validator": "self.version", 2119 | "symfony/var-dumper": "self.version", 2120 | "symfony/web-link": "self.version", 2121 | "symfony/web-profiler-bundle": "self.version", 2122 | "symfony/web-server-bundle": "self.version", 2123 | "symfony/workflow": "self.version", 2124 | "symfony/yaml": "self.version" 2125 | }, 2126 | "require-dev": { 2127 | "cache/integration-tests": "dev-master", 2128 | "doctrine/cache": "~1.6", 2129 | "doctrine/data-fixtures": "1.0.*", 2130 | "doctrine/dbal": "~2.4", 2131 | "doctrine/doctrine-bundle": "~1.4", 2132 | "doctrine/orm": "~2.4,>=2.4.5", 2133 | "egulias/email-validator": "~1.2,>=1.2.8|~2.0", 2134 | "monolog/monolog": "~1.11", 2135 | "ocramius/proxy-manager": "~0.4|~1.0|~2.0", 2136 | "phpdocumentor/reflection-docblock": "^3.0", 2137 | "predis/predis": "~1.0", 2138 | "sensio/framework-extra-bundle": "^3.0.2", 2139 | "symfony/phpunit-bridge": "~3.2", 2140 | "symfony/polyfill-apcu": "~1.1", 2141 | "symfony/security-acl": "~2.8|~3.0" 2142 | }, 2143 | "type": "library", 2144 | "extra": { 2145 | "branch-alias": { 2146 | "dev-master": "3.3-dev" 2147 | } 2148 | }, 2149 | "autoload": { 2150 | "psr-4": { 2151 | "Symfony\\Bridge\\Doctrine\\": "src/Symfony/Bridge/Doctrine/", 2152 | "Symfony\\Bridge\\Monolog\\": "src/Symfony/Bridge/Monolog/", 2153 | "Symfony\\Bridge\\ProxyManager\\": "src/Symfony/Bridge/ProxyManager/", 2154 | "Symfony\\Bridge\\Twig\\": "src/Symfony/Bridge/Twig/", 2155 | "Symfony\\Bundle\\": "src/Symfony/Bundle/", 2156 | "Symfony\\Component\\": "src/Symfony/Component/" 2157 | }, 2158 | "classmap": [ 2159 | "src/Symfony/Component/Intl/Resources/stubs" 2160 | ], 2161 | "exclude-from-classmap": [ 2162 | "**/Tests/" 2163 | ] 2164 | }, 2165 | "notification-url": "https://packagist.org/downloads/", 2166 | "license": [ 2167 | "MIT" 2168 | ], 2169 | "authors": [ 2170 | { 2171 | "name": "Fabien Potencier", 2172 | "email": "fabien@symfony.com" 2173 | }, 2174 | { 2175 | "name": "Symfony Community", 2176 | "homepage": "https://symfony.com/contributors" 2177 | } 2178 | ], 2179 | "description": "The Symfony PHP framework", 2180 | "homepage": "https://symfony.com", 2181 | "keywords": [ 2182 | "framework" 2183 | ], 2184 | "time": "2017-08-01T10:26:30+00:00" 2185 | }, 2186 | { 2187 | "name": "twig/twig", 2188 | "version": "v1.34.4", 2189 | "source": { 2190 | "type": "git", 2191 | "url": "https://github.com/twigphp/Twig.git", 2192 | "reference": "f878bab48edb66ad9c6ed626bf817f60c6c096ee" 2193 | }, 2194 | "dist": { 2195 | "type": "zip", 2196 | "url": "https://api.github.com/repos/twigphp/Twig/zipball/f878bab48edb66ad9c6ed626bf817f60c6c096ee", 2197 | "reference": "f878bab48edb66ad9c6ed626bf817f60c6c096ee", 2198 | "shasum": "" 2199 | }, 2200 | "require": { 2201 | "php": ">=5.3.3" 2202 | }, 2203 | "require-dev": { 2204 | "psr/container": "^1.0", 2205 | "symfony/debug": "~2.7", 2206 | "symfony/phpunit-bridge": "~3.3@dev" 2207 | }, 2208 | "type": "library", 2209 | "extra": { 2210 | "branch-alias": { 2211 | "dev-master": "1.34-dev" 2212 | } 2213 | }, 2214 | "autoload": { 2215 | "psr-0": { 2216 | "Twig_": "lib/" 2217 | }, 2218 | "psr-4": { 2219 | "Twig\\": "src/" 2220 | } 2221 | }, 2222 | "notification-url": "https://packagist.org/downloads/", 2223 | "license": [ 2224 | "BSD-3-Clause" 2225 | ], 2226 | "authors": [ 2227 | { 2228 | "name": "Fabien Potencier", 2229 | "email": "fabien@symfony.com", 2230 | "homepage": "http://fabien.potencier.org", 2231 | "role": "Lead Developer" 2232 | }, 2233 | { 2234 | "name": "Armin Ronacher", 2235 | "email": "armin.ronacher@active-4.com", 2236 | "role": "Project Founder" 2237 | }, 2238 | { 2239 | "name": "Twig Team", 2240 | "homepage": "http://twig.sensiolabs.org/contributors", 2241 | "role": "Contributors" 2242 | } 2243 | ], 2244 | "description": "Twig, the flexible, fast, and secure template language for PHP", 2245 | "homepage": "http://twig.sensiolabs.org", 2246 | "keywords": [ 2247 | "templating" 2248 | ], 2249 | "time": "2017-07-04T13:19:31+00:00" 2250 | } 2251 | ], 2252 | "packages-dev": [ 2253 | { 2254 | "name": "sensio/generator-bundle", 2255 | "version": "v3.1.6", 2256 | "source": { 2257 | "type": "git", 2258 | "url": "https://github.com/sensiolabs/SensioGeneratorBundle.git", 2259 | "reference": "128bc5dabc91ca40b7445f094968dd70ccd58305" 2260 | }, 2261 | "dist": { 2262 | "type": "zip", 2263 | "url": "https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/128bc5dabc91ca40b7445f094968dd70ccd58305", 2264 | "reference": "128bc5dabc91ca40b7445f094968dd70ccd58305", 2265 | "shasum": "" 2266 | }, 2267 | "require": { 2268 | "symfony/console": "~2.7|~3.0", 2269 | "symfony/framework-bundle": "~2.7|~3.0", 2270 | "symfony/process": "~2.7|~3.0", 2271 | "symfony/yaml": "~2.7|~3.0", 2272 | "twig/twig": "^1.28.2|^2.0" 2273 | }, 2274 | "require-dev": { 2275 | "doctrine/orm": "~2.4", 2276 | "symfony/doctrine-bridge": "~2.7|~3.0", 2277 | "symfony/filesystem": "~2.7|~3.0", 2278 | "symfony/phpunit-bridge": "^3.3" 2279 | }, 2280 | "type": "symfony-bundle", 2281 | "extra": { 2282 | "branch-alias": { 2283 | "dev-master": "3.1.x-dev" 2284 | } 2285 | }, 2286 | "autoload": { 2287 | "psr-4": { 2288 | "Sensio\\Bundle\\GeneratorBundle\\": "" 2289 | }, 2290 | "exclude-from-classmap": [ 2291 | "/Tests/" 2292 | ] 2293 | }, 2294 | "notification-url": "https://packagist.org/downloads/", 2295 | "license": [ 2296 | "MIT" 2297 | ], 2298 | "authors": [ 2299 | { 2300 | "name": "Fabien Potencier", 2301 | "email": "fabien@symfony.com" 2302 | } 2303 | ], 2304 | "description": "This bundle generates code for you", 2305 | "time": "2017-07-18T07:57:44+00:00" 2306 | }, 2307 | { 2308 | "name": "symfony/phpunit-bridge", 2309 | "version": "v3.3.6", 2310 | "source": { 2311 | "type": "git", 2312 | "url": "https://github.com/symfony/phpunit-bridge.git", 2313 | "reference": "c2c124b7f9de79f4a64dc011f041a3a2c768b913" 2314 | }, 2315 | "dist": { 2316 | "type": "zip", 2317 | "url": "https://api.github.com/repos/symfony/phpunit-bridge/zipball/c2c124b7f9de79f4a64dc011f041a3a2c768b913", 2318 | "reference": "c2c124b7f9de79f4a64dc011f041a3a2c768b913", 2319 | "shasum": "" 2320 | }, 2321 | "require": { 2322 | "php": ">=5.3.3" 2323 | }, 2324 | "conflict": { 2325 | "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" 2326 | }, 2327 | "suggest": { 2328 | "ext-zip": "Zip support is required when using bin/simple-phpunit", 2329 | "symfony/debug": "For tracking deprecated interfaces usages at runtime with DebugClassLoader" 2330 | }, 2331 | "bin": [ 2332 | "bin/simple-phpunit" 2333 | ], 2334 | "type": "symfony-bridge", 2335 | "extra": { 2336 | "branch-alias": { 2337 | "dev-master": "3.3-dev" 2338 | } 2339 | }, 2340 | "autoload": { 2341 | "files": [ 2342 | "bootstrap.php" 2343 | ], 2344 | "psr-4": { 2345 | "Symfony\\Bridge\\PhpUnit\\": "" 2346 | }, 2347 | "exclude-from-classmap": [ 2348 | "/Tests/" 2349 | ] 2350 | }, 2351 | "notification-url": "https://packagist.org/downloads/", 2352 | "license": [ 2353 | "MIT" 2354 | ], 2355 | "authors": [ 2356 | { 2357 | "name": "Nicolas Grekas", 2358 | "email": "p@tchwork.com" 2359 | }, 2360 | { 2361 | "name": "Symfony Community", 2362 | "homepage": "https://symfony.com/contributors" 2363 | } 2364 | ], 2365 | "description": "Symfony PHPUnit Bridge", 2366 | "homepage": "https://symfony.com", 2367 | "time": "2017-06-12T13:35:45+00:00" 2368 | } 2369 | ], 2370 | "aliases": [], 2371 | "minimum-stability": "stable", 2372 | "stability-flags": [], 2373 | "prefer-stable": false, 2374 | "prefer-lowest": false, 2375 | "platform": { 2376 | "php": ">=5.5.9" 2377 | }, 2378 | "platform-dev": [], 2379 | "platform-overrides": { 2380 | "php": "5.5.9" 2381 | } 2382 | } 2383 | -------------------------------------------------------------------------------- /app/phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | tests 18 | 19 | 20 | 21 | 22 | 23 | src 24 | 25 | src/*Bundle/Resources 26 | src/*/*Bundle/Resources 27 | src/*/Bundle/*Bundle/Resources 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | Require all denied 3 | 4 | 5 | Order deny,allow 6 | Deny from all 7 | 8 | -------------------------------------------------------------------------------- /app/src/AppBundle/AppBundle.php: -------------------------------------------------------------------------------- 1 | render('default/index.html.twig', [ 18 | 'base_dir' => realpath($this->getParameter('kernel.project_dir')).DIRECTORY_SEPARATOR, 19 | ]); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /app/tests/AppBundle/Controller/DefaultControllerTest.php: -------------------------------------------------------------------------------- 1 | request('GET', '/'); 14 | 15 | $this->assertEquals(200, $client->getResponse()->getStatusCode()); 16 | $this->assertContains('Welcome to Symfony', $crawler->filter('#container h1')->text()); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/var/SymfonyRequirements.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | /* 13 | * Users of PHP 5.2 should be able to run the requirements checks. 14 | * This is why the file and all classes must be compatible with PHP 5.2+ 15 | * (e.g. not using namespaces and closures). 16 | * 17 | * ************** CAUTION ************** 18 | * 19 | * DO NOT EDIT THIS FILE as it will be overridden by Composer as part of 20 | * the installation/update process. The original file resides in the 21 | * SensioDistributionBundle. 22 | * 23 | * ************** CAUTION ************** 24 | */ 25 | 26 | /** 27 | * Represents a single PHP requirement, e.g. an installed extension. 28 | * It can be a mandatory requirement or an optional recommendation. 29 | * There is a special subclass, named PhpIniRequirement, to check a php.ini configuration. 30 | * 31 | * @author Tobias Schultze 32 | */ 33 | class Requirement 34 | { 35 | private $fulfilled; 36 | private $testMessage; 37 | private $helpText; 38 | private $helpHtml; 39 | private $optional; 40 | 41 | /** 42 | * Constructor that initializes the requirement. 43 | * 44 | * @param bool $fulfilled Whether the requirement is fulfilled 45 | * @param string $testMessage The message for testing the requirement 46 | * @param string $helpHtml The help text formatted in HTML for resolving the problem 47 | * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) 48 | * @param bool $optional Whether this is only an optional recommendation not a mandatory requirement 49 | */ 50 | public function __construct($fulfilled, $testMessage, $helpHtml, $helpText = null, $optional = false) 51 | { 52 | $this->fulfilled = (bool) $fulfilled; 53 | $this->testMessage = (string) $testMessage; 54 | $this->helpHtml = (string) $helpHtml; 55 | $this->helpText = null === $helpText ? strip_tags($this->helpHtml) : (string) $helpText; 56 | $this->optional = (bool) $optional; 57 | } 58 | 59 | /** 60 | * Returns whether the requirement is fulfilled. 61 | * 62 | * @return bool true if fulfilled, otherwise false 63 | */ 64 | public function isFulfilled() 65 | { 66 | return $this->fulfilled; 67 | } 68 | 69 | /** 70 | * Returns the message for testing the requirement. 71 | * 72 | * @return string The test message 73 | */ 74 | public function getTestMessage() 75 | { 76 | return $this->testMessage; 77 | } 78 | 79 | /** 80 | * Returns the help text for resolving the problem. 81 | * 82 | * @return string The help text 83 | */ 84 | public function getHelpText() 85 | { 86 | return $this->helpText; 87 | } 88 | 89 | /** 90 | * Returns the help text formatted in HTML. 91 | * 92 | * @return string The HTML help 93 | */ 94 | public function getHelpHtml() 95 | { 96 | return $this->helpHtml; 97 | } 98 | 99 | /** 100 | * Returns whether this is only an optional recommendation and not a mandatory requirement. 101 | * 102 | * @return bool true if optional, false if mandatory 103 | */ 104 | public function isOptional() 105 | { 106 | return $this->optional; 107 | } 108 | } 109 | 110 | /** 111 | * Represents a PHP requirement in form of a php.ini configuration. 112 | * 113 | * @author Tobias Schultze 114 | */ 115 | class PhpIniRequirement extends Requirement 116 | { 117 | /** 118 | * Constructor that initializes the requirement. 119 | * 120 | * @param string $cfgName The configuration name used for ini_get() 121 | * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false, 122 | * or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement 123 | * @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false. 124 | * This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. 125 | * Example: You require a config to be true but PHP later removes this config and defaults it to true internally. 126 | * @param string|null $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived) 127 | * @param string|null $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived) 128 | * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) 129 | * @param bool $optional Whether this is only an optional recommendation not a mandatory requirement 130 | */ 131 | public function __construct($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null, $optional = false) 132 | { 133 | $cfgValue = ini_get($cfgName); 134 | 135 | if (is_callable($evaluation)) { 136 | if (null === $testMessage || null === $helpHtml) { 137 | throw new InvalidArgumentException('You must provide the parameters testMessage and helpHtml for a callback evaluation.'); 138 | } 139 | 140 | $fulfilled = call_user_func($evaluation, $cfgValue); 141 | } else { 142 | if (null === $testMessage) { 143 | $testMessage = sprintf('%s %s be %s in php.ini', 144 | $cfgName, 145 | $optional ? 'should' : 'must', 146 | $evaluation ? 'enabled' : 'disabled' 147 | ); 148 | } 149 | 150 | if (null === $helpHtml) { 151 | $helpHtml = sprintf('Set %s to %s in php.ini*.', 152 | $cfgName, 153 | $evaluation ? 'on' : 'off' 154 | ); 155 | } 156 | 157 | $fulfilled = $evaluation == $cfgValue; 158 | } 159 | 160 | parent::__construct($fulfilled || ($approveCfgAbsence && false === $cfgValue), $testMessage, $helpHtml, $helpText, $optional); 161 | } 162 | } 163 | 164 | /** 165 | * A RequirementCollection represents a set of Requirement instances. 166 | * 167 | * @author Tobias Schultze 168 | */ 169 | class RequirementCollection implements IteratorAggregate 170 | { 171 | /** 172 | * @var Requirement[] 173 | */ 174 | private $requirements = array(); 175 | 176 | /** 177 | * Gets the current RequirementCollection as an Iterator. 178 | * 179 | * @return Traversable A Traversable interface 180 | */ 181 | public function getIterator() 182 | { 183 | return new ArrayIterator($this->requirements); 184 | } 185 | 186 | /** 187 | * Adds a Requirement. 188 | * 189 | * @param Requirement $requirement A Requirement instance 190 | */ 191 | public function add(Requirement $requirement) 192 | { 193 | $this->requirements[] = $requirement; 194 | } 195 | 196 | /** 197 | * Adds a mandatory requirement. 198 | * 199 | * @param bool $fulfilled Whether the requirement is fulfilled 200 | * @param string $testMessage The message for testing the requirement 201 | * @param string $helpHtml The help text formatted in HTML for resolving the problem 202 | * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) 203 | */ 204 | public function addRequirement($fulfilled, $testMessage, $helpHtml, $helpText = null) 205 | { 206 | $this->add(new Requirement($fulfilled, $testMessage, $helpHtml, $helpText, false)); 207 | } 208 | 209 | /** 210 | * Adds an optional recommendation. 211 | * 212 | * @param bool $fulfilled Whether the recommendation is fulfilled 213 | * @param string $testMessage The message for testing the recommendation 214 | * @param string $helpHtml The help text formatted in HTML for resolving the problem 215 | * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) 216 | */ 217 | public function addRecommendation($fulfilled, $testMessage, $helpHtml, $helpText = null) 218 | { 219 | $this->add(new Requirement($fulfilled, $testMessage, $helpHtml, $helpText, true)); 220 | } 221 | 222 | /** 223 | * Adds a mandatory requirement in form of a php.ini configuration. 224 | * 225 | * @param string $cfgName The configuration name used for ini_get() 226 | * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false, 227 | * or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement 228 | * @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false. 229 | * This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. 230 | * Example: You require a config to be true but PHP later removes this config and defaults it to true internally. 231 | * @param string $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived) 232 | * @param string $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived) 233 | * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) 234 | */ 235 | public function addPhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null) 236 | { 237 | $this->add(new PhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence, $testMessage, $helpHtml, $helpText, false)); 238 | } 239 | 240 | /** 241 | * Adds an optional recommendation in form of a php.ini configuration. 242 | * 243 | * @param string $cfgName The configuration name used for ini_get() 244 | * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false, 245 | * or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement 246 | * @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false. 247 | * This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. 248 | * Example: You require a config to be true but PHP later removes this config and defaults it to true internally. 249 | * @param string $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived) 250 | * @param string $helpHtml The help text formatted in HTML for resolving the problem (when null and $evaluation is a boolean a default help is derived) 251 | * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) 252 | */ 253 | public function addPhpIniRecommendation($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null) 254 | { 255 | $this->add(new PhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence, $testMessage, $helpHtml, $helpText, true)); 256 | } 257 | 258 | /** 259 | * Adds a requirement collection to the current set of requirements. 260 | * 261 | * @param RequirementCollection $collection A RequirementCollection instance 262 | */ 263 | public function addCollection(RequirementCollection $collection) 264 | { 265 | $this->requirements = array_merge($this->requirements, $collection->all()); 266 | } 267 | 268 | /** 269 | * Returns both requirements and recommendations. 270 | * 271 | * @return Requirement[] 272 | */ 273 | public function all() 274 | { 275 | return $this->requirements; 276 | } 277 | 278 | /** 279 | * Returns all mandatory requirements. 280 | * 281 | * @return Requirement[] 282 | */ 283 | public function getRequirements() 284 | { 285 | $array = array(); 286 | foreach ($this->requirements as $req) { 287 | if (!$req->isOptional()) { 288 | $array[] = $req; 289 | } 290 | } 291 | 292 | return $array; 293 | } 294 | 295 | /** 296 | * Returns the mandatory requirements that were not met. 297 | * 298 | * @return Requirement[] 299 | */ 300 | public function getFailedRequirements() 301 | { 302 | $array = array(); 303 | foreach ($this->requirements as $req) { 304 | if (!$req->isFulfilled() && !$req->isOptional()) { 305 | $array[] = $req; 306 | } 307 | } 308 | 309 | return $array; 310 | } 311 | 312 | /** 313 | * Returns all optional recommendations. 314 | * 315 | * @return Requirement[] 316 | */ 317 | public function getRecommendations() 318 | { 319 | $array = array(); 320 | foreach ($this->requirements as $req) { 321 | if ($req->isOptional()) { 322 | $array[] = $req; 323 | } 324 | } 325 | 326 | return $array; 327 | } 328 | 329 | /** 330 | * Returns the recommendations that were not met. 331 | * 332 | * @return Requirement[] 333 | */ 334 | public function getFailedRecommendations() 335 | { 336 | $array = array(); 337 | foreach ($this->requirements as $req) { 338 | if (!$req->isFulfilled() && $req->isOptional()) { 339 | $array[] = $req; 340 | } 341 | } 342 | 343 | return $array; 344 | } 345 | 346 | /** 347 | * Returns whether a php.ini configuration is not correct. 348 | * 349 | * @return bool php.ini configuration problem? 350 | */ 351 | public function hasPhpIniConfigIssue() 352 | { 353 | foreach ($this->requirements as $req) { 354 | if (!$req->isFulfilled() && $req instanceof PhpIniRequirement) { 355 | return true; 356 | } 357 | } 358 | 359 | return false; 360 | } 361 | 362 | /** 363 | * Returns the PHP configuration file (php.ini) path. 364 | * 365 | * @return string|false php.ini file path 366 | */ 367 | public function getPhpIniConfigPath() 368 | { 369 | return get_cfg_var('cfg_file_path'); 370 | } 371 | } 372 | 373 | /** 374 | * This class specifies all requirements and optional recommendations that 375 | * are necessary to run the Symfony Standard Edition. 376 | * 377 | * @author Tobias Schultze 378 | * @author Fabien Potencier 379 | */ 380 | class SymfonyRequirements extends RequirementCollection 381 | { 382 | const LEGACY_REQUIRED_PHP_VERSION = '5.3.3'; 383 | const REQUIRED_PHP_VERSION = '5.5.9'; 384 | 385 | /** 386 | * Constructor that initializes the requirements. 387 | */ 388 | public function __construct() 389 | { 390 | /* mandatory requirements follow */ 391 | 392 | $installedPhpVersion = phpversion(); 393 | $requiredPhpVersion = $this->getPhpRequiredVersion(); 394 | 395 | $this->addRecommendation( 396 | $requiredPhpVersion, 397 | 'Vendors should be installed in order to check all requirements.', 398 | 'Run the composer install command.', 399 | 'Run the "composer install" command.' 400 | ); 401 | 402 | if (false !== $requiredPhpVersion) { 403 | $this->addRequirement( 404 | version_compare($installedPhpVersion, $requiredPhpVersion, '>='), 405 | sprintf('PHP version must be at least %s (%s installed)', $requiredPhpVersion, $installedPhpVersion), 406 | sprintf('You are running PHP version "%s", but Symfony needs at least PHP "%s" to run. 407 | Before using Symfony, upgrade your PHP installation, preferably to the latest version.', 408 | $installedPhpVersion, $requiredPhpVersion), 409 | sprintf('Install PHP %s or newer (installed version is %s)', $requiredPhpVersion, $installedPhpVersion) 410 | ); 411 | } 412 | 413 | $this->addRequirement( 414 | version_compare($installedPhpVersion, '5.3.16', '!='), 415 | 'PHP version must not be 5.3.16 as Symfony won\'t work properly with it', 416 | 'Install PHP 5.3.17 or newer (or downgrade to an earlier PHP version)' 417 | ); 418 | 419 | $this->addRequirement( 420 | is_dir(__DIR__.'/../vendor/composer'), 421 | 'Vendor libraries must be installed', 422 | 'Vendor libraries are missing. Install composer following instructions from http://getcomposer.org/. '. 423 | 'Then run "php composer.phar install" to install them.' 424 | ); 425 | 426 | $cacheDir = is_dir(__DIR__.'/../var/cache') ? __DIR__.'/../var/cache' : __DIR__.'/cache'; 427 | 428 | $this->addRequirement( 429 | is_writable($cacheDir), 430 | 'app/cache/ or var/cache/ directory must be writable', 431 | 'Change the permissions of either "app/cache/" or "var/cache/" directory so that the web server can write into it.' 432 | ); 433 | 434 | $logsDir = is_dir(__DIR__.'/../var/logs') ? __DIR__.'/../var/logs' : __DIR__.'/logs'; 435 | 436 | $this->addRequirement( 437 | is_writable($logsDir), 438 | 'app/logs/ or var/logs/ directory must be writable', 439 | 'Change the permissions of either "app/logs/" or "var/logs/" directory so that the web server can write into it.' 440 | ); 441 | 442 | if (version_compare($installedPhpVersion, '7.0.0', '<')) { 443 | $this->addPhpIniRequirement( 444 | 'date.timezone', true, false, 445 | 'date.timezone setting must be set', 446 | 'Set the "date.timezone" setting in php.ini* (like Europe/Paris).' 447 | ); 448 | } 449 | 450 | if (false !== $requiredPhpVersion && version_compare($installedPhpVersion, $requiredPhpVersion, '>=')) { 451 | $timezones = array(); 452 | foreach (DateTimeZone::listAbbreviations() as $abbreviations) { 453 | foreach ($abbreviations as $abbreviation) { 454 | $timezones[$abbreviation['timezone_id']] = true; 455 | } 456 | } 457 | 458 | $this->addRequirement( 459 | isset($timezones[@date_default_timezone_get()]), 460 | sprintf('Configured default timezone "%s" must be supported by your installation of PHP', @date_default_timezone_get()), 461 | 'Your default timezone is not supported by PHP. Check for typos in your php.ini file and have a look at the list of deprecated timezones at http://php.net/manual/en/timezones.others.php.' 462 | ); 463 | } 464 | 465 | $this->addRequirement( 466 | function_exists('iconv'), 467 | 'iconv() must be available', 468 | 'Install and enable the iconv extension.' 469 | ); 470 | 471 | $this->addRequirement( 472 | function_exists('json_encode'), 473 | 'json_encode() must be available', 474 | 'Install and enable the JSON extension.' 475 | ); 476 | 477 | $this->addRequirement( 478 | function_exists('session_start'), 479 | 'session_start() must be available', 480 | 'Install and enable the session extension.' 481 | ); 482 | 483 | $this->addRequirement( 484 | function_exists('ctype_alpha'), 485 | 'ctype_alpha() must be available', 486 | 'Install and enable the ctype extension.' 487 | ); 488 | 489 | $this->addRequirement( 490 | function_exists('token_get_all'), 491 | 'token_get_all() must be available', 492 | 'Install and enable the Tokenizer extension.' 493 | ); 494 | 495 | $this->addRequirement( 496 | function_exists('simplexml_import_dom'), 497 | 'simplexml_import_dom() must be available', 498 | 'Install and enable the SimpleXML extension.' 499 | ); 500 | 501 | if (function_exists('apc_store') && ini_get('apc.enabled')) { 502 | if (version_compare($installedPhpVersion, '5.4.0', '>=')) { 503 | $this->addRequirement( 504 | version_compare(phpversion('apc'), '3.1.13', '>='), 505 | 'APC version must be at least 3.1.13 when using PHP 5.4', 506 | 'Upgrade your APC extension (3.1.13+).' 507 | ); 508 | } else { 509 | $this->addRequirement( 510 | version_compare(phpversion('apc'), '3.0.17', '>='), 511 | 'APC version must be at least 3.0.17', 512 | 'Upgrade your APC extension (3.0.17+).' 513 | ); 514 | } 515 | } 516 | 517 | $this->addPhpIniRequirement('detect_unicode', false); 518 | 519 | if (extension_loaded('suhosin')) { 520 | $this->addPhpIniRequirement( 521 | 'suhosin.executor.include.whitelist', 522 | create_function('$cfgValue', 'return false !== stripos($cfgValue, "phar");'), 523 | false, 524 | 'suhosin.executor.include.whitelist must be configured correctly in php.ini', 525 | 'Add "phar" to suhosin.executor.include.whitelist in php.ini*.' 526 | ); 527 | } 528 | 529 | if (extension_loaded('xdebug')) { 530 | $this->addPhpIniRequirement( 531 | 'xdebug.show_exception_trace', false, true 532 | ); 533 | 534 | $this->addPhpIniRequirement( 535 | 'xdebug.scream', false, true 536 | ); 537 | 538 | $this->addPhpIniRecommendation( 539 | 'xdebug.max_nesting_level', 540 | create_function('$cfgValue', 'return $cfgValue > 100;'), 541 | true, 542 | 'xdebug.max_nesting_level should be above 100 in php.ini', 543 | 'Set "xdebug.max_nesting_level" to e.g. "250" in php.ini* to stop Xdebug\'s infinite recursion protection erroneously throwing a fatal error in your project.' 544 | ); 545 | } 546 | 547 | $pcreVersion = defined('PCRE_VERSION') ? (float) PCRE_VERSION : null; 548 | 549 | $this->addRequirement( 550 | null !== $pcreVersion, 551 | 'PCRE extension must be available', 552 | 'Install the PCRE extension (version 8.0+).' 553 | ); 554 | 555 | if (extension_loaded('mbstring')) { 556 | $this->addPhpIniRequirement( 557 | 'mbstring.func_overload', 558 | create_function('$cfgValue', 'return (int) $cfgValue === 0;'), 559 | true, 560 | 'string functions should not be overloaded', 561 | 'Set "mbstring.func_overload" to 0 in php.ini* to disable function overloading by the mbstring extension.' 562 | ); 563 | } 564 | 565 | /* optional recommendations follow */ 566 | 567 | if (file_exists(__DIR__.'/../vendor/composer')) { 568 | require_once __DIR__.'/../vendor/autoload.php'; 569 | 570 | try { 571 | $r = new ReflectionClass('Sensio\Bundle\DistributionBundle\SensioDistributionBundle'); 572 | 573 | $contents = file_get_contents(dirname($r->getFileName()).'/Resources/skeleton/app/SymfonyRequirements.php'); 574 | } catch (ReflectionException $e) { 575 | $contents = ''; 576 | } 577 | $this->addRecommendation( 578 | file_get_contents(__FILE__) === $contents, 579 | 'Requirements file should be up-to-date', 580 | 'Your requirements file is outdated. Run composer install and re-check your configuration.' 581 | ); 582 | } 583 | 584 | $this->addRecommendation( 585 | version_compare($installedPhpVersion, '5.3.4', '>='), 586 | 'You should use at least PHP 5.3.4 due to PHP bug #52083 in earlier versions', 587 | 'Your project might malfunction randomly due to PHP bug #52083 ("Notice: Trying to get property of non-object"). Install PHP 5.3.4 or newer.' 588 | ); 589 | 590 | $this->addRecommendation( 591 | version_compare($installedPhpVersion, '5.3.8', '>='), 592 | 'When using annotations you should have at least PHP 5.3.8 due to PHP bug #55156', 593 | 'Install PHP 5.3.8 or newer if your project uses annotations.' 594 | ); 595 | 596 | $this->addRecommendation( 597 | version_compare($installedPhpVersion, '5.4.0', '!='), 598 | 'You should not use PHP 5.4.0 due to the PHP bug #61453', 599 | 'Your project might not work properly due to the PHP bug #61453 ("Cannot dump definitions which have method calls"). Install PHP 5.4.1 or newer.' 600 | ); 601 | 602 | $this->addRecommendation( 603 | version_compare($installedPhpVersion, '5.4.11', '>='), 604 | 'When using the logout handler from the Symfony Security Component, you should have at least PHP 5.4.11 due to PHP bug #63379 (as a workaround, you can also set invalidate_session to false in the security logout handler configuration)', 605 | 'Install PHP 5.4.11 or newer if your project uses the logout handler from the Symfony Security Component.' 606 | ); 607 | 608 | $this->addRecommendation( 609 | (version_compare($installedPhpVersion, '5.3.18', '>=') && version_compare($installedPhpVersion, '5.4.0', '<')) 610 | || 611 | version_compare($installedPhpVersion, '5.4.8', '>='), 612 | 'You should use PHP 5.3.18+ or PHP 5.4.8+ to always get nice error messages for fatal errors in the development environment due to PHP bug #61767/#60909', 613 | 'Install PHP 5.3.18+ or PHP 5.4.8+ if you want nice error messages for all fatal errors in the development environment.' 614 | ); 615 | 616 | if (null !== $pcreVersion) { 617 | $this->addRecommendation( 618 | $pcreVersion >= 8.0, 619 | sprintf('PCRE extension should be at least version 8.0 (%s installed)', $pcreVersion), 620 | 'PCRE 8.0+ is preconfigured in PHP since 5.3.2 but you are using an outdated version of it. Symfony probably works anyway but it is recommended to upgrade your PCRE extension.' 621 | ); 622 | } 623 | 624 | $this->addRecommendation( 625 | class_exists('DomDocument'), 626 | 'PHP-DOM and PHP-XML modules should be installed', 627 | 'Install and enable the PHP-DOM and the PHP-XML modules.' 628 | ); 629 | 630 | $this->addRecommendation( 631 | function_exists('mb_strlen'), 632 | 'mb_strlen() should be available', 633 | 'Install and enable the mbstring extension.' 634 | ); 635 | 636 | $this->addRecommendation( 637 | function_exists('utf8_decode'), 638 | 'utf8_decode() should be available', 639 | 'Install and enable the XML extension.' 640 | ); 641 | 642 | $this->addRecommendation( 643 | function_exists('filter_var'), 644 | 'filter_var() should be available', 645 | 'Install and enable the filter extension.' 646 | ); 647 | 648 | if (!defined('PHP_WINDOWS_VERSION_BUILD')) { 649 | $this->addRecommendation( 650 | function_exists('posix_isatty'), 651 | 'posix_isatty() should be available', 652 | 'Install and enable the php_posix extension (used to colorize the CLI output).' 653 | ); 654 | } 655 | 656 | $this->addRecommendation( 657 | extension_loaded('intl'), 658 | 'intl extension should be available', 659 | 'Install and enable the intl extension (used for validators).' 660 | ); 661 | 662 | if (extension_loaded('intl')) { 663 | // in some WAMP server installations, new Collator() returns null 664 | $this->addRecommendation( 665 | null !== new Collator('fr_FR'), 666 | 'intl extension should be correctly configured', 667 | 'The intl extension does not behave properly. This problem is typical on PHP 5.3.X x64 WIN builds.' 668 | ); 669 | 670 | // check for compatible ICU versions (only done when you have the intl extension) 671 | if (defined('INTL_ICU_VERSION')) { 672 | $version = INTL_ICU_VERSION; 673 | } else { 674 | $reflector = new ReflectionExtension('intl'); 675 | 676 | ob_start(); 677 | $reflector->info(); 678 | $output = strip_tags(ob_get_clean()); 679 | 680 | preg_match('/^ICU version +(?:=> )?(.*)$/m', $output, $matches); 681 | $version = $matches[1]; 682 | } 683 | 684 | $this->addRecommendation( 685 | version_compare($version, '4.0', '>='), 686 | 'intl ICU version should be at least 4+', 687 | 'Upgrade your intl extension with a newer ICU version (4+).' 688 | ); 689 | 690 | if (class_exists('Symfony\Component\Intl\Intl')) { 691 | $this->addRecommendation( 692 | \Symfony\Component\Intl\Intl::getIcuDataVersion() <= \Symfony\Component\Intl\Intl::getIcuVersion(), 693 | sprintf('intl ICU version installed on your system is outdated (%s) and does not match the ICU data bundled with Symfony (%s)', \Symfony\Component\Intl\Intl::getIcuVersion(), \Symfony\Component\Intl\Intl::getIcuDataVersion()), 694 | 'To get the latest internationalization data upgrade the ICU system package and the intl PHP extension.' 695 | ); 696 | if (\Symfony\Component\Intl\Intl::getIcuDataVersion() <= \Symfony\Component\Intl\Intl::getIcuVersion()) { 697 | $this->addRecommendation( 698 | \Symfony\Component\Intl\Intl::getIcuDataVersion() === \Symfony\Component\Intl\Intl::getIcuVersion(), 699 | sprintf('intl ICU version installed on your system (%s) does not match the ICU data bundled with Symfony (%s)', \Symfony\Component\Intl\Intl::getIcuVersion(), \Symfony\Component\Intl\Intl::getIcuDataVersion()), 700 | 'To avoid internationalization data inconsistencies upgrade the symfony/intl component.' 701 | ); 702 | } 703 | } 704 | 705 | $this->addPhpIniRecommendation( 706 | 'intl.error_level', 707 | create_function('$cfgValue', 'return (int) $cfgValue === 0;'), 708 | true, 709 | 'intl.error_level should be 0 in php.ini', 710 | 'Set "intl.error_level" to "0" in php.ini* to inhibit the messages when an error occurs in ICU functions.' 711 | ); 712 | } 713 | 714 | $accelerator = 715 | (extension_loaded('eaccelerator') && ini_get('eaccelerator.enable')) 716 | || 717 | (extension_loaded('apc') && ini_get('apc.enabled')) 718 | || 719 | (extension_loaded('Zend Optimizer+') && ini_get('zend_optimizerplus.enable')) 720 | || 721 | (extension_loaded('Zend OPcache') && ini_get('opcache.enable')) 722 | || 723 | (extension_loaded('xcache') && ini_get('xcache.cacher')) 724 | || 725 | (extension_loaded('wincache') && ini_get('wincache.ocenabled')) 726 | ; 727 | 728 | $this->addRecommendation( 729 | $accelerator, 730 | 'a PHP accelerator should be installed', 731 | 'Install and/or enable a PHP accelerator (highly recommended).' 732 | ); 733 | 734 | if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { 735 | $this->addRecommendation( 736 | $this->getRealpathCacheSize() >= 5 * 1024 * 1024, 737 | 'realpath_cache_size should be at least 5M in php.ini', 738 | 'Setting "realpath_cache_size" to e.g. "5242880" or "5M" in php.ini* may improve performance on Windows significantly in some cases.' 739 | ); 740 | } 741 | 742 | $this->addPhpIniRecommendation('short_open_tag', false); 743 | 744 | $this->addPhpIniRecommendation('magic_quotes_gpc', false, true); 745 | 746 | $this->addPhpIniRecommendation('register_globals', false, true); 747 | 748 | $this->addPhpIniRecommendation('session.auto_start', false); 749 | 750 | $this->addRecommendation( 751 | class_exists('PDO'), 752 | 'PDO should be installed', 753 | 'Install PDO (mandatory for Doctrine).' 754 | ); 755 | 756 | if (class_exists('PDO')) { 757 | $drivers = PDO::getAvailableDrivers(); 758 | $this->addRecommendation( 759 | count($drivers) > 0, 760 | sprintf('PDO should have some drivers installed (currently available: %s)', count($drivers) ? implode(', ', $drivers) : 'none'), 761 | 'Install PDO drivers (mandatory for Doctrine).' 762 | ); 763 | } 764 | } 765 | 766 | /** 767 | * Loads realpath_cache_size from php.ini and converts it to int. 768 | * 769 | * (e.g. 16k is converted to 16384 int) 770 | * 771 | * @return int 772 | */ 773 | protected function getRealpathCacheSize() 774 | { 775 | $size = ini_get('realpath_cache_size'); 776 | $size = trim($size); 777 | $unit = ''; 778 | if (!ctype_digit($size)) { 779 | $unit = strtolower(substr($size, -1, 1)); 780 | $size = (int) substr($size, 0, -1); 781 | } 782 | switch ($unit) { 783 | case 'g': 784 | return $size * 1024 * 1024 * 1024; 785 | case 'm': 786 | return $size * 1024 * 1024; 787 | case 'k': 788 | return $size * 1024; 789 | default: 790 | return (int) $size; 791 | } 792 | } 793 | 794 | /** 795 | * Defines PHP required version from Symfony version. 796 | * 797 | * @return string|false The PHP required version or false if it could not be guessed 798 | */ 799 | protected function getPhpRequiredVersion() 800 | { 801 | if (!file_exists($path = __DIR__.'/../composer.lock')) { 802 | return false; 803 | } 804 | 805 | $composerLock = json_decode(file_get_contents($path), true); 806 | foreach ($composerLock['packages'] as $package) { 807 | $name = $package['name']; 808 | if ('symfony/symfony' !== $name && 'symfony/http-kernel' !== $name) { 809 | continue; 810 | } 811 | 812 | return (int) $package['version'][1] > 2 ? self::REQUIRED_PHP_VERSION : self::LEGACY_REQUIRED_PHP_VERSION; 813 | } 814 | 815 | return false; 816 | } 817 | } 818 | -------------------------------------------------------------------------------- /app/var/cache/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codereviewvideos/docker-symfony-mysql-nginx-example/1b769477b85e3924009b1b6080ef3bc5e031be72/app/var/cache/.gitkeep -------------------------------------------------------------------------------- /app/var/logs/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codereviewvideos/docker-symfony-mysql-nginx-example/1b769477b85e3924009b1b6080ef3bc5e031be72/app/var/logs/.gitkeep -------------------------------------------------------------------------------- /app/var/sessions/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codereviewvideos/docker-symfony-mysql-nginx-example/1b769477b85e3924009b1b6080ef3bc5e031be72/app/var/sessions/.gitkeep -------------------------------------------------------------------------------- /app/web/.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 app.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. "/app" should not resolve 15 | # to the front controller "/app.php" but be rewritten to "/app.php/app". 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 app.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 `/app.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 ^app\.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}/app.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 302 ^/$ /app.php/ 66 | # RedirectTemp cannot be used instead 67 | 68 | 69 | -------------------------------------------------------------------------------- /app/web/app.php: -------------------------------------------------------------------------------- 1 | loadClassCache(); 13 | } 14 | //$kernel = new AppCache($kernel); 15 | 16 | // When using the HttpCache, you need to call the method in your front controller instead of relying on the configuration parameter 17 | //Request::enableHttpMethodParameterOverride(); 18 | $request = Request::createFromGlobals(); 19 | $response = $kernel->handle($request); 20 | $response->send(); 21 | $kernel->terminate($request, $response); 22 | -------------------------------------------------------------------------------- /app/web/app_dev.php: -------------------------------------------------------------------------------- 1 | loadClassCache(); 27 | } 28 | $request = Request::createFromGlobals(); 29 | $response = $kernel->handle($request); 30 | $response->send(); 31 | $kernel->terminate($request, $response); 32 | -------------------------------------------------------------------------------- /app/web/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codereviewvideos/docker-symfony-mysql-nginx-example/1b769477b85e3924009b1b6080ef3bc5e031be72/app/web/apple-touch-icon.png -------------------------------------------------------------------------------- /app/web/config.php: -------------------------------------------------------------------------------- 1 | getFailedRequirements(); 30 | $minorProblems = $symfonyRequirements->getFailedRecommendations(); 31 | $hasMajorProblems = (bool) count($majorProblems); 32 | $hasMinorProblems = (bool) count($minorProblems); 33 | 34 | ?> 35 | 36 | 37 | 38 | 39 | 40 | Symfony Configuration Checker 41 | 331 | 332 | 333 |
334 |
335 | 338 | 339 | 359 |
360 | 361 |
362 |
363 |
364 |

Configuration Checker

365 |

366 | This script analyzes your system to check whether is 367 | ready to run Symfony applications. 368 |

369 | 370 | 371 |

Major problems

372 |

Major problems have been detected and must be fixed before continuing:

373 |
    374 | 375 |
  1. getTestMessage() ?> 376 |

    getHelpHtml() ?>

    377 |
  2. 378 | 379 |
380 | 381 | 382 | 383 |

Recommendations

384 |

385 | Additionally, toTo enhance your Symfony experience, 386 | it’s recommended that you fix the following: 387 |

388 |
    389 | 390 |
  1. getTestMessage() ?> 391 |

    getHelpHtml() ?>

    392 |
  2. 393 | 394 |
395 | 396 | 397 | hasPhpIniConfigIssue()): ?> 398 |

* 399 | getPhpIniConfigPath()): ?> 400 | Changes to the php.ini file must be done in "getPhpIniConfigPath() ?>". 401 | 402 | To change settings, create a "php.ini". 403 | 404 |

405 | 406 | 407 | 408 |

All checks passed successfully. Your system is ready to run Symfony applications.

409 | 410 | 411 | 416 |
417 |
418 |
419 |
Symfony Standard Edition
420 |
421 | 422 | 423 | -------------------------------------------------------------------------------- /app/web/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/codereviewvideos/docker-symfony-mysql-nginx-example/1b769477b85e3924009b1b6080ef3bc5e031be72/app/web/favicon.ico -------------------------------------------------------------------------------- /app/web/robots.txt: -------------------------------------------------------------------------------- 1 | # www.robotstxt.org/ 2 | # www.google.com/support/webmasters/bin/answer.py?hl=en&answer=156449 3 | 4 | User-agent: * 5 | Disallow: 6 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | 3 | services: 4 | 5 | db: 6 | image: mysql:5.7.17 7 | env_file: 8 | - ./.env 9 | volumes: 10 | - "./volumes/mysql/dev:/var/lib/mysql" 11 | networks: 12 | crv_dev_network: 13 | aliases: 14 | - mysql 15 | 16 | nginx: 17 | image: codereviewvideos/nginx.dev 18 | ports: 19 | - "81:80" 20 | restart: always 21 | volumes: 22 | - "./volumes/nginx/logs:/var/log/nginx/" 23 | volumes_from: 24 | - php 25 | networks: 26 | crv_dev_network: 27 | aliases: 28 | - nginx 29 | 30 | php: 31 | image: codereviewvideos/www.dev 32 | restart: always 33 | env_file: 34 | - ./.env 35 | volumes: 36 | - "./volumes/php/app/cache:/var/www/dev/app/cache/:rw" 37 | - "./volumes/php/app/logs:/var/www/dev/app/logs/:rw" 38 | - "./volumes/.composer:/var/www/.composer" 39 | - "./app:/var/www/dev" 40 | networks: 41 | crv_dev_network: 42 | aliases: 43 | - php 44 | 45 | 46 | 47 | networks: 48 | crv_dev_network: 49 | driver: bridge 50 | --------------------------------------------------------------------------------