├── app ├── cache │ └── .gitkeep ├── logs │ └── .gitkeep ├── Resources │ └── views │ │ ├── default │ │ └── index.html.twig │ │ ├── base.html.twig │ │ └── easy_admin │ │ └── layout.html.twig ├── .htaccess ├── AppCache.php ├── config │ ├── routing.yml │ ├── config_test.yml │ ├── services.yml │ ├── routing_dev.yml │ ├── config_prod.yml │ ├── parameters.yml.dist │ ├── security.yml │ ├── config_dev.yml │ ├── admin.yml │ └── config.yml ├── autoload.php ├── console ├── phpunit.xml.dist ├── AppKernel.php ├── check.php └── SymfonyRequirements.php ├── web ├── favicon.ico ├── apple-touch-icon.png ├── robots.txt ├── app.php ├── app_dev.php ├── .htaccess └── config.php ├── .settings ├── org.eclipse.php.core.prefs └── org.eclipse.wst.common.project.facet.core.xml ├── src ├── .htaccess └── AppBundle │ ├── AppBundle.php │ ├── Controller │ └── AdminController.php │ ├── Tests │ └── Controller │ │ └── DefaultControllerTest.php │ └── Entity │ ├── User.php~ │ ├── User.php │ ├── Customer.php~ │ └── Customer.php ├── .gitignore ├── .buildpath ├── UPGRADE-2.4.md ├── README.md ├── .project ├── LICENSE ├── UPGRADE-2.2.md ├── UPGRADE-2.3.md ├── composer.json ├── UPGRADE.md └── composer.lock /app/cache/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/logs/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/level7systems/sf2-easyadmin/HEAD/web/favicon.ico -------------------------------------------------------------------------------- /.settings/org.eclipse.php.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | include_path=0;/sfEasyAdmin 3 | -------------------------------------------------------------------------------- /web/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/level7systems/sf2-easyadmin/HEAD/web/apple-touch-icon.png -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /app/Resources/views/default/index.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'base.html.twig' %} 2 | 3 | {% block body %} 4 | Homepage. 5 | {% endblock %} 6 | -------------------------------------------------------------------------------- /app/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | Require all denied 3 | 4 | 5 | Order deny,allow 6 | Deny from all 7 | 8 | -------------------------------------------------------------------------------- /src/.htaccess: -------------------------------------------------------------------------------- 1 | 2 | Require all denied 3 | 4 | 5 | Order deny,allow 6 | Deny from all 7 | 8 | -------------------------------------------------------------------------------- /app/AppCache.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/config/routing.yml: -------------------------------------------------------------------------------- 1 | app: 2 | resource: @AppBundle/Controller/ 3 | type: annotation 4 | 5 | fos_user: 6 | resource: "@FOSUserBundle/Resources/config/routing/all.xml" 7 | 8 | easy_admin_bundle: 9 | resource: "@EasyAdminBundle/Controller/" 10 | type: annotation 11 | prefix: /admin 12 | -------------------------------------------------------------------------------- /src/AppBundle/Controller/AdminController.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /UPGRADE-2.4.md: -------------------------------------------------------------------------------- 1 | UPGRADE FROM 2.3 to 2.4 2 | ======================= 3 | 4 | When upgrading Symfony from 2.3 to 2.4, you need to do the following changes 5 | to the code that came from the Standard Edition: 6 | 7 | * We recommend to comment or remove the `firephp` and `chromephp` Monolog 8 | handlers as they might cause issues with some configuration (`chromephp` 9 | with Nginx for instance). 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Symfony2 Admin panel in 30 seconds? 2 | 3 | Source code for the tutorial [Symfony2 Admin panel in 30 seconds?](http://level7systems.co.uk/en/symfony2-admin-panel-in-30-seconds/) and [More with EasyAdminBundle](http://level7systems.co.uk/en/more-with-easyadminbundle/). 4 | 5 | Note: to run this app you need MySQL server at 127.0.0.1 with database named `sf2_easyadmin` accessible by mysql user `sf2_easyadmin` with password `sf2_easyadmin`. 6 | -------------------------------------------------------------------------------- /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/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 | _configurator: 10 | resource: "@SensioDistributionBundle/Resources/config/routing/webconfigurator.xml" 11 | prefix: /_configurator 12 | 13 | _errors: 14 | resource: "@TwigBundle/Resources/config/routing/errors.xml" 15 | prefix: /_error 16 | 17 | _main: 18 | resource: routing.yml 19 | -------------------------------------------------------------------------------- /src/AppBundle/Tests/Controller/DefaultControllerTest.php: -------------------------------------------------------------------------------- 1 | request('GET', '/app/example'); 14 | 15 | $this->assertEquals(200, $client->getResponse()->getStatusCode()); 16 | $this->assertTrue($crawler->filter('html:contains("Homepage")')->count() > 0); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /app/config/config_prod.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: config.yml } 3 | 4 | #framework: 5 | # validation: 6 | # cache: apc 7 | 8 | #doctrine: 9 | # orm: 10 | # metadata_cache_driver: apc 11 | # result_cache_driver: apc 12 | # query_cache_driver: apc 13 | 14 | monolog: 15 | handlers: 16 | main: 17 | type: fingers_crossed 18 | action_level: error 19 | handler: nested 20 | nested: 21 | type: stream 22 | path: "%kernel.logs_dir%/%kernel.environment%.log" 23 | level: debug 24 | console: 25 | type: console 26 | -------------------------------------------------------------------------------- /app/config/parameters.yml.dist: -------------------------------------------------------------------------------- 1 | # This file is a "template" of what your parameters.yml file should look like 2 | parameters: 3 | database_driver: pdo_mysql 4 | database_host: 127.0.0.1 5 | database_port: ~ 6 | database_name: symfony 7 | database_user: root 8 | database_password: ~ 9 | # You should uncomment this if you want use pdo_sqlite 10 | # database_path: "%kernel.root_dir%/data.db3" 11 | 12 | mailer_transport: smtp 13 | mailer_host: 127.0.0.1 14 | mailer_user: ~ 15 | mailer_password: ~ 16 | 17 | locale: en 18 | 19 | # A secret key that's used to generate certain security-related tokens 20 | secret: ThisTokenIsNotSoSecretChangeIt 21 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | sfEasyAdmin 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.wst.common.project.facet.core.builder 10 | 11 | 12 | 13 | 14 | org.eclipse.wst.validation.validationbuilder 15 | 16 | 17 | 18 | 19 | org.eclipse.dltk.core.scriptbuilder 20 | 21 | 22 | 23 | 24 | 25 | org.eclipse.php.core.PHPNature 26 | org.eclipse.wst.common.project.facet.core.nature 27 | 28 | 29 | -------------------------------------------------------------------------------- /app/config/security.yml: -------------------------------------------------------------------------------- 1 | # app/config/security.yml 2 | security: 3 | encoders: 4 | FOS\UserBundle\Model\UserInterface: sha512 5 | 6 | role_hierarchy: 7 | ROLE_ADMIN: ROLE_USER 8 | ROLE_SUPER_ADMIN: ROLE_ADMIN 9 | 10 | providers: 11 | fos_userbundle: 12 | id: fos_user.user_provider.username 13 | 14 | firewalls: 15 | main: 16 | pattern: ^/ 17 | form_login: 18 | provider: fos_userbundle 19 | csrf_provider: form.csrf_provider 20 | logout: true 21 | anonymous: true 22 | 23 | access_control: 24 | - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 25 | - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } 26 | - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } 27 | - { path: ^/admin/, role: ROLE_ADMIN } -------------------------------------------------------------------------------- /app/console: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | getParameterOption(array('--env', '-e'), getenv('SYMFONY_ENV') ?: 'dev'); 19 | $debug = getenv('SYMFONY_DEBUG') !== '0' && !$input->hasParameterOption(array('--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 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2004-2014 Fabien Potencier 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is furnished 8 | to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /web/app.php: -------------------------------------------------------------------------------- 1 | unregister(); 15 | $apcLoader->register(true); 16 | */ 17 | 18 | require_once __DIR__.'/../app/AppKernel.php'; 19 | //require_once __DIR__.'/../app/AppCache.php'; 20 | 21 | $kernel = new AppKernel('prod', false); 22 | $kernel->loadClassCache(); 23 | //$kernel = new AppCache($kernel); 24 | 25 | // When using the HttpCache, you need to call the method in your front controller instead of relying on the configuration parameter 26 | //Request::enableHttpMethodParameterOverride(); 27 | $request = Request::createFromGlobals(); 28 | $response = $kernel->handle($request); 29 | $response->send(); 30 | $kernel->terminate($request, $response); 31 | -------------------------------------------------------------------------------- /web/app_dev.php: -------------------------------------------------------------------------------- 1 | loadClassCache(); 27 | $request = Request::createFromGlobals(); 28 | $response = $kernel->handle($request); 29 | $response->send(); 30 | $kernel->terminate($request, $response); 31 | -------------------------------------------------------------------------------- /UPGRADE-2.2.md: -------------------------------------------------------------------------------- 1 | UPGRADE FROM 2.1 to 2.2 2 | ======================= 3 | 4 | * The [`web/.htaccess`](https://github.com/symfony/symfony-standard/blob/2.2/web/.htaccess) 5 | file has been enhanced substantially to prevent duplicate content with and 6 | without `/app.php` in the URI. It also improves functionality when using 7 | Apache aliases or when mod_rewrite is not available. So you might want to 8 | update your `.htaccess` file as well. 9 | 10 | * The ``_internal`` route is not used any more. It should then be removed 11 | from both your routing and security configurations. A ``fragments`` key has 12 | been added to the framework configuration and must be specified when ESI or 13 | Hinclude are in use. No security configuration is required for this path as 14 | by default ESI access is only permitted for trusted hosts and Hinclude 15 | access uses an URL signing mechanism. 16 | 17 | ``` 18 | framework: 19 | # ... 20 | fragments: { path: /_proxy } 21 | ``` 22 | 23 | Functional Tests 24 | ---------------- 25 | 26 | * The profiler has been disabled by default in the test environment. You can 27 | enable it again by modifying the ``config_test.yml`` configuration file or 28 | even better, you can just enable it for the very next request by calling 29 | ``$client->enableProfiler()`` when you need the profiler in a test (that 30 | speeds up functional tests quite a bit). 31 | -------------------------------------------------------------------------------- /app/phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 10 | 11 | 12 | ../src/*/*Bundle/Tests 13 | ../src/*/Bundle/*Bundle/Tests 14 | ../src/*Bundle/Tests 15 | 16 | 17 | 18 | 23 | 24 | 25 | 26 | ../src 27 | 28 | ../src/*Bundle/Resources 29 | ../src/*Bundle/Tests 30 | ../src/*/*Bundle/Resources 31 | ../src/*/*Bundle/Tests 32 | ../src/*/Bundle/*Bundle/Resources 33 | ../src/*/Bundle/*Bundle/Tests 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /app/config/config_dev.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: config.yml } 3 | 4 | framework: 5 | router: 6 | resource: "%kernel.root_dir%/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 | console: 21 | type: console 22 | bubble: false 23 | verbosity_levels: 24 | VERBOSITY_VERBOSE: INFO 25 | VERBOSITY_VERY_VERBOSE: DEBUG 26 | channels: ["!doctrine"] 27 | console_very_verbose: 28 | type: console 29 | bubble: false 30 | verbosity_levels: 31 | VERBOSITY_VERBOSE: NOTICE 32 | VERBOSITY_VERY_VERBOSE: NOTICE 33 | VERBOSITY_DEBUG: DEBUG 34 | channels: ["doctrine"] 35 | # uncomment to get logging in your browser 36 | # you may have to allow bigger header sizes in your Web server configuration 37 | #firephp: 38 | # type: firephp 39 | # level: info 40 | #chromephp: 41 | # type: chromephp 42 | # level: info 43 | 44 | assetic: 45 | use_controller: true 46 | 47 | #swiftmailer: 48 | # delivery_address: me@example.com 49 | -------------------------------------------------------------------------------- /app/AppKernel.php: -------------------------------------------------------------------------------- 1 | getEnvironment(), array('dev', 'test'))) { 27 | $bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle(); 28 | $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle(); 29 | $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle(); 30 | $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle(); 31 | } 32 | 33 | return $bundles; 34 | } 35 | 36 | public function registerContainerConfiguration(LoaderInterface $loader) 37 | { 38 | $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml'); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /app/config/admin.yml: -------------------------------------------------------------------------------- 1 | easy_admin: 2 | entities: 3 | User: 4 | label: 'Users' 5 | class: AppBundle\Entity\User 6 | list: 7 | title: "User list" 8 | fields: ['id', 'username', 'email', 'lastLogin', 'enabled', 'locked'] 9 | actions: ['-show'] 10 | form: 11 | fields: 12 | - { property: 'username' } 13 | - { property: 'email', type: 'email' } 14 | - { property: 'plainPassword', type: 'password', label: 'Password', help: 'Passwords must have at least 8 characters' } 15 | - { property: 'enabled', type: 'checkbox' } 16 | - { property: 'locked', type: 'checkbox' } 17 | Customer: 18 | class: AppBundle\Entity\Customer 19 | list: 20 | fields: 21 | - user 22 | - name 23 | - { property: 'logo', type: 'image', base_path: 'http://localhost/sfEasyAdmin/web/images/customers/' } 24 | - email 25 | - createdAt 26 | show: 27 | fields: 28 | - user 29 | - name 30 | - { property: 'logo', type: 'image', base_path: 'http://localhost/sfEasyAdmin/web/images/customers/' } 31 | - firstName 32 | - lastName 33 | - email 34 | - phone 35 | - companyName 36 | - website 37 | form: 38 | fields: 39 | - user 40 | - name 41 | - { property: 'logoFile', type: 'file', label: 'Upload logo', help: 'Select file to upload / change logo' } 42 | - firstName 43 | - lastname 44 | - { property: 'email', type: 'email' } 45 | - phone 46 | - companyName 47 | - website -------------------------------------------------------------------------------- /UPGRADE-2.3.md: -------------------------------------------------------------------------------- 1 | UPGRADE FROM 2.2 to 2.3 2 | ======================= 3 | 4 | When upgrading Symfony from 2.2 to 2.3, you need to do the following changes 5 | to the code that came from the Standard Edition: 6 | 7 | * The debugging tools are not enabled by default anymore and should be added 8 | to the 9 | [`web/app_dev.php`](https://github.com/symfony/symfony-standard/blob/2.3/web/app_dev.php) 10 | front controller manually, just after including the bootstrap cache: 11 | 12 | use Symfony\Component\Debug\Debug; 13 | 14 | Debug::enable(); 15 | 16 | You also need to enable debugging in the 17 | [`app/console`](https://github.com/symfony/symfony-standard/blob/2.3/app/console) 18 | script, after the `$debug` variable is defined: 19 | 20 | use Symfony\Component\Debug\Debug; 21 | 22 | if ($debug) { 23 | Debug::enable(); 24 | } 25 | 26 | * The `parameters.yml` file can now be managed by the 27 | `incenteev/composer-parameter-handler` bundle that comes with the 2.3 28 | Standard Edition: 29 | 30 | * add `"incenteev/composer-parameter-handler": "~2.0"` to your 31 | `composer.json` file; 32 | 33 | * add `/app/config/parameters.yml` to your `.gitignore` file; 34 | 35 | * create a 36 | [`app/config/parameters.yml.dist`](https://github.com/symfony/symfony-standard/blob/2.3/app/config/parameters.yml.dist) 37 | file with sensible values for all your parameters. 38 | 39 | * It is highly recommended that you switch the minimum stability to `stable` 40 | in your `composer.json` file. 41 | 42 | * If you are using Apache, have a look at the new 43 | [`.htaccess`](https://github.com/symfony/symfony-standard/blob/2.3/web/.htaccess) 44 | configuration and change yours accordingly. 45 | 46 | * In the 47 | [`app/autoload.php`](https://github.com/symfony/symfony-standard/blob/2.3/app/autoload.php) 48 | file, the section about `intl` should be removed as it is not needed anymore. 49 | 50 | You can also have a look at the 51 | [diff](https://github.com/symfony/symfony-standard/compare/v2.2.0%E2%80%A62.3) 52 | between the 2.2 version of the Standard Edition and the 2.3 version. 53 | -------------------------------------------------------------------------------- /src/AppBundle/Entity/User.php~: -------------------------------------------------------------------------------- 1 | id; 60 | } 61 | /** 62 | * Constructor 63 | */ 64 | public function __construct() 65 | { 66 | parent::__construct(); 67 | 68 | $this->customers = new \Doctrine\Common\Collections\ArrayCollection(); 69 | } 70 | 71 | /** 72 | * Add customers 73 | * 74 | * @param \AppBundle\Entity\Customer $customers 75 | * @return User 76 | */ 77 | public function addCustomer(\AppBundle\Entity\Customer $customers) 78 | { 79 | $this->customers[] = $customers; 80 | 81 | return $this; 82 | } 83 | 84 | /** 85 | * Remove customers 86 | * 87 | * @param \AppBundle\Entity\Customer $customers 88 | */ 89 | public function removeCustomer(\AppBundle\Entity\Customer $customers) 90 | { 91 | $this->customers->removeElement($customers); 92 | } 93 | 94 | /** 95 | * Get customers 96 | * 97 | * @return \Doctrine\Common\Collections\Collection 98 | */ 99 | public function getCustomers() 100 | { 101 | return $this->customers; 102 | } 103 | 104 | public function setPlainPassword($password) 105 | { 106 | $this->plainPassword = $password; 107 | $this->updatedAt = new \DateTime(); 108 | 109 | return $this; 110 | } 111 | } 112 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "symfony/framework-standard-edition", 3 | "license": "MIT", 4 | "type": "project", 5 | "description": "The \"Symfony Standard Edition\" distribution", 6 | "autoload": { 7 | "psr-0": { "": "src/", "SymfonyStandard": "app/" } 8 | }, 9 | "require": { 10 | "php": ">=5.3.3", 11 | "symfony/symfony": "2.6.*", 12 | "doctrine/orm": "~2.2,>=2.2.3", 13 | "doctrine/doctrine-bundle": "~1.2", 14 | "twig/extensions": "~1.0", 15 | "symfony/assetic-bundle": "~2.3", 16 | "symfony/swiftmailer-bundle": "~2.3", 17 | "symfony/monolog-bundle": "~2.4", 18 | "sensio/distribution-bundle": "~3.0.12", 19 | "sensio/framework-extra-bundle": "~3.0", 20 | "incenteev/composer-parameter-handler": "~2.0", 21 | "javiereguiluz/easyadmin-bundle": "~1.0", 22 | "friendsofsymfony/user-bundle": "~2.0@dev", 23 | "stof/doctrine-extensions-bundle": "~1.1@dev", 24 | "vich/uploader-bundle": "^0.14.0" 25 | }, 26 | "require-dev": { 27 | "sensio/generator-bundle": "~2.3" 28 | }, 29 | "scripts": { 30 | "post-root-package-install": [ 31 | "SymfonyStandard\\Composer::hookRootPackageInstall" 32 | ], 33 | "post-install-cmd": [ 34 | "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters", 35 | "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap", 36 | "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache", 37 | "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets", 38 | "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile", 39 | "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::removeSymfonyStandardFiles" 40 | ], 41 | "post-update-cmd": [ 42 | "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters", 43 | "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap", 44 | "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache", 45 | "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets", 46 | "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile", 47 | "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::removeSymfonyStandardFiles" 48 | ] 49 | }, 50 | "config": { 51 | "bin-dir": "bin" 52 | }, 53 | "extra": { 54 | "symfony-app-dir": "app", 55 | "symfony-web-dir": "web", 56 | "symfony-assets-install": "relative", 57 | "incenteev-parameters": { 58 | "file": "app/config/parameters.yml" 59 | }, 60 | "branch-alias": { 61 | "dev-master": "2.6-dev" 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /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 | 9 | RewriteEngine On 10 | 11 | # Determine the RewriteBase automatically and set it as environment variable. 12 | # If you are using Apache aliases to do mass virtual hosting or installed the 13 | # project in a subdirectory, the base path will be prepended to allow proper 14 | # resolution of the app.php file and to redirect to the correct URI. It will 15 | # work in environments without path prefix as well, providing a safe, one-size 16 | # fits all solution. But as you do not need it in this case, you can comment 17 | # the following 2 lines to eliminate the overhead. 18 | RewriteCond %{REQUEST_URI}::$1 ^(/.+)/(.*)::\2$ 19 | RewriteRule ^(.*) - [E=BASE:%1] 20 | 21 | # Sets the HTTP_AUTHORIZATION header removed by apache 22 | RewriteCond %{HTTP:Authorization} . 23 | RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] 24 | 25 | # Redirect to URI without front controller to prevent duplicate content 26 | # (with and without `/app.php`). Only do this redirect on the initial 27 | # rewrite by Apache and not on subsequent cycles. Otherwise we would get an 28 | # endless redirect loop (request -> rewrite to front controller -> 29 | # redirect -> request -> ...). 30 | # So in case you get a "too many redirects" error or you always get redirected 31 | # to the start page because your Apache does not expose the REDIRECT_STATUS 32 | # environment variable, you have 2 choices: 33 | # - disable this feature by commenting the following 2 lines or 34 | # - use Apache >= 2.3.9 and replace all L flags by END flags and remove the 35 | # following RewriteCond (best solution) 36 | RewriteCond %{ENV:REDIRECT_STATUS} ^$ 37 | RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L] 38 | 39 | # If the requested filename exists, simply serve it. 40 | # We only want to let Apache serve files and not directories. 41 | RewriteCond %{REQUEST_FILENAME} -f 42 | RewriteRule .? - [L] 43 | 44 | # Rewrite all other queries to the front controller. 45 | RewriteRule .? %{ENV:BASE}/app.php [L] 46 | 47 | 48 | 49 | 50 | # When mod_rewrite is not available, we instruct a temporary redirect of 51 | # the start page to the front controller explicitly so that the website 52 | # and the generated links can still be used. 53 | RedirectMatch 302 ^/$ /app.php/ 54 | # RedirectTemp cannot be used instead 55 | 56 | 57 | -------------------------------------------------------------------------------- /app/config/config.yml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: parameters.yml } 3 | - { resource: security.yml } 4 | - { resource: services.yml } 5 | - { resource: admin.yml } 6 | 7 | framework: 8 | #esi: ~ 9 | translator: { fallback: "%locale%" } 10 | secret: "%secret%" 11 | router: 12 | resource: "%kernel.root_dir%/config/routing.yml" 13 | strict_requirements: ~ 14 | form: ~ 15 | csrf_protection: ~ 16 | validation: { enable_annotations: true } 17 | templating: 18 | engines: ['twig'] 19 | #assets_version: SomeVersionScheme 20 | default_locale: "%locale%" 21 | trusted_hosts: ~ 22 | trusted_proxies: ~ 23 | session: 24 | # handler_id set to null will use default session handler from php.ini 25 | handler_id: ~ 26 | fragments: ~ 27 | http_method_override: true 28 | 29 | # Twig Configuration 30 | twig: 31 | debug: "%kernel.debug%" 32 | strict_variables: "%kernel.debug%" 33 | 34 | # Assetic Configuration 35 | assetic: 36 | debug: "%kernel.debug%" 37 | use_controller: false 38 | bundles: [ ] 39 | #java: /usr/bin/java 40 | filters: 41 | cssrewrite: ~ 42 | #closure: 43 | # jar: "%kernel.root_dir%/Resources/java/compiler.jar" 44 | #yui_css: 45 | # jar: "%kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar" 46 | 47 | # Doctrine Configuration 48 | doctrine: 49 | dbal: 50 | driver: "%database_driver%" 51 | host: "%database_host%" 52 | port: "%database_port%" 53 | dbname: "%database_name%" 54 | user: "%database_user%" 55 | password: "%database_password%" 56 | charset: UTF8 57 | # if using pdo_sqlite as your database driver: 58 | # 1. add the path in parameters.yml 59 | # e.g. database_path: "%kernel.root_dir%/data/data.db3" 60 | # 2. Uncomment database_path in parameters.yml.dist 61 | # 3. Uncomment next line: 62 | # path: "%database_path%" 63 | 64 | orm: 65 | auto_generate_proxy_classes: "%kernel.debug%" 66 | auto_mapping: true 67 | 68 | # Swiftmailer Configuration 69 | swiftmailer: 70 | transport: "%mailer_transport%" 71 | host: "%mailer_host%" 72 | username: "%mailer_user%" 73 | password: "%mailer_password%" 74 | spool: { type: memory } 75 | 76 | # app/config/config.yml 77 | fos_user: 78 | db_driver: orm # other valid values are 'mongodb', 'couchdb' and 'propel' 79 | firewall_name: main 80 | user_class: AppBundle\Entity\User 81 | 82 | stof_doctrine_extensions: 83 | default_locale: pl_PL 84 | orm: 85 | default: 86 | tree: false 87 | sluggable: true 88 | timestampable: true 89 | 90 | vich_uploader: 91 | db_driver: orm # or mongodb or propel or phpcr 92 | 93 | mappings: 94 | customer_image: 95 | uri_prefix: /images/customers 96 | upload_destination: %kernel.root_dir%/../web/images/customers 97 | 98 | 99 | -------------------------------------------------------------------------------- /src/AppBundle/Entity/User.php: -------------------------------------------------------------------------------- 1 | id; 66 | } 67 | /** 68 | * Constructor 69 | */ 70 | public function __construct() 71 | { 72 | parent::__construct(); 73 | 74 | $this->customers = new \Doctrine\Common\Collections\ArrayCollection(); 75 | } 76 | 77 | /** 78 | * Add customers 79 | * 80 | * @param \AppBundle\Entity\Customer $customers 81 | * @return User 82 | */ 83 | public function addCustomer(\AppBundle\Entity\Customer $customers) 84 | { 85 | $this->customers[] = $customers; 86 | 87 | return $this; 88 | } 89 | 90 | /** 91 | * Remove customers 92 | * 93 | * @param \AppBundle\Entity\Customer $customers 94 | */ 95 | public function removeCustomer(\AppBundle\Entity\Customer $customers) 96 | { 97 | $this->customers->removeElement($customers); 98 | } 99 | 100 | /** 101 | * Get customers 102 | * 103 | * @return \Doctrine\Common\Collections\Collection 104 | */ 105 | public function getCustomers() 106 | { 107 | return $this->customers; 108 | } 109 | 110 | public function setPlainPassword($password) 111 | { 112 | $this->plainPassword = $password; 113 | $this->updatedAt = new \DateTime(); 114 | 115 | return $this; 116 | } 117 | 118 | /** 119 | * Set updatedAt 120 | * 121 | * @param \DateTime $updatedAt 122 | * 123 | * @return User 124 | */ 125 | public function setUpdatedAt($updatedAt) 126 | { 127 | $this->updatedAt = $updatedAt; 128 | 129 | return $this; 130 | } 131 | 132 | /** 133 | * Get updatedAt 134 | * 135 | * @return \DateTime 136 | */ 137 | public function getUpdatedAt() 138 | { 139 | return $this->updatedAt; 140 | } 141 | 142 | /** 143 | * Set createdAt 144 | * 145 | * @param \DateTime $createdAt 146 | * 147 | * @return User 148 | */ 149 | public function setCreatedAt($createdAt) 150 | { 151 | $this->createdAt = $createdAt; 152 | 153 | return $this; 154 | } 155 | 156 | /** 157 | * Get createdAt 158 | * 159 | * @return \DateTime 160 | */ 161 | public function getCreatedAt() 162 | { 163 | return $this->createdAt; 164 | } 165 | } 166 | -------------------------------------------------------------------------------- /app/check.php: -------------------------------------------------------------------------------- 1 | getPhpIniConfigPath(); 8 | 9 | echo_title('Symfony2 Requirements Checker'); 10 | 11 | echo '> PHP is using the following php.ini file:'.PHP_EOL; 12 | if ($iniPath) { 13 | echo_style('green', ' '.$iniPath); 14 | } else { 15 | echo_style('warning', ' WARNING: No configuration file (php.ini) used by PHP!'); 16 | } 17 | 18 | echo PHP_EOL.PHP_EOL; 19 | 20 | echo '> Checking Symfony requirements:'.PHP_EOL.' '; 21 | 22 | $messages = array(); 23 | foreach ($symfonyRequirements->getRequirements() as $req) { 24 | /** @var $req Requirement */ 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 Symfony2 projects', true); 46 | } else { 47 | echo_block('error', 'ERROR', 'Your system is not ready to run Symfony2 projects', true); 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).PHP_EOL); 124 | echo_style($style, str_pad(' ['.$title.']', $width, ' ', STR_PAD_RIGHT).PHP_EOL); 125 | echo_style($style, str_pad($message, $width, ' ', STR_PAD_RIGHT).PHP_EOL); 126 | echo_style($style, str_repeat(' ', $width).PHP_EOL); 127 | } 128 | 129 | function has_color_support() 130 | { 131 | static $support; 132 | 133 | if (null === $support) { 134 | if (DIRECTORY_SEPARATOR == '\\') { 135 | $support = false !== getenv('ANSICON') || 'ON' === getenv('ConEmuANSI'); 136 | } else { 137 | $support = function_exists('posix_isatty') && @posix_isatty(STDOUT); 138 | } 139 | } 140 | 141 | return $support; 142 | } 143 | -------------------------------------------------------------------------------- /web/config.php: -------------------------------------------------------------------------------- 1 | getFailedRequirements(); 20 | $minorProblems = $symfonyRequirements->getFailedRecommendations(); 21 | 22 | ?> 23 | 24 | 25 | 26 | 27 | 28 | Symfony Configuration 29 | 30 | 31 | 32 | 33 | 34 |
35 |
36 | 39 | 40 | 60 |
61 | 62 |
63 |
64 |
65 |

Welcome!

66 |

Welcome to your new Symfony project.

67 |

68 | This script will guide you through the basic configuration of your project. 69 | You can also do the same by editing the ‘app/config/parameters.yml’ file directly. 70 |

71 | 72 | 73 |

Major problems

74 |

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

75 |
    76 | 77 |
  1. getHelpHtml() ?>
  2. 78 | 79 |
80 | 81 | 82 | 83 |

Recommendations

84 |

85 | Additionally, toTo enhance your Symfony experience, 86 | it’s recommended that you fix the following: 87 |

88 |
    89 | 90 |
  1. getHelpHtml() ?>
  2. 91 | 92 |
93 | 94 | 95 | hasPhpIniConfigIssue()): ?> 96 |

* 97 | getPhpIniConfigPath()): ?> 98 | Changes to the php.ini file must be done in "getPhpIniConfigPath() ?>". 99 | 100 | To change settings, create a "php.ini". 101 | 102 |

103 | 104 | 105 | 106 |

Your configuration looks good to run Symfony.

107 | 108 | 109 | 118 |
119 |
120 |
121 |
Symfony Standard Edition
122 |
123 | 124 | 125 | -------------------------------------------------------------------------------- /app/Resources/views/easy_admin/layout.html.twig: -------------------------------------------------------------------------------- 1 | {% trans_default_domain "EasyAdminBundle" %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | {% block page_title %}{{ block('content_title')|striptags|raw }}{% endblock %} 12 | 13 | {% block head_stylesheets %} 14 | 15 | 16 | 17 | {% endblock head_stylesheets %} 18 | 19 | {% for css_asset in easyadmin_config('design.assets.css') %} 20 | 21 | {% endfor %} 22 | 23 | 24 | 25 | {% block head_javascript %}{% endblock %} 26 | 27 | 28 | {% block body %} 29 | 30 |
31 | {% block wrapper %} 32 | 83 | 84 |
85 | {% block content %} 86 |
87 |
88 | {% block content_header %} 89 |
90 |
91 |

{% block content_title %}{% endblock %}

92 |
93 |
94 | {% endblock content_header %} 95 |
96 | 97 |
98 | {% block main %}{% endblock %} 99 |
100 | 101 | 104 |
105 | {% endblock content %} 106 |
107 | {% endblock wrapper %} 108 |
109 | 110 | {% block body_javascript %} 111 | 112 | 113 | 114 | 115 | {% endblock body_javascript %} 116 | 117 | {% for js_asset in easyadmin_config('design.assets.js') %} 118 | 119 | {% endfor %} 120 | 121 | 122 | {% endblock body %} 123 | 124 | -------------------------------------------------------------------------------- /src/AppBundle/Entity/Customer.php~: -------------------------------------------------------------------------------- 1 | id; 137 | } 138 | 139 | /** 140 | * Set name 141 | * 142 | * @param string $name 143 | * @return Customer 144 | */ 145 | public function setName($name) 146 | { 147 | $this->name = $name; 148 | 149 | return $this; 150 | } 151 | 152 | /** 153 | * Get name 154 | * 155 | * @return string 156 | */ 157 | public function getName() 158 | { 159 | return $this->name; 160 | } 161 | 162 | /** 163 | * Set firstName 164 | * 165 | * @param string $firstName 166 | * @return Customer 167 | */ 168 | public function setFirstName($firstName) 169 | { 170 | $this->firstName = $firstName; 171 | 172 | return $this; 173 | } 174 | 175 | /** 176 | * Get firstName 177 | * 178 | * @return string 179 | */ 180 | public function getFirstName() 181 | { 182 | return $this->firstName; 183 | } 184 | 185 | /** 186 | * Set lastName 187 | * 188 | * @param string $lastName 189 | * @return Customer 190 | */ 191 | public function setLastName($lastName) 192 | { 193 | $this->lastName = $lastName; 194 | 195 | return $this; 196 | } 197 | 198 | /** 199 | * Get lastName 200 | * 201 | * @return string 202 | */ 203 | public function getLastName() 204 | { 205 | return $this->lastName; 206 | } 207 | 208 | /** 209 | * Set phone 210 | * 211 | * @param string $phone 212 | * @return Customer 213 | */ 214 | public function setPhone($phone) 215 | { 216 | $this->phone = $phone; 217 | 218 | return $this; 219 | } 220 | 221 | /** 222 | * Get phone 223 | * 224 | * @return string 225 | */ 226 | public function getPhone() 227 | { 228 | return $this->phone; 229 | } 230 | 231 | /** 232 | * Set email 233 | * 234 | * @param string $email 235 | * @return Customer 236 | */ 237 | public function setEmail($email) 238 | { 239 | $this->email = $email; 240 | 241 | return $this; 242 | } 243 | 244 | /** 245 | * Get email 246 | * 247 | * @return string 248 | */ 249 | public function getEmail() 250 | { 251 | return $this->email; 252 | } 253 | 254 | /** 255 | * Set companyName 256 | * 257 | * @param string $companyName 258 | * @return Customer 259 | */ 260 | public function setCompanyName($companyName) 261 | { 262 | $this->companyName = $companyName; 263 | 264 | return $this; 265 | } 266 | 267 | /** 268 | * Get companyName 269 | * 270 | * @return string 271 | */ 272 | public function getCompanyName() 273 | { 274 | return $this->companyName; 275 | } 276 | 277 | /** 278 | * Set website 279 | * 280 | * @param string $website 281 | * @return Customer 282 | */ 283 | public function setWebsite($website) 284 | { 285 | $this->website = $website; 286 | 287 | return $this; 288 | } 289 | 290 | /** 291 | * Get website 292 | * 293 | * @return string 294 | */ 295 | public function getWebsite() 296 | { 297 | return $this->website; 298 | } 299 | 300 | /** 301 | * Set note 302 | * 303 | * @param string $note 304 | * @return Customer 305 | */ 306 | public function setNote($note) 307 | { 308 | $this->note = $note; 309 | 310 | return $this; 311 | } 312 | 313 | /** 314 | * Get note 315 | * 316 | * @return string 317 | */ 318 | public function getNote() 319 | { 320 | return $this->note; 321 | } 322 | 323 | /** 324 | * Set user 325 | * 326 | * @param \AppBundle\Entity\User $user 327 | * @return Customer 328 | */ 329 | public function setUser(\AppBundle\Entity\User $user = null) 330 | { 331 | $this->user = $user; 332 | 333 | return $this; 334 | } 335 | 336 | /** 337 | * Get user 338 | * 339 | * @return \AppBundle\Entity\User 340 | */ 341 | public function getUser() 342 | { 343 | return $this->user; 344 | } 345 | 346 | /** 347 | * Set logo 348 | * 349 | * @param string $logo 350 | * 351 | * @return Customer 352 | */ 353 | public function setLogo($logo) 354 | { 355 | $this->logo = $logo; 356 | 357 | return $this; 358 | } 359 | 360 | /** 361 | * Get logo 362 | * 363 | * @return string 364 | */ 365 | public function getLogo() 366 | { 367 | return $this->logo; 368 | } 369 | 370 | /** 371 | * If manually uploading a file (i.e. not using Symfony Form) ensure an instance 372 | * of 'UploadedFile' is injected into this setter to trigger the update. If this 373 | * bundle's configuration parameter 'inject_on_load' is set to 'true' this setter 374 | * must be able to accept an instance of 'File' as the bundle will inject one here 375 | * during Doctrine hydration. 376 | * 377 | * @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $image 378 | */ 379 | public function setLogoFile(File $image = null) 380 | { 381 | $this->logoFile = $image; 382 | 383 | if ($image) { 384 | // It is required that at least one field changes if you are using doctrine 385 | // otherwise the event listeners won't be called and the file is lost 386 | $this->updatedAt = new \DateTime('now'); 387 | } 388 | } 389 | 390 | /** 391 | * @return File 392 | */ 393 | public function getImageFile() 394 | { 395 | return $this->imageFile; 396 | } 397 | } 398 | -------------------------------------------------------------------------------- /UPGRADE.md: -------------------------------------------------------------------------------- 1 | Symfony Standard Edition Upgrade 2 | ================================ 3 | 4 | From Symfony 2.0 to Symfony 2.1 5 | ------------------------------- 6 | 7 | ### Project Dependencies 8 | 9 | As of Symfony 2.1, project dependencies are managed by 10 | [Composer](http://getcomposer.org/): 11 | 12 | * The `bin/vendors` script can be removed as `composer.phar` does all the work 13 | now (it is recommended to install it globally on your machine). 14 | 15 | * The `deps` file need to be replaced with the `composer.json` one. 16 | 17 | * The `composer.lock` is the equivalent of the generated `deps.lock` file and 18 | it is automatically generated by Composer. 19 | 20 | Download the default 21 | [`composer.json`](https://raw.github.com/symfony/symfony-standard/2.1/composer.json) 22 | and 23 | [`composer.lock`](https://raw.github.com/symfony/symfony-standard/2.1/composer.lock) 24 | files for Symfony 2.1 and put them into the main directory of your project. If 25 | you have customized your `deps` file, move the added dependencies to the 26 | `composer.json` file (many bundles and PHP libraries are already available as 27 | Composer packages -- search for them on [Packagist](http://packagist.org/)). 28 | 29 | Remove your current `vendor` directory. 30 | 31 | Finally, run Composer: 32 | 33 | $ composer.phar install 34 | 35 | Note: You must complete the upgrade steps below so composer can successfully generate the autoload files. 36 | 37 | ### `app/autoload.php` 38 | 39 | The default `autoload.php` reads as follows (it has been simplified a lot as 40 | autoloading for libraries and bundles declared in your `composer.json` file is 41 | automatically managed by the Composer autoloader): 42 | 43 | add('', __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs'); 54 | } 55 | 56 | AnnotationRegistry::registerLoader(array($loader, 'loadClass')); 57 | 58 | return $loader; 59 | 60 | ### `app/config/config.yml` 61 | 62 | The `framework.charset` setting must be removed. If you are not using `UTF-8` 63 | for your application, override the `getCharset()` method in your `AppKernel` 64 | class instead: 65 | 66 | class AppKernel extends Kernel 67 | { 68 | public function getCharset() 69 | { 70 | return 'ISO-8859-1'; 71 | } 72 | 73 | // ... 74 | } 75 | 76 | You might want to add the new `strict_requirements` parameter to 77 | `framework.router` (it avoids fatal errors in the production environment when 78 | a link cannot be generated): 79 | 80 | framework: 81 | router: 82 | strict_requirements: "%kernel.debug%" 83 | 84 | You can even disable the requirements check on production with `null` as you should 85 | know that the parameters for URL generation always pass the requirements, e.g. by 86 | validating them beforehand. This additionally enhances performance. See 87 | [config_prod.yml](https://github.com/symfony/symfony-standard/blob/master/app/config/config_prod.yml). 88 | 89 | The `default_locale` parameter is now a setting of the main `framework` 90 | configuration (it was under the `framework.session` in 2.0): 91 | 92 | framework: 93 | default_locale: "%locale%" 94 | 95 | The `auto_start` setting under `framework.session` must be removed as it is 96 | not used anymore (the session is now always started on-demand). If 97 | `auto_start` was the only setting under the `framework.session` entry, don't 98 | remove it entirely, but set its value to `~` (`~` means `null` in YAML) 99 | instead: 100 | 101 | framework: 102 | session: ~ 103 | 104 | The `trust_proxy_headers` setting was added in the default configuration file 105 | (as it should be set to `true` when you install your application behind a 106 | reverse proxy): 107 | 108 | framework: 109 | trust_proxy_headers: false 110 | 111 | An empty `bundles` entry was added to the `assetic` configuration: 112 | 113 | assetic: 114 | bundles: [] 115 | 116 | The default `swiftmailer` configuration now has the `spool` setting configured 117 | to the `memory` type to defer email sending after the response is sent to the 118 | user (recommended for better end-user performance): 119 | 120 | swiftmailer: 121 | spool: { type: memory } 122 | 123 | The `jms_security_extra` configuration was moved to the `security.yml` 124 | configuration file. 125 | 126 | ### `app/config/config_dev.yml` 127 | 128 | An example of how to send all emails to a unique address was added: 129 | 130 | #swiftmailer: 131 | # delivery_address: me@example.com 132 | 133 | ### `app/config/config_test.yml` 134 | 135 | The `storage_id` setting must be changed to `session.storage.mock_file`: 136 | 137 | framework: 138 | session: 139 | storage_id: session.storage.mock_file 140 | 141 | ### `app/config/parameters.ini` 142 | 143 | The file has been converted to a YAML file which reads as follows: 144 | 145 | parameters: 146 | database_driver: pdo_mysql 147 | database_host: localhost 148 | database_port: ~ 149 | database_name: symfony 150 | database_user: root 151 | database_password: ~ 152 | 153 | mailer_transport: smtp 154 | mailer_host: localhost 155 | mailer_user: ~ 156 | mailer_password: ~ 157 | 158 | locale: en 159 | secret: ThisTokenIsNotSoSecretChangeIt 160 | 161 | Note that if you convert your parameters file to YAML, you must also change 162 | its reference in `app/config/config.yml`. 163 | 164 | ### `app/config/routing_dev.yml` 165 | 166 | The `_assetic` entry was removed: 167 | 168 | #_assetic: 169 | # resource: . 170 | # type: assetic 171 | 172 | ### `app/config/security.yml` 173 | 174 | Under `security.access_control`, the default rule for internal routes was changed: 175 | 176 | security: 177 | access_control: 178 | #- { path: ^/_internal/secure, roles: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1 } 179 | 180 | Under `security.providers`, the `in_memory` example was updated to the following: 181 | 182 | security: 183 | providers: 184 | in_memory: 185 | memory: 186 | users: 187 | user: { password: userpass, roles: [ 'ROLE_USER' ] } 188 | admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] } 189 | 190 | ### `app/AppKernel.php` 191 | 192 | The following bundles have been added to the list of default registered bundles: 193 | 194 | new JMS\AopBundle\JMSAopBundle(), 195 | new JMS\DiExtraBundle\JMSDiExtraBundle($this), 196 | 197 | You must also rename the DoctrineBundle from: 198 | 199 | new Symfony\Bundle\DoctrineBundle\DoctrineBundle(), 200 | 201 | to: 202 | 203 | new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(), 204 | 205 | ### `web/app.php` 206 | 207 | The default `web/app.php` file now reads as follows: 208 | 209 | register(true); 222 | */ 223 | 224 | require_once __DIR__.'/../app/AppKernel.php'; 225 | //require_once __DIR__.'/../app/AppCache.php'; 226 | 227 | $kernel = new AppKernel('prod', false); 228 | $kernel->loadClassCache(); 229 | //$kernel = new AppCache($kernel); 230 | $request = Request::createFromGlobals(); 231 | $response = $kernel->handle($request); 232 | $response->send(); 233 | $kernel->terminate($request, $response); 234 | 235 | ### `web/app_dev.php` 236 | 237 | The default `web/app_dev.php` file now reads as follows: 238 | 239 | loadClassCache(); 265 | $request = Request::createFromGlobals(); 266 | $response = $kernel->handle($request); 267 | $response->send(); 268 | $kernel->terminate($request, $response); 269 | -------------------------------------------------------------------------------- /src/AppBundle/Entity/Customer.php: -------------------------------------------------------------------------------- 1 | id; 137 | } 138 | 139 | /** 140 | * Set name 141 | * 142 | * @param string $name 143 | * @return Customer 144 | */ 145 | public function setName($name) 146 | { 147 | $this->name = $name; 148 | 149 | return $this; 150 | } 151 | 152 | /** 153 | * Get name 154 | * 155 | * @return string 156 | */ 157 | public function getName() 158 | { 159 | return $this->name; 160 | } 161 | 162 | /** 163 | * Set firstName 164 | * 165 | * @param string $firstName 166 | * @return Customer 167 | */ 168 | public function setFirstName($firstName) 169 | { 170 | $this->firstName = $firstName; 171 | 172 | return $this; 173 | } 174 | 175 | /** 176 | * Get firstName 177 | * 178 | * @return string 179 | */ 180 | public function getFirstName() 181 | { 182 | return $this->firstName; 183 | } 184 | 185 | /** 186 | * Set lastName 187 | * 188 | * @param string $lastName 189 | * @return Customer 190 | */ 191 | public function setLastName($lastName) 192 | { 193 | $this->lastName = $lastName; 194 | 195 | return $this; 196 | } 197 | 198 | /** 199 | * Get lastName 200 | * 201 | * @return string 202 | */ 203 | public function getLastName() 204 | { 205 | return $this->lastName; 206 | } 207 | 208 | /** 209 | * Set phone 210 | * 211 | * @param string $phone 212 | * @return Customer 213 | */ 214 | public function setPhone($phone) 215 | { 216 | $this->phone = $phone; 217 | 218 | return $this; 219 | } 220 | 221 | /** 222 | * Get phone 223 | * 224 | * @return string 225 | */ 226 | public function getPhone() 227 | { 228 | return $this->phone; 229 | } 230 | 231 | /** 232 | * Set email 233 | * 234 | * @param string $email 235 | * @return Customer 236 | */ 237 | public function setEmail($email) 238 | { 239 | $this->email = $email; 240 | 241 | return $this; 242 | } 243 | 244 | /** 245 | * Get email 246 | * 247 | * @return string 248 | */ 249 | public function getEmail() 250 | { 251 | return $this->email; 252 | } 253 | 254 | /** 255 | * Set companyName 256 | * 257 | * @param string $companyName 258 | * @return Customer 259 | */ 260 | public function setCompanyName($companyName) 261 | { 262 | $this->companyName = $companyName; 263 | 264 | return $this; 265 | } 266 | 267 | /** 268 | * Get companyName 269 | * 270 | * @return string 271 | */ 272 | public function getCompanyName() 273 | { 274 | return $this->companyName; 275 | } 276 | 277 | /** 278 | * Set website 279 | * 280 | * @param string $website 281 | * @return Customer 282 | */ 283 | public function setWebsite($website) 284 | { 285 | $this->website = $website; 286 | 287 | return $this; 288 | } 289 | 290 | /** 291 | * Get website 292 | * 293 | * @return string 294 | */ 295 | public function getWebsite() 296 | { 297 | return $this->website; 298 | } 299 | 300 | /** 301 | * Set note 302 | * 303 | * @param string $note 304 | * @return Customer 305 | */ 306 | public function setNote($note) 307 | { 308 | $this->note = $note; 309 | 310 | return $this; 311 | } 312 | 313 | /** 314 | * Get note 315 | * 316 | * @return string 317 | */ 318 | public function getNote() 319 | { 320 | return $this->note; 321 | } 322 | 323 | /** 324 | * Set user 325 | * 326 | * @param \AppBundle\Entity\User $user 327 | * @return Customer 328 | */ 329 | public function setUser(\AppBundle\Entity\User $user = null) 330 | { 331 | $this->user = $user; 332 | 333 | return $this; 334 | } 335 | 336 | /** 337 | * Get user 338 | * 339 | * @return \AppBundle\Entity\User 340 | */ 341 | public function getUser() 342 | { 343 | return $this->user; 344 | } 345 | 346 | /** 347 | * Set logo 348 | * 349 | * @param string $logo 350 | * 351 | * @return Customer 352 | */ 353 | public function setLogo($logo) 354 | { 355 | $this->logo = $logo; 356 | 357 | return $this; 358 | } 359 | 360 | /** 361 | * Get logo 362 | * 363 | * @return string 364 | */ 365 | public function getLogo() 366 | { 367 | return $this->logo; 368 | } 369 | 370 | /** 371 | * @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $image 372 | */ 373 | public function setLogoFile(File $image = null) 374 | { 375 | $this->logoFile = $image; 376 | 377 | if ($image) { 378 | // It is required that at least one field changes if you are using doctrine 379 | // otherwise the event listeners won't be called and the file is lost 380 | $this->updatedAt = new \DateTime('now'); 381 | } 382 | } 383 | 384 | /** 385 | * @return File 386 | */ 387 | public function getLogoFile() 388 | { 389 | return $this->logoFile; 390 | } 391 | 392 | /** 393 | * Set updatedAt 394 | * 395 | * @param \DateTime $updatedAt 396 | * 397 | * @return Customer 398 | */ 399 | public function setUpdatedAt($updatedAt) 400 | { 401 | $this->updatedAt = $updatedAt; 402 | 403 | return $this; 404 | } 405 | 406 | /** 407 | * Get updatedAt 408 | * 409 | * @return \DateTime 410 | */ 411 | public function getUpdatedAt() 412 | { 413 | return $this->updatedAt; 414 | } 415 | 416 | /** 417 | * Set createdAt 418 | * 419 | * @param \DateTime $createdAt 420 | * 421 | * @return Customer 422 | */ 423 | public function setCreatedAt($createdAt) 424 | { 425 | $this->createdAt = $createdAt; 426 | 427 | return $this; 428 | } 429 | 430 | /** 431 | * Get createdAt 432 | * 433 | * @return \DateTime 434 | */ 435 | public function getCreatedAt() 436 | { 437 | return $this->createdAt; 438 | } 439 | } 440 | -------------------------------------------------------------------------------- /app/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 | private $requirements = array(); 172 | 173 | /** 174 | * Gets the current RequirementCollection as an Iterator. 175 | * 176 | * @return Traversable A Traversable interface 177 | */ 178 | public function getIterator() 179 | { 180 | return new ArrayIterator($this->requirements); 181 | } 182 | 183 | /** 184 | * Adds a Requirement. 185 | * 186 | * @param Requirement $requirement A Requirement instance 187 | */ 188 | public function add(Requirement $requirement) 189 | { 190 | $this->requirements[] = $requirement; 191 | } 192 | 193 | /** 194 | * Adds a mandatory requirement. 195 | * 196 | * @param bool $fulfilled Whether the requirement is fulfilled 197 | * @param string $testMessage The message for testing the requirement 198 | * @param string $helpHtml The help text formatted in HTML for resolving the problem 199 | * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) 200 | */ 201 | public function addRequirement($fulfilled, $testMessage, $helpHtml, $helpText = null) 202 | { 203 | $this->add(new Requirement($fulfilled, $testMessage, $helpHtml, $helpText, false)); 204 | } 205 | 206 | /** 207 | * Adds an optional recommendation. 208 | * 209 | * @param bool $fulfilled Whether the recommendation is fulfilled 210 | * @param string $testMessage The message for testing the recommendation 211 | * @param string $helpHtml The help text formatted in HTML for resolving the problem 212 | * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) 213 | */ 214 | public function addRecommendation($fulfilled, $testMessage, $helpHtml, $helpText = null) 215 | { 216 | $this->add(new Requirement($fulfilled, $testMessage, $helpHtml, $helpText, true)); 217 | } 218 | 219 | /** 220 | * Adds a mandatory requirement in form of a php.ini configuration. 221 | * 222 | * @param string $cfgName The configuration name used for ini_get() 223 | * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false, 224 | * or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement 225 | * @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false. 226 | * This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. 227 | * Example: You require a config to be true but PHP later removes this config and defaults it to true internally. 228 | * @param string $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived) 229 | * @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) 230 | * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) 231 | */ 232 | public function addPhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null) 233 | { 234 | $this->add(new PhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence, $testMessage, $helpHtml, $helpText, false)); 235 | } 236 | 237 | /** 238 | * Adds an optional recommendation in form of a php.ini configuration. 239 | * 240 | * @param string $cfgName The configuration name used for ini_get() 241 | * @param bool|callback $evaluation Either a boolean indicating whether the configuration should evaluate to true or false, 242 | * or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement 243 | * @param bool $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false. 244 | * This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. 245 | * Example: You require a config to be true but PHP later removes this config and defaults it to true internally. 246 | * @param string $testMessage The message for testing the requirement (when null and $evaluation is a boolean a default message is derived) 247 | * @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) 248 | * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) 249 | */ 250 | public function addPhpIniRecommendation($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null) 251 | { 252 | $this->add(new PhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence, $testMessage, $helpHtml, $helpText, true)); 253 | } 254 | 255 | /** 256 | * Adds a requirement collection to the current set of requirements. 257 | * 258 | * @param RequirementCollection $collection A RequirementCollection instance 259 | */ 260 | public function addCollection(RequirementCollection $collection) 261 | { 262 | $this->requirements = array_merge($this->requirements, $collection->all()); 263 | } 264 | 265 | /** 266 | * Returns both requirements and recommendations. 267 | * 268 | * @return array Array of Requirement instances 269 | */ 270 | public function all() 271 | { 272 | return $this->requirements; 273 | } 274 | 275 | /** 276 | * Returns all mandatory requirements. 277 | * 278 | * @return array Array of Requirement instances 279 | */ 280 | public function getRequirements() 281 | { 282 | $array = array(); 283 | foreach ($this->requirements as $req) { 284 | if (!$req->isOptional()) { 285 | $array[] = $req; 286 | } 287 | } 288 | 289 | return $array; 290 | } 291 | 292 | /** 293 | * Returns the mandatory requirements that were not met. 294 | * 295 | * @return array Array of Requirement instances 296 | */ 297 | public function getFailedRequirements() 298 | { 299 | $array = array(); 300 | foreach ($this->requirements as $req) { 301 | if (!$req->isFulfilled() && !$req->isOptional()) { 302 | $array[] = $req; 303 | } 304 | } 305 | 306 | return $array; 307 | } 308 | 309 | /** 310 | * Returns all optional recommendations. 311 | * 312 | * @return array Array of Requirement instances 313 | */ 314 | public function getRecommendations() 315 | { 316 | $array = array(); 317 | foreach ($this->requirements as $req) { 318 | if ($req->isOptional()) { 319 | $array[] = $req; 320 | } 321 | } 322 | 323 | return $array; 324 | } 325 | 326 | /** 327 | * Returns the recommendations that were not met. 328 | * 329 | * @return array Array of Requirement instances 330 | */ 331 | public function getFailedRecommendations() 332 | { 333 | $array = array(); 334 | foreach ($this->requirements as $req) { 335 | if (!$req->isFulfilled() && $req->isOptional()) { 336 | $array[] = $req; 337 | } 338 | } 339 | 340 | return $array; 341 | } 342 | 343 | /** 344 | * Returns whether a php.ini configuration is not correct. 345 | * 346 | * @return bool php.ini configuration problem? 347 | */ 348 | public function hasPhpIniConfigIssue() 349 | { 350 | foreach ($this->requirements as $req) { 351 | if (!$req->isFulfilled() && $req instanceof PhpIniRequirement) { 352 | return true; 353 | } 354 | } 355 | 356 | return false; 357 | } 358 | 359 | /** 360 | * Returns the PHP configuration file (php.ini) path. 361 | * 362 | * @return string|false php.ini file path 363 | */ 364 | public function getPhpIniConfigPath() 365 | { 366 | return get_cfg_var('cfg_file_path'); 367 | } 368 | } 369 | 370 | /** 371 | * This class specifies all requirements and optional recommendations that 372 | * are necessary to run the Symfony Standard Edition. 373 | * 374 | * @author Tobias Schultze 375 | * @author Fabien Potencier 376 | */ 377 | class SymfonyRequirements extends RequirementCollection 378 | { 379 | const REQUIRED_PHP_VERSION = '5.3.3'; 380 | 381 | /** 382 | * Constructor that initializes the requirements. 383 | */ 384 | public function __construct() 385 | { 386 | /* mandatory requirements follow */ 387 | 388 | $installedPhpVersion = phpversion(); 389 | 390 | $this->addRequirement( 391 | version_compare($installedPhpVersion, self::REQUIRED_PHP_VERSION, '>='), 392 | sprintf('PHP version must be at least %s (%s installed)', self::REQUIRED_PHP_VERSION, $installedPhpVersion), 393 | sprintf('You are running PHP version "%s", but Symfony needs at least PHP "%s" to run. 394 | Before using Symfony, upgrade your PHP installation, preferably to the latest version.', 395 | $installedPhpVersion, self::REQUIRED_PHP_VERSION), 396 | sprintf('Install PHP %s or newer (installed version is %s)', self::REQUIRED_PHP_VERSION, $installedPhpVersion) 397 | ); 398 | 399 | $this->addRequirement( 400 | version_compare($installedPhpVersion, '5.3.16', '!='), 401 | 'PHP version must not be 5.3.16 as Symfony won\'t work properly with it', 402 | 'Install PHP 5.3.17 or newer (or downgrade to an earlier PHP version)' 403 | ); 404 | 405 | $this->addRequirement( 406 | is_dir(__DIR__.'/../vendor/composer'), 407 | 'Vendor libraries must be installed', 408 | 'Vendor libraries are missing. Install composer following instructions from http://getcomposer.org/. '. 409 | 'Then run "php composer.phar install" to install them.' 410 | ); 411 | 412 | $cacheDir = is_dir(__DIR__.'/../var/cache') ? __DIR__.'/../var/cache' : __DIR__.'/cache'; 413 | 414 | $this->addRequirement( 415 | is_writable($cacheDir), 416 | 'app/cache/ or var/cache/ directory must be writable', 417 | 'Change the permissions of either "app/cache/" or "var/cache/" directory so that the web server can write into it.' 418 | ); 419 | 420 | $logsDir = is_dir(__DIR__.'/../var/logs') ? __DIR__.'/../var/logs' : __DIR__.'/logs'; 421 | 422 | $this->addRequirement( 423 | is_writable($logsDir), 424 | 'app/logs/ or var/logs/ directory must be writable', 425 | 'Change the permissions of either "app/logs/" or "var/logs/" directory so that the web server can write into it.' 426 | ); 427 | 428 | $this->addPhpIniRequirement( 429 | 'date.timezone', true, false, 430 | 'date.timezone setting must be set', 431 | 'Set the "date.timezone" setting in php.ini* (like Europe/Paris).' 432 | ); 433 | 434 | if (version_compare($installedPhpVersion, self::REQUIRED_PHP_VERSION, '>=')) { 435 | $timezones = array(); 436 | foreach (DateTimeZone::listAbbreviations() as $abbreviations) { 437 | foreach ($abbreviations as $abbreviation) { 438 | $timezones[$abbreviation['timezone_id']] = true; 439 | } 440 | } 441 | 442 | $this->addRequirement( 443 | isset($timezones[@date_default_timezone_get()]), 444 | sprintf('Configured default timezone "%s" must be supported by your installation of PHP', @date_default_timezone_get()), 445 | '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.' 446 | ); 447 | } 448 | 449 | $this->addRequirement( 450 | function_exists('json_encode'), 451 | 'json_encode() must be available', 452 | 'Install and enable the JSON extension.' 453 | ); 454 | 455 | $this->addRequirement( 456 | function_exists('session_start'), 457 | 'session_start() must be available', 458 | 'Install and enable the session extension.' 459 | ); 460 | 461 | $this->addRequirement( 462 | function_exists('ctype_alpha'), 463 | 'ctype_alpha() must be available', 464 | 'Install and enable the ctype extension.' 465 | ); 466 | 467 | $this->addRequirement( 468 | function_exists('token_get_all'), 469 | 'token_get_all() must be available', 470 | 'Install and enable the Tokenizer extension.' 471 | ); 472 | 473 | $this->addRequirement( 474 | function_exists('simplexml_import_dom'), 475 | 'simplexml_import_dom() must be available', 476 | 'Install and enable the SimpleXML extension.' 477 | ); 478 | 479 | if (function_exists('apc_store') && ini_get('apc.enabled')) { 480 | if (version_compare($installedPhpVersion, '5.4.0', '>=')) { 481 | $this->addRequirement( 482 | version_compare(phpversion('apc'), '3.1.13', '>='), 483 | 'APC version must be at least 3.1.13 when using PHP 5.4', 484 | 'Upgrade your APC extension (3.1.13+).' 485 | ); 486 | } else { 487 | $this->addRequirement( 488 | version_compare(phpversion('apc'), '3.0.17', '>='), 489 | 'APC version must be at least 3.0.17', 490 | 'Upgrade your APC extension (3.0.17+).' 491 | ); 492 | } 493 | } 494 | 495 | $this->addPhpIniRequirement('detect_unicode', false); 496 | 497 | if (extension_loaded('suhosin')) { 498 | $this->addPhpIniRequirement( 499 | 'suhosin.executor.include.whitelist', 500 | create_function('$cfgValue', 'return false !== stripos($cfgValue, "phar");'), 501 | false, 502 | 'suhosin.executor.include.whitelist must be configured correctly in php.ini', 503 | 'Add "phar" to suhosin.executor.include.whitelist in php.ini*.' 504 | ); 505 | } 506 | 507 | if (extension_loaded('xdebug')) { 508 | $this->addPhpIniRequirement( 509 | 'xdebug.show_exception_trace', false, true 510 | ); 511 | 512 | $this->addPhpIniRequirement( 513 | 'xdebug.scream', false, true 514 | ); 515 | 516 | $this->addPhpIniRecommendation( 517 | 'xdebug.max_nesting_level', 518 | create_function('$cfgValue', 'return $cfgValue > 100;'), 519 | true, 520 | 'xdebug.max_nesting_level should be above 100 in php.ini', 521 | '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.' 522 | ); 523 | } 524 | 525 | $pcreVersion = defined('PCRE_VERSION') ? (float) PCRE_VERSION : null; 526 | 527 | $this->addRequirement( 528 | null !== $pcreVersion, 529 | 'PCRE extension must be available', 530 | 'Install the PCRE extension (version 8.0+).' 531 | ); 532 | 533 | if (extension_loaded('mbstring')) { 534 | $this->addPhpIniRequirement( 535 | 'mbstring.func_overload', 536 | create_function('$cfgValue', 'return (int) $cfgValue === 0;'), 537 | true, 538 | 'string functions should not be overloaded', 539 | 'Set "mbstring.func_overload" to 0 in php.ini* to disable function overloading by the mbstring extension.' 540 | ); 541 | } 542 | 543 | /* optional recommendations follow */ 544 | 545 | if (file_exists(__DIR__.'/../vendor/composer')) { 546 | require_once __DIR__.'/../vendor/autoload.php'; 547 | 548 | try { 549 | $r = new \ReflectionClass('Sensio\Bundle\DistributionBundle\SensioDistributionBundle'); 550 | 551 | $contents = file_get_contents(dirname($r->getFileName()).'/Resources/skeleton/app/SymfonyRequirements.php'); 552 | } catch (\ReflectionException $e) { 553 | $contents = ''; 554 | } 555 | $this->addRecommendation( 556 | file_get_contents(__FILE__) === $contents, 557 | 'Requirements file should be up-to-date', 558 | 'Your requirements file is outdated. Run composer install and re-check your configuration.' 559 | ); 560 | } 561 | 562 | $this->addRecommendation( 563 | version_compare($installedPhpVersion, '5.3.4', '>='), 564 | 'You should use at least PHP 5.3.4 due to PHP bug #52083 in earlier versions', 565 | '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.' 566 | ); 567 | 568 | $this->addRecommendation( 569 | version_compare($installedPhpVersion, '5.3.8', '>='), 570 | 'When using annotations you should have at least PHP 5.3.8 due to PHP bug #55156', 571 | 'Install PHP 5.3.8 or newer if your project uses annotations.' 572 | ); 573 | 574 | $this->addRecommendation( 575 | version_compare($installedPhpVersion, '5.4.0', '!='), 576 | 'You should not use PHP 5.4.0 due to the PHP bug #61453', 577 | '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.' 578 | ); 579 | 580 | $this->addRecommendation( 581 | version_compare($installedPhpVersion, '5.4.11', '>='), 582 | '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)', 583 | 'Install PHP 5.4.11 or newer if your project uses the logout handler from the Symfony Security Component.' 584 | ); 585 | 586 | $this->addRecommendation( 587 | (version_compare($installedPhpVersion, '5.3.18', '>=') && version_compare($installedPhpVersion, '5.4.0', '<')) 588 | || 589 | version_compare($installedPhpVersion, '5.4.8', '>='), 590 | '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', 591 | 'Install PHP 5.3.18+ or PHP 5.4.8+ if you want nice error messages for all fatal errors in the development environment.' 592 | ); 593 | 594 | if (null !== $pcreVersion) { 595 | $this->addRecommendation( 596 | $pcreVersion >= 8.0, 597 | sprintf('PCRE extension should be at least version 8.0 (%s installed)', $pcreVersion), 598 | '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.' 599 | ); 600 | } 601 | 602 | $this->addRecommendation( 603 | class_exists('DomDocument'), 604 | 'PHP-DOM and PHP-XML modules should be installed', 605 | 'Install and enable the PHP-DOM and the PHP-XML modules.' 606 | ); 607 | 608 | $this->addRecommendation( 609 | function_exists('mb_strlen'), 610 | 'mb_strlen() should be available', 611 | 'Install and enable the mbstring extension.' 612 | ); 613 | 614 | $this->addRecommendation( 615 | function_exists('iconv'), 616 | 'iconv() should be available', 617 | 'Install and enable the iconv extension.' 618 | ); 619 | 620 | $this->addRecommendation( 621 | function_exists('utf8_decode'), 622 | 'utf8_decode() should be available', 623 | 'Install and enable the XML extension.' 624 | ); 625 | 626 | $this->addRecommendation( 627 | function_exists('filter_var'), 628 | 'filter_var() should be available', 629 | 'Install and enable the filter extension.' 630 | ); 631 | 632 | if (!defined('PHP_WINDOWS_VERSION_BUILD')) { 633 | $this->addRecommendation( 634 | function_exists('posix_isatty'), 635 | 'posix_isatty() should be available', 636 | 'Install and enable the php_posix extension (used to colorize the CLI output).' 637 | ); 638 | } 639 | 640 | $this->addRecommendation( 641 | class_exists('Locale'), 642 | 'intl extension should be available', 643 | 'Install and enable the intl extension (used for validators).' 644 | ); 645 | 646 | if (extension_loaded('intl')) { 647 | // in some WAMP server installations, new Collator() returns null 648 | $this->addRecommendation( 649 | null !== new Collator('fr_FR'), 650 | 'intl extension should be correctly configured', 651 | 'The intl extension does not behave properly. This problem is typical on PHP 5.3.X x64 WIN builds.' 652 | ); 653 | 654 | // check for compatible ICU versions (only done when you have the intl extension) 655 | if (defined('INTL_ICU_VERSION')) { 656 | $version = INTL_ICU_VERSION; 657 | } else { 658 | $reflector = new ReflectionExtension('intl'); 659 | 660 | ob_start(); 661 | $reflector->info(); 662 | $output = strip_tags(ob_get_clean()); 663 | 664 | preg_match('/^ICU version +(?:=> )?(.*)$/m', $output, $matches); 665 | $version = $matches[1]; 666 | } 667 | 668 | $this->addRecommendation( 669 | version_compare($version, '4.0', '>='), 670 | 'intl ICU version should be at least 4+', 671 | 'Upgrade your intl extension with a newer ICU version (4+).' 672 | ); 673 | 674 | $this->addPhpIniRecommendation( 675 | 'intl.error_level', 676 | create_function('$cfgValue', 'return (int) $cfgValue === 0;'), 677 | true, 678 | 'intl.error_level should be 0 in php.ini', 679 | 'Set "intl.error_level" to "0" in php.ini* to inhibit the messages when an error occurs in ICU functions.' 680 | ); 681 | } 682 | 683 | $accelerator = 684 | (extension_loaded('eaccelerator') && ini_get('eaccelerator.enable')) 685 | || 686 | (extension_loaded('apc') && ini_get('apc.enabled')) 687 | || 688 | (extension_loaded('Zend Optimizer+') && ini_get('zend_optimizerplus.enable')) 689 | || 690 | (extension_loaded('Zend OPcache') && ini_get('opcache.enable')) 691 | || 692 | (extension_loaded('xcache') && ini_get('xcache.cacher')) 693 | || 694 | (extension_loaded('wincache') && ini_get('wincache.ocenabled')) 695 | ; 696 | 697 | $this->addRecommendation( 698 | $accelerator, 699 | 'a PHP accelerator should be installed', 700 | 'Install and/or enable a PHP accelerator (highly recommended).' 701 | ); 702 | 703 | if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { 704 | $this->addRecommendation( 705 | $this->getRealpathCacheSize() > 1000, 706 | 'realpath_cache_size should be above 1024 in php.ini', 707 | 'Set "realpath_cache_size" to e.g. "1024" in php.ini* to improve performance on windows.' 708 | ); 709 | } 710 | 711 | $this->addPhpIniRecommendation('short_open_tag', false); 712 | 713 | $this->addPhpIniRecommendation('magic_quotes_gpc', false, true); 714 | 715 | $this->addPhpIniRecommendation('register_globals', false, true); 716 | 717 | $this->addPhpIniRecommendation('session.auto_start', false); 718 | 719 | $this->addRecommendation( 720 | class_exists('PDO'), 721 | 'PDO should be installed', 722 | 'Install PDO (mandatory for Doctrine).' 723 | ); 724 | 725 | if (class_exists('PDO')) { 726 | $drivers = PDO::getAvailableDrivers(); 727 | $this->addRecommendation( 728 | count($drivers) > 0, 729 | sprintf('PDO should have some drivers installed (currently available: %s)', count($drivers) ? implode(', ', $drivers) : 'none'), 730 | 'Install PDO drivers (mandatory for Doctrine).' 731 | ); 732 | } 733 | } 734 | 735 | /** 736 | * Loads realpath_cache_size from php.ini and converts it to int. 737 | * 738 | * (e.g. 16k is converted to 16384 int) 739 | * 740 | * @return int 741 | */ 742 | protected function getRealpathCacheSize() 743 | { 744 | $size = ini_get('realpath_cache_size'); 745 | $size = trim($size); 746 | $unit = strtolower(substr($size, -1, 1)); 747 | switch ($unit) { 748 | case 'g': 749 | return $size * 1024 * 1024 * 1024; 750 | case 'm': 751 | return $size * 1024 * 1024; 752 | case 'k': 753 | return $size * 1024; 754 | default: 755 | return (int) $size; 756 | } 757 | } 758 | } 759 | -------------------------------------------------------------------------------- /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 | "hash": "e8660f96667db4bfb1e5da8cb53dcebb", 8 | "packages": [ 9 | { 10 | "name": "behat/transliterator", 11 | "version": "v1.0.1", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/Behat/Transliterator.git", 15 | "reference": "c93521d3462a554332d1ef5bb0e9b5b8ca4106c4" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/Behat/Transliterator/zipball/c93521d3462a554332d1ef5bb0e9b5b8ca4106c4", 20 | "reference": "c93521d3462a554332d1ef5bb0e9b5b8ca4106c4", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": ">=5.3.3" 25 | }, 26 | "type": "library", 27 | "extra": { 28 | "branch-alias": { 29 | "dev-master": "1.0-dev" 30 | } 31 | }, 32 | "autoload": { 33 | "psr-0": { 34 | "Behat\\Transliterator": "src/" 35 | } 36 | }, 37 | "notification-url": "https://packagist.org/downloads/", 38 | "license": [ 39 | "Artistic-1.0" 40 | ], 41 | "description": "String transliterator", 42 | "keywords": [ 43 | "i18n", 44 | "slug", 45 | "transliterator" 46 | ], 47 | "time": "2014-05-15 22:08:22" 48 | }, 49 | { 50 | "name": "doctrine/annotations", 51 | "version": "v1.2.4", 52 | "source": { 53 | "type": "git", 54 | "url": "https://github.com/doctrine/annotations.git", 55 | "reference": "b5202eb9e83f8db52e0e58867e0a46e63be8332e" 56 | }, 57 | "dist": { 58 | "type": "zip", 59 | "url": "https://api.github.com/repos/doctrine/annotations/zipball/b5202eb9e83f8db52e0e58867e0a46e63be8332e", 60 | "reference": "b5202eb9e83f8db52e0e58867e0a46e63be8332e", 61 | "shasum": "" 62 | }, 63 | "require": { 64 | "doctrine/lexer": "1.*", 65 | "php": ">=5.3.2" 66 | }, 67 | "require-dev": { 68 | "doctrine/cache": "1.*", 69 | "phpunit/phpunit": "4.*" 70 | }, 71 | "type": "library", 72 | "extra": { 73 | "branch-alias": { 74 | "dev-master": "1.3.x-dev" 75 | } 76 | }, 77 | "autoload": { 78 | "psr-0": { 79 | "Doctrine\\Common\\Annotations\\": "lib/" 80 | } 81 | }, 82 | "notification-url": "https://packagist.org/downloads/", 83 | "license": [ 84 | "MIT" 85 | ], 86 | "authors": [ 87 | { 88 | "name": "Roman Borschel", 89 | "email": "roman@code-factory.org" 90 | }, 91 | { 92 | "name": "Benjamin Eberlei", 93 | "email": "kontakt@beberlei.de" 94 | }, 95 | { 96 | "name": "Guilherme Blanco", 97 | "email": "guilhermeblanco@gmail.com" 98 | }, 99 | { 100 | "name": "Jonathan Wage", 101 | "email": "jonwage@gmail.com" 102 | }, 103 | { 104 | "name": "Johannes Schmitt", 105 | "email": "schmittjoh@gmail.com" 106 | } 107 | ], 108 | "description": "Docblock Annotations Parser", 109 | "homepage": "http://www.doctrine-project.org", 110 | "keywords": [ 111 | "annotations", 112 | "docblock", 113 | "parser" 114 | ], 115 | "time": "2014-12-23 22:40:37" 116 | }, 117 | { 118 | "name": "doctrine/cache", 119 | "version": "v1.4.1", 120 | "source": { 121 | "type": "git", 122 | "url": "https://github.com/doctrine/cache.git", 123 | "reference": "c9eadeb743ac6199f7eec423cb9426bc518b7b03" 124 | }, 125 | "dist": { 126 | "type": "zip", 127 | "url": "https://api.github.com/repos/doctrine/cache/zipball/c9eadeb743ac6199f7eec423cb9426bc518b7b03", 128 | "reference": "c9eadeb743ac6199f7eec423cb9426bc518b7b03", 129 | "shasum": "" 130 | }, 131 | "require": { 132 | "php": ">=5.3.2" 133 | }, 134 | "conflict": { 135 | "doctrine/common": ">2.2,<2.4" 136 | }, 137 | "require-dev": { 138 | "phpunit/phpunit": ">=3.7", 139 | "predis/predis": "~1.0", 140 | "satooshi/php-coveralls": "~0.6" 141 | }, 142 | "type": "library", 143 | "extra": { 144 | "branch-alias": { 145 | "dev-master": "1.5.x-dev" 146 | } 147 | }, 148 | "autoload": { 149 | "psr-0": { 150 | "Doctrine\\Common\\Cache\\": "lib/" 151 | } 152 | }, 153 | "notification-url": "https://packagist.org/downloads/", 154 | "license": [ 155 | "MIT" 156 | ], 157 | "authors": [ 158 | { 159 | "name": "Roman Borschel", 160 | "email": "roman@code-factory.org" 161 | }, 162 | { 163 | "name": "Benjamin Eberlei", 164 | "email": "kontakt@beberlei.de" 165 | }, 166 | { 167 | "name": "Guilherme Blanco", 168 | "email": "guilhermeblanco@gmail.com" 169 | }, 170 | { 171 | "name": "Jonathan Wage", 172 | "email": "jonwage@gmail.com" 173 | }, 174 | { 175 | "name": "Johannes Schmitt", 176 | "email": "schmittjoh@gmail.com" 177 | } 178 | ], 179 | "description": "Caching library offering an object-oriented API for many cache backends", 180 | "homepage": "http://www.doctrine-project.org", 181 | "keywords": [ 182 | "cache", 183 | "caching" 184 | ], 185 | "time": "2015-04-15 00:11:59" 186 | }, 187 | { 188 | "name": "doctrine/collections", 189 | "version": "v1.3.0", 190 | "source": { 191 | "type": "git", 192 | "url": "https://github.com/doctrine/collections.git", 193 | "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a" 194 | }, 195 | "dist": { 196 | "type": "zip", 197 | "url": "https://api.github.com/repos/doctrine/collections/zipball/6c1e4eef75f310ea1b3e30945e9f06e652128b8a", 198 | "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a", 199 | "shasum": "" 200 | }, 201 | "require": { 202 | "php": ">=5.3.2" 203 | }, 204 | "require-dev": { 205 | "phpunit/phpunit": "~4.0" 206 | }, 207 | "type": "library", 208 | "extra": { 209 | "branch-alias": { 210 | "dev-master": "1.2.x-dev" 211 | } 212 | }, 213 | "autoload": { 214 | "psr-0": { 215 | "Doctrine\\Common\\Collections\\": "lib/" 216 | } 217 | }, 218 | "notification-url": "https://packagist.org/downloads/", 219 | "license": [ 220 | "MIT" 221 | ], 222 | "authors": [ 223 | { 224 | "name": "Roman Borschel", 225 | "email": "roman@code-factory.org" 226 | }, 227 | { 228 | "name": "Benjamin Eberlei", 229 | "email": "kontakt@beberlei.de" 230 | }, 231 | { 232 | "name": "Guilherme Blanco", 233 | "email": "guilhermeblanco@gmail.com" 234 | }, 235 | { 236 | "name": "Jonathan Wage", 237 | "email": "jonwage@gmail.com" 238 | }, 239 | { 240 | "name": "Johannes Schmitt", 241 | "email": "schmittjoh@gmail.com" 242 | } 243 | ], 244 | "description": "Collections Abstraction library", 245 | "homepage": "http://www.doctrine-project.org", 246 | "keywords": [ 247 | "array", 248 | "collections", 249 | "iterator" 250 | ], 251 | "time": "2015-04-14 22:21:58" 252 | }, 253 | { 254 | "name": "doctrine/common", 255 | "version": "v2.5.0", 256 | "source": { 257 | "type": "git", 258 | "url": "https://github.com/doctrine/common.git", 259 | "reference": "cd8daf2501e10c63dced7b8b9b905844316ae9d3" 260 | }, 261 | "dist": { 262 | "type": "zip", 263 | "url": "https://api.github.com/repos/doctrine/common/zipball/cd8daf2501e10c63dced7b8b9b905844316ae9d3", 264 | "reference": "cd8daf2501e10c63dced7b8b9b905844316ae9d3", 265 | "shasum": "" 266 | }, 267 | "require": { 268 | "doctrine/annotations": "1.*", 269 | "doctrine/cache": "1.*", 270 | "doctrine/collections": "1.*", 271 | "doctrine/inflector": "1.*", 272 | "doctrine/lexer": "1.*", 273 | "php": ">=5.3.2" 274 | }, 275 | "require-dev": { 276 | "phpunit/phpunit": "~3.7" 277 | }, 278 | "type": "library", 279 | "extra": { 280 | "branch-alias": { 281 | "dev-master": "2.6.x-dev" 282 | } 283 | }, 284 | "autoload": { 285 | "psr-0": { 286 | "Doctrine\\Common\\": "lib/" 287 | } 288 | }, 289 | "notification-url": "https://packagist.org/downloads/", 290 | "license": [ 291 | "MIT" 292 | ], 293 | "authors": [ 294 | { 295 | "name": "Roman Borschel", 296 | "email": "roman@code-factory.org" 297 | }, 298 | { 299 | "name": "Benjamin Eberlei", 300 | "email": "kontakt@beberlei.de" 301 | }, 302 | { 303 | "name": "Guilherme Blanco", 304 | "email": "guilhermeblanco@gmail.com" 305 | }, 306 | { 307 | "name": "Jonathan Wage", 308 | "email": "jonwage@gmail.com" 309 | }, 310 | { 311 | "name": "Johannes Schmitt", 312 | "email": "schmittjoh@gmail.com" 313 | } 314 | ], 315 | "description": "Common Library for Doctrine projects", 316 | "homepage": "http://www.doctrine-project.org", 317 | "keywords": [ 318 | "annotations", 319 | "collections", 320 | "eventmanager", 321 | "persistence", 322 | "spl" 323 | ], 324 | "time": "2015-04-02 19:55:44" 325 | }, 326 | { 327 | "name": "doctrine/dbal", 328 | "version": "v2.5.1", 329 | "source": { 330 | "type": "git", 331 | "url": "https://github.com/doctrine/dbal.git", 332 | "reference": "628c2256b646ae2417d44e063bce8aec5199d48d" 333 | }, 334 | "dist": { 335 | "type": "zip", 336 | "url": "https://api.github.com/repos/doctrine/dbal/zipball/628c2256b646ae2417d44e063bce8aec5199d48d", 337 | "reference": "628c2256b646ae2417d44e063bce8aec5199d48d", 338 | "shasum": "" 339 | }, 340 | "require": { 341 | "doctrine/common": ">=2.4,<2.6-dev", 342 | "php": ">=5.3.2" 343 | }, 344 | "require-dev": { 345 | "phpunit/phpunit": "4.*", 346 | "symfony/console": "2.*" 347 | }, 348 | "suggest": { 349 | "symfony/console": "For helpful console commands such as SQL execution and import of files." 350 | }, 351 | "bin": [ 352 | "bin/doctrine-dbal" 353 | ], 354 | "type": "library", 355 | "extra": { 356 | "branch-alias": { 357 | "dev-master": "2.5.x-dev" 358 | } 359 | }, 360 | "autoload": { 361 | "psr-0": { 362 | "Doctrine\\DBAL\\": "lib/" 363 | } 364 | }, 365 | "notification-url": "https://packagist.org/downloads/", 366 | "license": [ 367 | "MIT" 368 | ], 369 | "authors": [ 370 | { 371 | "name": "Roman Borschel", 372 | "email": "roman@code-factory.org" 373 | }, 374 | { 375 | "name": "Benjamin Eberlei", 376 | "email": "kontakt@beberlei.de" 377 | }, 378 | { 379 | "name": "Guilherme Blanco", 380 | "email": "guilhermeblanco@gmail.com" 381 | }, 382 | { 383 | "name": "Jonathan Wage", 384 | "email": "jonwage@gmail.com" 385 | } 386 | ], 387 | "description": "Database Abstraction Layer", 388 | "homepage": "http://www.doctrine-project.org", 389 | "keywords": [ 390 | "database", 391 | "dbal", 392 | "persistence", 393 | "queryobject" 394 | ], 395 | "time": "2015-01-12 21:52:47" 396 | }, 397 | { 398 | "name": "doctrine/doctrine-bundle", 399 | "version": "v1.5.0", 400 | "source": { 401 | "type": "git", 402 | "url": "https://github.com/doctrine/DoctrineBundle.git", 403 | "reference": "0b9e27037c4fdbad515ee5ec89842e9091a6480f" 404 | }, 405 | "dist": { 406 | "type": "zip", 407 | "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/0b9e27037c4fdbad515ee5ec89842e9091a6480f", 408 | "reference": "0b9e27037c4fdbad515ee5ec89842e9091a6480f", 409 | "shasum": "" 410 | }, 411 | "require": { 412 | "doctrine/dbal": "~2.3", 413 | "doctrine/doctrine-cache-bundle": "~1.0", 414 | "jdorn/sql-formatter": "~1.1", 415 | "php": ">=5.3.2", 416 | "symfony/console": "~2.3", 417 | "symfony/doctrine-bridge": "~2.2", 418 | "symfony/framework-bundle": "~2.3" 419 | }, 420 | "require-dev": { 421 | "doctrine/orm": "~2.3", 422 | "phpunit/phpunit": "~4", 423 | "satooshi/php-coveralls": "~0.6.1", 424 | "symfony/validator": "~2.2", 425 | "symfony/yaml": "~2.2", 426 | "twig/twig": "~1.10" 427 | }, 428 | "suggest": { 429 | "doctrine/orm": "The Doctrine ORM integration is optional in the bundle.", 430 | "symfony/web-profiler-bundle": "to use the data collector" 431 | }, 432 | "type": "symfony-bundle", 433 | "extra": { 434 | "branch-alias": { 435 | "dev-master": "1.5.x-dev" 436 | } 437 | }, 438 | "autoload": { 439 | "psr-4": { 440 | "Doctrine\\Bundle\\DoctrineBundle\\": "" 441 | } 442 | }, 443 | "notification-url": "https://packagist.org/downloads/", 444 | "license": [ 445 | "MIT" 446 | ], 447 | "authors": [ 448 | { 449 | "name": "Symfony Community", 450 | "homepage": "http://symfony.com/contributors" 451 | }, 452 | { 453 | "name": "Benjamin Eberlei", 454 | "email": "kontakt@beberlei.de" 455 | }, 456 | { 457 | "name": "Doctrine Project", 458 | "homepage": "http://www.doctrine-project.org/" 459 | }, 460 | { 461 | "name": "Fabien Potencier", 462 | "email": "fabien@symfony.com" 463 | } 464 | ], 465 | "description": "Symfony DoctrineBundle", 466 | "homepage": "http://www.doctrine-project.org", 467 | "keywords": [ 468 | "database", 469 | "dbal", 470 | "orm", 471 | "persistence" 472 | ], 473 | "time": "2015-05-28 12:27:15" 474 | }, 475 | { 476 | "name": "doctrine/doctrine-cache-bundle", 477 | "version": "v1.0.1", 478 | "target-dir": "Doctrine/Bundle/DoctrineCacheBundle", 479 | "source": { 480 | "type": "git", 481 | "url": "https://github.com/doctrine/DoctrineCacheBundle.git", 482 | "reference": "e4b6f810aa047f9cbfe41c3d6a3d7e83d7477a9d" 483 | }, 484 | "dist": { 485 | "type": "zip", 486 | "url": "https://api.github.com/repos/doctrine/DoctrineCacheBundle/zipball/e4b6f810aa047f9cbfe41c3d6a3d7e83d7477a9d", 487 | "reference": "e4b6f810aa047f9cbfe41c3d6a3d7e83d7477a9d", 488 | "shasum": "" 489 | }, 490 | "require": { 491 | "doctrine/cache": "~1.3", 492 | "doctrine/inflector": "~1.0", 493 | "php": ">=5.3.2", 494 | "symfony/doctrine-bridge": "~2.2", 495 | "symfony/framework-bundle": "~2.2", 496 | "symfony/security": "~2.2" 497 | }, 498 | "require-dev": { 499 | "instaclick/coding-standard": "~1.1", 500 | "instaclick/object-calisthenics-sniffs": "dev-master", 501 | "instaclick/symfony2-coding-standard": "dev-remaster", 502 | "phpunit/phpunit": "~3.7", 503 | "satooshi/php-coveralls": "~0.6.1", 504 | "squizlabs/php_codesniffer": "dev-master", 505 | "symfony/console": "~2.2", 506 | "symfony/finder": "~2.2", 507 | "symfony/validator": "~2.2", 508 | "symfony/yaml": "~2.2" 509 | }, 510 | "type": "symfony-bundle", 511 | "extra": { 512 | "branch-alias": { 513 | "dev-master": "1.0.x-dev" 514 | } 515 | }, 516 | "autoload": { 517 | "psr-0": { 518 | "Doctrine\\Bundle\\DoctrineCacheBundle": "" 519 | } 520 | }, 521 | "notification-url": "https://packagist.org/downloads/", 522 | "license": [ 523 | "MIT" 524 | ], 525 | "authors": [ 526 | { 527 | "name": "Symfony Community", 528 | "homepage": "http://symfony.com/contributors" 529 | }, 530 | { 531 | "name": "Benjamin Eberlei", 532 | "email": "kontakt@beberlei.de" 533 | }, 534 | { 535 | "name": "Fabio B. Silva", 536 | "email": "fabio.bat.silva@gmail.com" 537 | }, 538 | { 539 | "name": "Guilherme Blanco", 540 | "email": "guilhermeblanco@hotmail.com" 541 | }, 542 | { 543 | "name": "Doctrine Project", 544 | "homepage": "http://www.doctrine-project.org/" 545 | }, 546 | { 547 | "name": "Fabien Potencier", 548 | "email": "fabien@symfony.com" 549 | } 550 | ], 551 | "description": "Symfony2 Bundle for Doctrine Cache", 552 | "homepage": "http://www.doctrine-project.org", 553 | "keywords": [ 554 | "cache", 555 | "caching" 556 | ], 557 | "time": "2014-11-28 09:43:36" 558 | }, 559 | { 560 | "name": "doctrine/inflector", 561 | "version": "v1.0.1", 562 | "source": { 563 | "type": "git", 564 | "url": "https://github.com/doctrine/inflector.git", 565 | "reference": "0bcb2e79d8571787f18b7eb036ed3d004908e604" 566 | }, 567 | "dist": { 568 | "type": "zip", 569 | "url": "https://api.github.com/repos/doctrine/inflector/zipball/0bcb2e79d8571787f18b7eb036ed3d004908e604", 570 | "reference": "0bcb2e79d8571787f18b7eb036ed3d004908e604", 571 | "shasum": "" 572 | }, 573 | "require": { 574 | "php": ">=5.3.2" 575 | }, 576 | "require-dev": { 577 | "phpunit/phpunit": "4.*" 578 | }, 579 | "type": "library", 580 | "extra": { 581 | "branch-alias": { 582 | "dev-master": "1.0.x-dev" 583 | } 584 | }, 585 | "autoload": { 586 | "psr-0": { 587 | "Doctrine\\Common\\Inflector\\": "lib/" 588 | } 589 | }, 590 | "notification-url": "https://packagist.org/downloads/", 591 | "license": [ 592 | "MIT" 593 | ], 594 | "authors": [ 595 | { 596 | "name": "Roman Borschel", 597 | "email": "roman@code-factory.org" 598 | }, 599 | { 600 | "name": "Benjamin Eberlei", 601 | "email": "kontakt@beberlei.de" 602 | }, 603 | { 604 | "name": "Guilherme Blanco", 605 | "email": "guilhermeblanco@gmail.com" 606 | }, 607 | { 608 | "name": "Jonathan Wage", 609 | "email": "jonwage@gmail.com" 610 | }, 611 | { 612 | "name": "Johannes Schmitt", 613 | "email": "schmittjoh@gmail.com" 614 | } 615 | ], 616 | "description": "Common String Manipulations with regard to casing and singular/plural rules.", 617 | "homepage": "http://www.doctrine-project.org", 618 | "keywords": [ 619 | "inflection", 620 | "pluralize", 621 | "singularize", 622 | "string" 623 | ], 624 | "time": "2014-12-20 21:24:13" 625 | }, 626 | { 627 | "name": "doctrine/instantiator", 628 | "version": "1.0.4", 629 | "source": { 630 | "type": "git", 631 | "url": "https://github.com/doctrine/instantiator.git", 632 | "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119" 633 | }, 634 | "dist": { 635 | "type": "zip", 636 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f976e5de371104877ebc89bd8fecb0019ed9c119", 637 | "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119", 638 | "shasum": "" 639 | }, 640 | "require": { 641 | "php": ">=5.3,<8.0-DEV" 642 | }, 643 | "require-dev": { 644 | "athletic/athletic": "~0.1.8", 645 | "ext-pdo": "*", 646 | "ext-phar": "*", 647 | "phpunit/phpunit": "~4.0", 648 | "squizlabs/php_codesniffer": "2.0.*@ALPHA" 649 | }, 650 | "type": "library", 651 | "extra": { 652 | "branch-alias": { 653 | "dev-master": "1.0.x-dev" 654 | } 655 | }, 656 | "autoload": { 657 | "psr-0": { 658 | "Doctrine\\Instantiator\\": "src" 659 | } 660 | }, 661 | "notification-url": "https://packagist.org/downloads/", 662 | "license": [ 663 | "MIT" 664 | ], 665 | "authors": [ 666 | { 667 | "name": "Marco Pivetta", 668 | "email": "ocramius@gmail.com", 669 | "homepage": "http://ocramius.github.com/" 670 | } 671 | ], 672 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 673 | "homepage": "https://github.com/doctrine/instantiator", 674 | "keywords": [ 675 | "constructor", 676 | "instantiate" 677 | ], 678 | "time": "2014-10-13 12:58:55" 679 | }, 680 | { 681 | "name": "doctrine/lexer", 682 | "version": "v1.0.1", 683 | "source": { 684 | "type": "git", 685 | "url": "https://github.com/doctrine/lexer.git", 686 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" 687 | }, 688 | "dist": { 689 | "type": "zip", 690 | "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", 691 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", 692 | "shasum": "" 693 | }, 694 | "require": { 695 | "php": ">=5.3.2" 696 | }, 697 | "type": "library", 698 | "extra": { 699 | "branch-alias": { 700 | "dev-master": "1.0.x-dev" 701 | } 702 | }, 703 | "autoload": { 704 | "psr-0": { 705 | "Doctrine\\Common\\Lexer\\": "lib/" 706 | } 707 | }, 708 | "notification-url": "https://packagist.org/downloads/", 709 | "license": [ 710 | "MIT" 711 | ], 712 | "authors": [ 713 | { 714 | "name": "Roman Borschel", 715 | "email": "roman@code-factory.org" 716 | }, 717 | { 718 | "name": "Guilherme Blanco", 719 | "email": "guilhermeblanco@gmail.com" 720 | }, 721 | { 722 | "name": "Johannes Schmitt", 723 | "email": "schmittjoh@gmail.com" 724 | } 725 | ], 726 | "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", 727 | "homepage": "http://www.doctrine-project.org", 728 | "keywords": [ 729 | "lexer", 730 | "parser" 731 | ], 732 | "time": "2014-09-09 13:34:57" 733 | }, 734 | { 735 | "name": "doctrine/orm", 736 | "version": "v2.5.0", 737 | "source": { 738 | "type": "git", 739 | "url": "https://github.com/doctrine/doctrine2.git", 740 | "reference": "aa80c7d2c55a372f5f9f825f5c66dbda53a6e3fe" 741 | }, 742 | "dist": { 743 | "type": "zip", 744 | "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/aa80c7d2c55a372f5f9f825f5c66dbda53a6e3fe", 745 | "reference": "aa80c7d2c55a372f5f9f825f5c66dbda53a6e3fe", 746 | "shasum": "" 747 | }, 748 | "require": { 749 | "doctrine/cache": "~1.4", 750 | "doctrine/collections": "~1.2", 751 | "doctrine/common": ">=2.5-dev,<2.6-dev", 752 | "doctrine/dbal": ">=2.5-dev,<2.6-dev", 753 | "doctrine/instantiator": "~1.0.1", 754 | "ext-pdo": "*", 755 | "php": ">=5.4", 756 | "symfony/console": "~2.5" 757 | }, 758 | "require-dev": { 759 | "phpunit/phpunit": "~4.0", 760 | "satooshi/php-coveralls": "dev-master", 761 | "symfony/yaml": "~2.1" 762 | }, 763 | "suggest": { 764 | "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" 765 | }, 766 | "bin": [ 767 | "bin/doctrine", 768 | "bin/doctrine.php" 769 | ], 770 | "type": "library", 771 | "extra": { 772 | "branch-alias": { 773 | "dev-master": "2.6.x-dev" 774 | } 775 | }, 776 | "autoload": { 777 | "psr-0": { 778 | "Doctrine\\ORM\\": "lib/" 779 | } 780 | }, 781 | "notification-url": "https://packagist.org/downloads/", 782 | "license": [ 783 | "MIT" 784 | ], 785 | "authors": [ 786 | { 787 | "name": "Roman Borschel", 788 | "email": "roman@code-factory.org" 789 | }, 790 | { 791 | "name": "Benjamin Eberlei", 792 | "email": "kontakt@beberlei.de" 793 | }, 794 | { 795 | "name": "Guilherme Blanco", 796 | "email": "guilhermeblanco@gmail.com" 797 | }, 798 | { 799 | "name": "Jonathan Wage", 800 | "email": "jonwage@gmail.com" 801 | } 802 | ], 803 | "description": "Object-Relational-Mapper for PHP", 804 | "homepage": "http://www.doctrine-project.org", 805 | "keywords": [ 806 | "database", 807 | "orm" 808 | ], 809 | "time": "2015-04-02 20:40:18" 810 | }, 811 | { 812 | "name": "friendsofsymfony/user-bundle", 813 | "version": "dev-master", 814 | "source": { 815 | "type": "git", 816 | "url": "https://github.com/FriendsOfSymfony/FOSUserBundle.git", 817 | "reference": "92d5624f2a29e74d8fd9d2a94d7ed7998a8c2809" 818 | }, 819 | "dist": { 820 | "type": "zip", 821 | "url": "https://api.github.com/repos/FriendsOfSymfony/FOSUserBundle/zipball/3efbc08a97f218d0a4524dee926fc4381e3d0947", 822 | "reference": "92d5624f2a29e74d8fd9d2a94d7ed7998a8c2809", 823 | "shasum": "" 824 | }, 825 | "require": { 826 | "php": ">=5.3.2", 827 | "symfony/form": "~2.3", 828 | "symfony/framework-bundle": "~2.3", 829 | "symfony/security-bundle": "~2.3", 830 | "symfony/twig-bundle": "~2.3" 831 | }, 832 | "require-dev": { 833 | "doctrine/doctrine-bundle": "~1.3", 834 | "swiftmailer/swiftmailer": "~4.3|~5", 835 | "symfony/validator": "~2.3", 836 | "symfony/yaml": "~2.3", 837 | "willdurand/propel-typehintable-behavior": "~1.0" 838 | }, 839 | "suggest": { 840 | "willdurand/propel-typehintable-behavior": "Needed when using the propel implementation" 841 | }, 842 | "type": "symfony-bundle", 843 | "extra": { 844 | "branch-alias": { 845 | "dev-master": "2.0.x-dev" 846 | } 847 | }, 848 | "autoload": { 849 | "psr-4": { 850 | "FOS\\UserBundle\\": "" 851 | } 852 | }, 853 | "notification-url": "https://packagist.org/downloads/", 854 | "license": [ 855 | "MIT" 856 | ], 857 | "authors": [ 858 | { 859 | "name": "Christophe Coevoet", 860 | "email": "stof@notk.org" 861 | }, 862 | { 863 | "name": "FriendsOfSymfony Community", 864 | "homepage": "https://github.com/friendsofsymfony/FOSUserBundle/contributors" 865 | }, 866 | { 867 | "name": "Thibault Duplessis", 868 | "email": "thibault.duplessis@gmail.com" 869 | } 870 | ], 871 | "description": "Symfony FOSUserBundle", 872 | "homepage": "http://friendsofsymfony.github.com", 873 | "keywords": [ 874 | "User management" 875 | ], 876 | "time": "2015-05-05 15:08:24" 877 | }, 878 | { 879 | "name": "gedmo/doctrine-extensions", 880 | "version": "v2.3.12", 881 | "source": { 882 | "type": "git", 883 | "url": "https://github.com/Atlantic18/DoctrineExtensions.git", 884 | "reference": "c3ff3c73c95b01e107af33d4fe3abf80794e2df9" 885 | }, 886 | "dist": { 887 | "type": "zip", 888 | "url": "https://api.github.com/repos/Atlantic18/DoctrineExtensions/zipball/c3ff3c73c95b01e107af33d4fe3abf80794e2df9", 889 | "reference": "c3ff3c73c95b01e107af33d4fe3abf80794e2df9", 890 | "shasum": "" 891 | }, 892 | "require": { 893 | "behat/transliterator": "~1.0", 894 | "doctrine/common": "~2.4", 895 | "php": ">=5.3.2" 896 | }, 897 | "require-dev": { 898 | "doctrine/mongodb-odm": ">=1.0.0-BETA11", 899 | "doctrine/orm": "~2.4", 900 | "phpunit/phpunit": "~4.4", 901 | "phpunit/phpunit-mock-objects": "~2.3", 902 | "symfony/yaml": "~2.3" 903 | }, 904 | "suggest": { 905 | "doctrine/mongodb-odm": "to use the extensions with the MongoDB ODM", 906 | "doctrine/orm": "to use the extensions with the ORM" 907 | }, 908 | "type": "library", 909 | "extra": { 910 | "branch-alias": { 911 | "dev-master": "2.3.x-dev" 912 | } 913 | }, 914 | "autoload": { 915 | "psr-0": { 916 | "Gedmo\\": "lib/" 917 | } 918 | }, 919 | "notification-url": "https://packagist.org/downloads/", 920 | "license": [ 921 | "MIT" 922 | ], 923 | "authors": [ 924 | { 925 | "name": "David Buchmann", 926 | "email": "david@liip.ch" 927 | }, 928 | { 929 | "name": "Gediminas Morkevicius", 930 | "email": "gediminas.morkevicius@gmail.com" 931 | }, 932 | { 933 | "name": "Gustavo Falco", 934 | "email": "comfortablynumb84@gmail.com" 935 | } 936 | ], 937 | "description": "Doctrine2 behavioral extensions", 938 | "homepage": "http://gediminasm.org/", 939 | "keywords": [ 940 | "Blameable", 941 | "behaviors", 942 | "doctrine2", 943 | "extensions", 944 | "gedmo", 945 | "loggable", 946 | "nestedset", 947 | "sluggable", 948 | "sortable", 949 | "timestampable", 950 | "translatable", 951 | "tree", 952 | "uploadable" 953 | ], 954 | "time": "2015-02-24 21:41:37" 955 | }, 956 | { 957 | "name": "incenteev/composer-parameter-handler", 958 | "version": "v2.1.1", 959 | "source": { 960 | "type": "git", 961 | "url": "https://github.com/Incenteev/ParameterHandler.git", 962 | "reference": "84a205fe80a46101607bafbc423019527893ddd0" 963 | }, 964 | "dist": { 965 | "type": "zip", 966 | "url": "https://api.github.com/repos/Incenteev/ParameterHandler/zipball/84a205fe80a46101607bafbc423019527893ddd0", 967 | "reference": "84a205fe80a46101607bafbc423019527893ddd0", 968 | "shasum": "" 969 | }, 970 | "require": { 971 | "php": ">=5.3.3", 972 | "symfony/yaml": "~2.0" 973 | }, 974 | "require-dev": { 975 | "composer/composer": "1.0.*@dev", 976 | "phpspec/prophecy-phpunit": "~1.0", 977 | "symfony/filesystem": "~2.2" 978 | }, 979 | "type": "library", 980 | "extra": { 981 | "branch-alias": { 982 | "dev-master": "2.1.x-dev" 983 | } 984 | }, 985 | "autoload": { 986 | "psr-4": { 987 | "Incenteev\\ParameterHandler\\": "" 988 | } 989 | }, 990 | "notification-url": "https://packagist.org/downloads/", 991 | "license": [ 992 | "MIT" 993 | ], 994 | "authors": [ 995 | { 996 | "name": "Christophe Coevoet", 997 | "email": "stof@notk.org" 998 | } 999 | ], 1000 | "description": "Composer script handling your ignored parameter file", 1001 | "homepage": "https://github.com/Incenteev/ParameterHandler", 1002 | "keywords": [ 1003 | "parameters management" 1004 | ], 1005 | "time": "2015-06-03 08:27:03" 1006 | }, 1007 | { 1008 | "name": "javiereguiluz/easyadmin-bundle", 1009 | "version": "v1.5.4", 1010 | "source": { 1011 | "type": "git", 1012 | "url": "https://github.com/javiereguiluz/EasyAdminBundle.git", 1013 | "reference": "a98628da1e582585c6768a85b96a9a1219b13d9f" 1014 | }, 1015 | "dist": { 1016 | "type": "zip", 1017 | "url": "https://api.github.com/repos/javiereguiluz/EasyAdminBundle/zipball/a98628da1e582585c6768a85b96a9a1219b13d9f", 1018 | "reference": "a98628da1e582585c6768a85b96a9a1219b13d9f", 1019 | "shasum": "" 1020 | }, 1021 | "require": { 1022 | "doctrine/doctrine-bundle": "~1.2", 1023 | "doctrine/orm": "~2.3", 1024 | "pagerfanta/pagerfanta": "~1.0,>=1.0.1", 1025 | "php": ">=5.3.0", 1026 | "sensio/distribution-bundle": "~2.3|~3.0", 1027 | "sensio/framework-extra-bundle": "~3.0,>=3.0.2", 1028 | "symfony/symfony": "~2.3", 1029 | "twig/extensions": "~1.0", 1030 | "twig/twig": "~1.12,>=1.12.2" 1031 | }, 1032 | "require-dev": { 1033 | "doctrine/doctrine-fixtures-bundle": "~2.2", 1034 | "phpunit/phpunit": "~4.4" 1035 | }, 1036 | "type": "symfony-bundle", 1037 | "autoload": { 1038 | "psr-4": { 1039 | "JavierEguiluz\\Bundle\\EasyAdminBundle\\": "" 1040 | } 1041 | }, 1042 | "notification-url": "https://packagist.org/downloads/", 1043 | "license": [ 1044 | "MIT" 1045 | ], 1046 | "authors": [ 1047 | { 1048 | "name": "Javier Eguiluz", 1049 | "email": "javiereguiluz@gmail.com" 1050 | }, 1051 | { 1052 | "name": "Project Contributors", 1053 | "homepage": "http://github.com/javiereguiluz/easyadmin/blob/master/CONTRIBUTORS.md" 1054 | } 1055 | ], 1056 | "description": "Admin generator for Symfony applications", 1057 | "homepage": "https://github.com/javiereguiluz/EasyAdminBundle", 1058 | "keywords": [ 1059 | "admin", 1060 | "backend", 1061 | "generator" 1062 | ], 1063 | "time": "2015-06-06 19:46:29" 1064 | }, 1065 | { 1066 | "name": "jdorn/sql-formatter", 1067 | "version": "v1.2.17", 1068 | "source": { 1069 | "type": "git", 1070 | "url": "https://github.com/jdorn/sql-formatter.git", 1071 | "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc" 1072 | }, 1073 | "dist": { 1074 | "type": "zip", 1075 | "url": "https://api.github.com/repos/jdorn/sql-formatter/zipball/64990d96e0959dff8e059dfcdc1af130728d92bc", 1076 | "reference": "64990d96e0959dff8e059dfcdc1af130728d92bc", 1077 | "shasum": "" 1078 | }, 1079 | "require": { 1080 | "php": ">=5.2.4" 1081 | }, 1082 | "require-dev": { 1083 | "phpunit/phpunit": "3.7.*" 1084 | }, 1085 | "type": "library", 1086 | "extra": { 1087 | "branch-alias": { 1088 | "dev-master": "1.3.x-dev" 1089 | } 1090 | }, 1091 | "autoload": { 1092 | "classmap": [ 1093 | "lib" 1094 | ] 1095 | }, 1096 | "notification-url": "https://packagist.org/downloads/", 1097 | "license": [ 1098 | "MIT" 1099 | ], 1100 | "authors": [ 1101 | { 1102 | "name": "Jeremy Dorn", 1103 | "email": "jeremy@jeremydorn.com", 1104 | "homepage": "http://jeremydorn.com/" 1105 | } 1106 | ], 1107 | "description": "a PHP SQL highlighting library", 1108 | "homepage": "https://github.com/jdorn/sql-formatter/", 1109 | "keywords": [ 1110 | "highlight", 1111 | "sql" 1112 | ], 1113 | "time": "2014-01-12 16:20:24" 1114 | }, 1115 | { 1116 | "name": "jms/metadata", 1117 | "version": "1.5.1", 1118 | "source": { 1119 | "type": "git", 1120 | "url": "https://github.com/schmittjoh/metadata.git", 1121 | "reference": "22b72455559a25777cfd28c4ffda81ff7639f353" 1122 | }, 1123 | "dist": { 1124 | "type": "zip", 1125 | "url": "https://api.github.com/repos/schmittjoh/metadata/zipball/22b72455559a25777cfd28c4ffda81ff7639f353", 1126 | "reference": "22b72455559a25777cfd28c4ffda81ff7639f353", 1127 | "shasum": "" 1128 | }, 1129 | "require": { 1130 | "php": ">=5.3.0" 1131 | }, 1132 | "require-dev": { 1133 | "doctrine/cache": "~1.0" 1134 | }, 1135 | "type": "library", 1136 | "extra": { 1137 | "branch-alias": { 1138 | "dev-master": "1.5.x-dev" 1139 | } 1140 | }, 1141 | "autoload": { 1142 | "psr-0": { 1143 | "Metadata\\": "src/" 1144 | } 1145 | }, 1146 | "notification-url": "https://packagist.org/downloads/", 1147 | "license": [ 1148 | "Apache" 1149 | ], 1150 | "authors": [ 1151 | { 1152 | "name": "Johannes Schmitt", 1153 | "email": "schmittjoh@gmail.com", 1154 | "homepage": "https://github.com/schmittjoh", 1155 | "role": "Developer of wrapped JMSSerializerBundle" 1156 | } 1157 | ], 1158 | "description": "Class/method/property metadata management in PHP", 1159 | "keywords": [ 1160 | "annotations", 1161 | "metadata", 1162 | "xml", 1163 | "yaml" 1164 | ], 1165 | "time": "2014-07-12 07:13:19" 1166 | }, 1167 | { 1168 | "name": "kriswallsmith/assetic", 1169 | "version": "v1.2.1", 1170 | "source": { 1171 | "type": "git", 1172 | "url": "https://github.com/kriswallsmith/assetic.git", 1173 | "reference": "b20efe38845d20458702f97f3ff625d80805897b" 1174 | }, 1175 | "dist": { 1176 | "type": "zip", 1177 | "url": "https://api.github.com/repos/kriswallsmith/assetic/zipball/b20efe38845d20458702f97f3ff625d80805897b", 1178 | "reference": "b20efe38845d20458702f97f3ff625d80805897b", 1179 | "shasum": "" 1180 | }, 1181 | "require": { 1182 | "php": ">=5.3.1", 1183 | "symfony/process": "~2.1" 1184 | }, 1185 | "require-dev": { 1186 | "cssmin/cssmin": "*", 1187 | "joliclic/javascript-packer": "*", 1188 | "kamicane/packager": "*", 1189 | "leafo/lessphp": "*", 1190 | "leafo/scssphp": "*", 1191 | "leafo/scssphp-compass": "*", 1192 | "mrclay/minify": "*", 1193 | "patchwork/jsqueeze": "~1.0", 1194 | "phpunit/phpunit": "~4", 1195 | "psr/log": "~1.0", 1196 | "ptachoire/cssembed": "*", 1197 | "twig/twig": "~1.6" 1198 | }, 1199 | "suggest": { 1200 | "leafo/lessphp": "Assetic provides the integration with the lessphp LESS compiler", 1201 | "leafo/scssphp": "Assetic provides the integration with the scssphp SCSS compiler", 1202 | "leafo/scssphp-compass": "Assetic provides the integration with the SCSS compass plugin", 1203 | "patchwork/jsqueeze": "Assetic provides the integration with the JSqueeze JavaScript compressor", 1204 | "ptachoire/cssembed": "Assetic provides the integration with phpcssembed to embed data uris", 1205 | "twig/twig": "Assetic provides the integration with the Twig templating engine" 1206 | }, 1207 | "type": "library", 1208 | "extra": { 1209 | "branch-alias": { 1210 | "dev-master": "1.2-dev" 1211 | } 1212 | }, 1213 | "autoload": { 1214 | "psr-0": { 1215 | "Assetic": "src/" 1216 | }, 1217 | "files": [ 1218 | "src/functions.php" 1219 | ] 1220 | }, 1221 | "notification-url": "https://packagist.org/downloads/", 1222 | "license": [ 1223 | "MIT" 1224 | ], 1225 | "authors": [ 1226 | { 1227 | "name": "Kris Wallsmith", 1228 | "email": "kris.wallsmith@gmail.com", 1229 | "homepage": "http://kriswallsmith.net/" 1230 | } 1231 | ], 1232 | "description": "Asset Management for PHP", 1233 | "homepage": "https://github.com/kriswallsmith/assetic", 1234 | "keywords": [ 1235 | "assets", 1236 | "compression", 1237 | "minification" 1238 | ], 1239 | "time": "2014-12-12 05:04:05" 1240 | }, 1241 | { 1242 | "name": "monolog/monolog", 1243 | "version": "1.13.1", 1244 | "source": { 1245 | "type": "git", 1246 | "url": "https://github.com/Seldaek/monolog.git", 1247 | "reference": "c31a2c4e8db5da8b46c74cf275d7f109c0f249ac" 1248 | }, 1249 | "dist": { 1250 | "type": "zip", 1251 | "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c31a2c4e8db5da8b46c74cf275d7f109c0f249ac", 1252 | "reference": "c31a2c4e8db5da8b46c74cf275d7f109c0f249ac", 1253 | "shasum": "" 1254 | }, 1255 | "require": { 1256 | "php": ">=5.3.0", 1257 | "psr/log": "~1.0" 1258 | }, 1259 | "provide": { 1260 | "psr/log-implementation": "1.0.0" 1261 | }, 1262 | "require-dev": { 1263 | "aws/aws-sdk-php": "~2.4, >2.4.8", 1264 | "doctrine/couchdb": "~1.0@dev", 1265 | "graylog2/gelf-php": "~1.0", 1266 | "phpunit/phpunit": "~4.0", 1267 | "raven/raven": "~0.5", 1268 | "ruflin/elastica": "0.90.*", 1269 | "swiftmailer/swiftmailer": "~5.3", 1270 | "videlalvaro/php-amqplib": "~2.4" 1271 | }, 1272 | "suggest": { 1273 | "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", 1274 | "doctrine/couchdb": "Allow sending log messages to a CouchDB server", 1275 | "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", 1276 | "ext-mongo": "Allow sending log messages to a MongoDB server", 1277 | "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", 1278 | "raven/raven": "Allow sending log messages to a Sentry server", 1279 | "rollbar/rollbar": "Allow sending log messages to Rollbar", 1280 | "ruflin/elastica": "Allow sending log messages to an Elastic Search server", 1281 | "videlalvaro/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib" 1282 | }, 1283 | "type": "library", 1284 | "extra": { 1285 | "branch-alias": { 1286 | "dev-master": "1.13.x-dev" 1287 | } 1288 | }, 1289 | "autoload": { 1290 | "psr-4": { 1291 | "Monolog\\": "src/Monolog" 1292 | } 1293 | }, 1294 | "notification-url": "https://packagist.org/downloads/", 1295 | "license": [ 1296 | "MIT" 1297 | ], 1298 | "authors": [ 1299 | { 1300 | "name": "Jordi Boggiano", 1301 | "email": "j.boggiano@seld.be", 1302 | "homepage": "http://seld.be" 1303 | } 1304 | ], 1305 | "description": "Sends your logs to files, sockets, inboxes, databases and various web services", 1306 | "homepage": "http://github.com/Seldaek/monolog", 1307 | "keywords": [ 1308 | "log", 1309 | "logging", 1310 | "psr-3" 1311 | ], 1312 | "time": "2015-03-09 09:58:04" 1313 | }, 1314 | { 1315 | "name": "pagerfanta/pagerfanta", 1316 | "version": "v1.0.3", 1317 | "source": { 1318 | "type": "git", 1319 | "url": "https://github.com/whiteoctober/Pagerfanta.git", 1320 | "reference": "a874d3612d954dcbbb49e5ffe178890918fb76fb" 1321 | }, 1322 | "dist": { 1323 | "type": "zip", 1324 | "url": "https://api.github.com/repos/whiteoctober/Pagerfanta/zipball/a874d3612d954dcbbb49e5ffe178890918fb76fb", 1325 | "reference": "a874d3612d954dcbbb49e5ffe178890918fb76fb", 1326 | "shasum": "" 1327 | }, 1328 | "require": { 1329 | "php": ">=5.3.0" 1330 | }, 1331 | "require-dev": { 1332 | "doctrine/orm": "~2.3", 1333 | "doctrine/phpcr-odm": "1.*", 1334 | "jackalope/jackalope-doctrine-dbal": "1.*", 1335 | "jmikola/geojson": "~1.0", 1336 | "mandango/mandango": "~1.0@dev", 1337 | "mandango/mondator": "~1.0@dev", 1338 | "phpunit/phpunit": "~4", 1339 | "propel/propel1": "~1.6", 1340 | "ruflin/elastica": "~1.3", 1341 | "solarium/solarium": "~3.1" 1342 | }, 1343 | "suggest": { 1344 | "doctrine/mongodb-odm": "To use the DoctrineODMMongoDBAdapter.", 1345 | "doctrine/orm": "To use the DoctrineORMAdapter.", 1346 | "doctrine/phpcr-odm": "To use the DoctrineODMPhpcrAdapter. >= 1.1.0", 1347 | "mandango/mandango": "To use the MandangoAdapter.", 1348 | "propel/propel1": "To use the PropelAdapter", 1349 | "solarium/solarium": "To use the SolariumAdapter." 1350 | }, 1351 | "type": "library", 1352 | "extra": { 1353 | "branch-alias": { 1354 | "dev-master": "1.0.x-dev" 1355 | } 1356 | }, 1357 | "autoload": { 1358 | "psr-0": { 1359 | "Pagerfanta\\": "src/" 1360 | } 1361 | }, 1362 | "notification-url": "https://packagist.org/downloads/", 1363 | "license": [ 1364 | "MIT" 1365 | ], 1366 | "authors": [ 1367 | { 1368 | "name": "Pablo Díez", 1369 | "email": "pablodip@gmail.com" 1370 | } 1371 | ], 1372 | "description": "Pagination for PHP 5.3", 1373 | "keywords": [ 1374 | "page", 1375 | "pagination", 1376 | "paginator", 1377 | "paging" 1378 | ], 1379 | "time": "2014-10-06 10:57:25" 1380 | }, 1381 | { 1382 | "name": "psr/log", 1383 | "version": "1.0.0", 1384 | "source": { 1385 | "type": "git", 1386 | "url": "https://github.com/php-fig/log.git", 1387 | "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b" 1388 | }, 1389 | "dist": { 1390 | "type": "zip", 1391 | "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b", 1392 | "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b", 1393 | "shasum": "" 1394 | }, 1395 | "type": "library", 1396 | "autoload": { 1397 | "psr-0": { 1398 | "Psr\\Log\\": "" 1399 | } 1400 | }, 1401 | "notification-url": "https://packagist.org/downloads/", 1402 | "license": [ 1403 | "MIT" 1404 | ], 1405 | "authors": [ 1406 | { 1407 | "name": "PHP-FIG", 1408 | "homepage": "http://www.php-fig.org/" 1409 | } 1410 | ], 1411 | "description": "Common interface for logging libraries", 1412 | "keywords": [ 1413 | "log", 1414 | "psr", 1415 | "psr-3" 1416 | ], 1417 | "time": "2012-12-21 11:40:51" 1418 | }, 1419 | { 1420 | "name": "sensio/distribution-bundle", 1421 | "version": "v3.0.30", 1422 | "target-dir": "Sensio/Bundle/DistributionBundle", 1423 | "source": { 1424 | "type": "git", 1425 | "url": "https://github.com/sensiolabs/SensioDistributionBundle.git", 1426 | "reference": "f1758b30096202aeede61f79a1dffd69da091517" 1427 | }, 1428 | "dist": { 1429 | "type": "zip", 1430 | "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/f1758b30096202aeede61f79a1dffd69da091517", 1431 | "reference": "f1758b30096202aeede61f79a1dffd69da091517", 1432 | "shasum": "" 1433 | }, 1434 | "require": { 1435 | "php": ">=5.3.3", 1436 | "sensiolabs/security-checker": "~2.0", 1437 | "symfony/class-loader": "~2.2", 1438 | "symfony/framework-bundle": "~2.3", 1439 | "symfony/process": "~2.2" 1440 | }, 1441 | "require-dev": { 1442 | "symfony/form": "~2.2", 1443 | "symfony/validator": "~2.2", 1444 | "symfony/yaml": "~2.2" 1445 | }, 1446 | "suggest": { 1447 | "symfony/form": "If you want to use the configurator", 1448 | "symfony/validator": "If you want to use the configurator", 1449 | "symfony/yaml": "If you want to use the configurator" 1450 | }, 1451 | "type": "symfony-bundle", 1452 | "extra": { 1453 | "branch-alias": { 1454 | "dev-master": "3.0.x-dev" 1455 | } 1456 | }, 1457 | "autoload": { 1458 | "psr-0": { 1459 | "Sensio\\Bundle\\DistributionBundle": "" 1460 | } 1461 | }, 1462 | "notification-url": "https://packagist.org/downloads/", 1463 | "license": [ 1464 | "MIT" 1465 | ], 1466 | "authors": [ 1467 | { 1468 | "name": "Fabien Potencier", 1469 | "email": "fabien@symfony.com" 1470 | } 1471 | ], 1472 | "description": "Base bundle for Symfony Distributions", 1473 | "keywords": [ 1474 | "configuration", 1475 | "distribution" 1476 | ], 1477 | "time": "2015-06-05 22:32:22" 1478 | }, 1479 | { 1480 | "name": "sensio/framework-extra-bundle", 1481 | "version": "v3.0.9", 1482 | "source": { 1483 | "type": "git", 1484 | "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", 1485 | "reference": "0616fd568da051adc19ca63006cc808531ba2da4" 1486 | }, 1487 | "dist": { 1488 | "type": "zip", 1489 | "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/0616fd568da051adc19ca63006cc808531ba2da4", 1490 | "reference": "0616fd568da051adc19ca63006cc808531ba2da4", 1491 | "shasum": "" 1492 | }, 1493 | "require": { 1494 | "doctrine/common": "~2.2", 1495 | "symfony/framework-bundle": "~2.3" 1496 | }, 1497 | "require-dev": { 1498 | "symfony/expression-language": "~2.4", 1499 | "symfony/security-bundle": "~2.4" 1500 | }, 1501 | "suggest": { 1502 | "symfony/expression-language": "", 1503 | "symfony/psr-http-message-bridge": "To use the PSR-7 converters", 1504 | "symfony/security-bundle": "" 1505 | }, 1506 | "type": "symfony-bundle", 1507 | "extra": { 1508 | "branch-alias": { 1509 | "dev-master": "3.0.x-dev" 1510 | } 1511 | }, 1512 | "autoload": { 1513 | "psr-4": { 1514 | "Sensio\\Bundle\\FrameworkExtraBundle\\": "" 1515 | } 1516 | }, 1517 | "notification-url": "https://packagist.org/downloads/", 1518 | "license": [ 1519 | "MIT" 1520 | ], 1521 | "authors": [ 1522 | { 1523 | "name": "Fabien Potencier", 1524 | "email": "fabien@symfony.com" 1525 | } 1526 | ], 1527 | "description": "This bundle provides a way to configure your controllers with annotations", 1528 | "keywords": [ 1529 | "annotations", 1530 | "controllers" 1531 | ], 1532 | "time": "2015-06-05 13:59:21" 1533 | }, 1534 | { 1535 | "name": "sensiolabs/security-checker", 1536 | "version": "v2.0.5", 1537 | "source": { 1538 | "type": "git", 1539 | "url": "https://github.com/sensiolabs/security-checker.git", 1540 | "reference": "2c2a71f1c77d9765c12638c4724d9ca23658a810" 1541 | }, 1542 | "dist": { 1543 | "type": "zip", 1544 | "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/2c2a71f1c77d9765c12638c4724d9ca23658a810", 1545 | "reference": "2c2a71f1c77d9765c12638c4724d9ca23658a810", 1546 | "shasum": "" 1547 | }, 1548 | "require": { 1549 | "ext-curl": "*", 1550 | "symfony/console": "~2.0" 1551 | }, 1552 | "bin": [ 1553 | "security-checker" 1554 | ], 1555 | "type": "library", 1556 | "extra": { 1557 | "branch-alias": { 1558 | "dev-master": "2.0-dev" 1559 | } 1560 | }, 1561 | "autoload": { 1562 | "psr-0": { 1563 | "SensioLabs\\Security": "" 1564 | } 1565 | }, 1566 | "notification-url": "https://packagist.org/downloads/", 1567 | "license": [ 1568 | "MIT" 1569 | ], 1570 | "authors": [ 1571 | { 1572 | "name": "Fabien Potencier", 1573 | "email": "fabien.potencier@gmail.com" 1574 | } 1575 | ], 1576 | "description": "A security checker for your composer.lock", 1577 | "time": "2015-05-28 14:22:40" 1578 | }, 1579 | { 1580 | "name": "stof/doctrine-extensions-bundle", 1581 | "version": "dev-master", 1582 | "source": { 1583 | "type": "git", 1584 | "url": "https://github.com/stof/StofDoctrineExtensionsBundle.git", 1585 | "reference": "2ff8473e33e224af87dc00d48a552a35a75115af" 1586 | }, 1587 | "dist": { 1588 | "type": "zip", 1589 | "url": "https://api.github.com/repos/stof/StofDoctrineExtensionsBundle/zipball/2ff8473e33e224af87dc00d48a552a35a75115af", 1590 | "reference": "2ff8473e33e224af87dc00d48a552a35a75115af", 1591 | "shasum": "" 1592 | }, 1593 | "require": { 1594 | "gedmo/doctrine-extensions": "~2.3.1", 1595 | "php": ">=5.3.2", 1596 | "symfony/framework-bundle": "~2.1" 1597 | }, 1598 | "suggest": { 1599 | "doctrine/doctrine-bundle": "to use the ORM extensions", 1600 | "doctrine/mongodb-odm-bundle": "to use the MongoDB ODM extensions" 1601 | }, 1602 | "type": "symfony-bundle", 1603 | "extra": { 1604 | "branch-alias": { 1605 | "dev-master": "1.2.x-dev" 1606 | } 1607 | }, 1608 | "autoload": { 1609 | "psr-4": { 1610 | "Stof\\DoctrineExtensionsBundle\\": "" 1611 | } 1612 | }, 1613 | "notification-url": "https://packagist.org/downloads/", 1614 | "license": [ 1615 | "MIT" 1616 | ], 1617 | "authors": [ 1618 | { 1619 | "name": "Christophe Coevoet", 1620 | "email": "stof@notk.org" 1621 | } 1622 | ], 1623 | "description": "Integration of the gedmo/doctrine-extensions with Symfony2", 1624 | "homepage": "https://github.com/stof/StofDoctrineExtensionsBundle", 1625 | "keywords": [ 1626 | "behaviors", 1627 | "doctrine2", 1628 | "extensions", 1629 | "gedmo", 1630 | "loggable", 1631 | "nestedset", 1632 | "sluggable", 1633 | "sortable", 1634 | "timestampable", 1635 | "translatable", 1636 | "tree" 1637 | ], 1638 | "time": "2014-09-30 08:24:40" 1639 | }, 1640 | { 1641 | "name": "swiftmailer/swiftmailer", 1642 | "version": "v5.4.1", 1643 | "source": { 1644 | "type": "git", 1645 | "url": "https://github.com/swiftmailer/swiftmailer.git", 1646 | "reference": "0697e6aa65c83edf97bb0f23d8763f94e3f11421" 1647 | }, 1648 | "dist": { 1649 | "type": "zip", 1650 | "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/0697e6aa65c83edf97bb0f23d8763f94e3f11421", 1651 | "reference": "0697e6aa65c83edf97bb0f23d8763f94e3f11421", 1652 | "shasum": "" 1653 | }, 1654 | "require": { 1655 | "php": ">=5.3.3" 1656 | }, 1657 | "require-dev": { 1658 | "mockery/mockery": "~0.9.1,<0.9.4" 1659 | }, 1660 | "type": "library", 1661 | "extra": { 1662 | "branch-alias": { 1663 | "dev-master": "5.4-dev" 1664 | } 1665 | }, 1666 | "autoload": { 1667 | "files": [ 1668 | "lib/swift_required.php" 1669 | ] 1670 | }, 1671 | "notification-url": "https://packagist.org/downloads/", 1672 | "license": [ 1673 | "MIT" 1674 | ], 1675 | "authors": [ 1676 | { 1677 | "name": "Chris Corbyn" 1678 | }, 1679 | { 1680 | "name": "Fabien Potencier", 1681 | "email": "fabien@symfony.com" 1682 | } 1683 | ], 1684 | "description": "Swiftmailer, free feature-rich PHP mailer", 1685 | "homepage": "http://swiftmailer.org", 1686 | "keywords": [ 1687 | "email", 1688 | "mail", 1689 | "mailer" 1690 | ], 1691 | "time": "2015-06-06 14:19:39" 1692 | }, 1693 | { 1694 | "name": "symfony/assetic-bundle", 1695 | "version": "v2.6.1", 1696 | "source": { 1697 | "type": "git", 1698 | "url": "https://github.com/symfony/AsseticBundle.git", 1699 | "reference": "422b0add2110f0cf9bc7a873a386ea053f4a89f0" 1700 | }, 1701 | "dist": { 1702 | "type": "zip", 1703 | "url": "https://api.github.com/repos/symfony/AsseticBundle/zipball/422b0add2110f0cf9bc7a873a386ea053f4a89f0", 1704 | "reference": "422b0add2110f0cf9bc7a873a386ea053f4a89f0", 1705 | "shasum": "" 1706 | }, 1707 | "require": { 1708 | "kriswallsmith/assetic": "~1.2", 1709 | "php": ">=5.3.0", 1710 | "symfony/console": "~2.3", 1711 | "symfony/dependency-injection": "~2.3", 1712 | "symfony/framework-bundle": "~2.3", 1713 | "symfony/yaml": "~2.3" 1714 | }, 1715 | "require-dev": { 1716 | "kriswallsmith/spork": "~0.2", 1717 | "patchwork/jsqueeze": "~1.0", 1718 | "symfony/class-loader": "~2.3", 1719 | "symfony/css-selector": "~2.3", 1720 | "symfony/dom-crawler": "~2.3", 1721 | "symfony/twig-bundle": "~2.3" 1722 | }, 1723 | "suggest": { 1724 | "kriswallsmith/spork": "to be able to dump assets in parallel", 1725 | "symfony/twig-bundle": "to use the Twig integration" 1726 | }, 1727 | "type": "symfony-bundle", 1728 | "extra": { 1729 | "branch-alias": { 1730 | "dev-master": "2.5-dev" 1731 | } 1732 | }, 1733 | "autoload": { 1734 | "psr-4": { 1735 | "Symfony\\Bundle\\AsseticBundle\\": "" 1736 | } 1737 | }, 1738 | "notification-url": "https://packagist.org/downloads/", 1739 | "license": [ 1740 | "MIT" 1741 | ], 1742 | "authors": [ 1743 | { 1744 | "name": "Kris Wallsmith", 1745 | "email": "kris.wallsmith@gmail.com", 1746 | "homepage": "http://kriswallsmith.net/" 1747 | } 1748 | ], 1749 | "description": "Integrates Assetic into Symfony2", 1750 | "homepage": "https://github.com/symfony/AsseticBundle", 1751 | "keywords": [ 1752 | "assets", 1753 | "compression", 1754 | "minification" 1755 | ], 1756 | "time": "2015-01-27 12:45:16" 1757 | }, 1758 | { 1759 | "name": "symfony/monolog-bundle", 1760 | "version": "v2.7.1", 1761 | "source": { 1762 | "type": "git", 1763 | "url": "https://github.com/symfony/MonologBundle.git", 1764 | "reference": "9320b6863404c70ebe111e9040dab96f251de7ac" 1765 | }, 1766 | "dist": { 1767 | "type": "zip", 1768 | "url": "https://api.github.com/repos/symfony/MonologBundle/zipball/9320b6863404c70ebe111e9040dab96f251de7ac", 1769 | "reference": "9320b6863404c70ebe111e9040dab96f251de7ac", 1770 | "shasum": "" 1771 | }, 1772 | "require": { 1773 | "monolog/monolog": "~1.8", 1774 | "php": ">=5.3.2", 1775 | "symfony/config": "~2.3", 1776 | "symfony/dependency-injection": "~2.3", 1777 | "symfony/http-kernel": "~2.3", 1778 | "symfony/monolog-bridge": "~2.3" 1779 | }, 1780 | "require-dev": { 1781 | "symfony/console": "~2.3", 1782 | "symfony/yaml": "~2.3" 1783 | }, 1784 | "type": "symfony-bundle", 1785 | "extra": { 1786 | "branch-alias": { 1787 | "dev-master": "2.7.x-dev" 1788 | } 1789 | }, 1790 | "autoload": { 1791 | "psr-4": { 1792 | "Symfony\\Bundle\\MonologBundle\\": "" 1793 | } 1794 | }, 1795 | "notification-url": "https://packagist.org/downloads/", 1796 | "license": [ 1797 | "MIT" 1798 | ], 1799 | "authors": [ 1800 | { 1801 | "name": "Symfony Community", 1802 | "homepage": "http://symfony.com/contributors" 1803 | }, 1804 | { 1805 | "name": "Fabien Potencier", 1806 | "email": "fabien@symfony.com" 1807 | } 1808 | ], 1809 | "description": "Symfony MonologBundle", 1810 | "homepage": "http://symfony.com", 1811 | "keywords": [ 1812 | "log", 1813 | "logging" 1814 | ], 1815 | "time": "2015-01-04 20:21:17" 1816 | }, 1817 | { 1818 | "name": "symfony/swiftmailer-bundle", 1819 | "version": "v2.3.8", 1820 | "source": { 1821 | "type": "git", 1822 | "url": "https://github.com/symfony/SwiftmailerBundle.git", 1823 | "reference": "970b13d01871207e81d17b17ddda025e7e21e797" 1824 | }, 1825 | "dist": { 1826 | "type": "zip", 1827 | "url": "https://api.github.com/repos/symfony/SwiftmailerBundle/zipball/970b13d01871207e81d17b17ddda025e7e21e797", 1828 | "reference": "970b13d01871207e81d17b17ddda025e7e21e797", 1829 | "shasum": "" 1830 | }, 1831 | "require": { 1832 | "php": ">=5.3.2", 1833 | "swiftmailer/swiftmailer": ">=4.2.0,~5.0", 1834 | "symfony/swiftmailer-bridge": "~2.1" 1835 | }, 1836 | "require-dev": { 1837 | "symfony/config": "~2.1", 1838 | "symfony/dependency-injection": "~2.1", 1839 | "symfony/http-kernel": "~2.1", 1840 | "symfony/yaml": "~2.1" 1841 | }, 1842 | "suggest": { 1843 | "psr/log": "Allows logging" 1844 | }, 1845 | "type": "symfony-bundle", 1846 | "extra": { 1847 | "branch-alias": { 1848 | "dev-master": "2.3-dev" 1849 | } 1850 | }, 1851 | "autoload": { 1852 | "psr-4": { 1853 | "Symfony\\Bundle\\SwiftmailerBundle\\": "" 1854 | } 1855 | }, 1856 | "notification-url": "https://packagist.org/downloads/", 1857 | "license": [ 1858 | "MIT" 1859 | ], 1860 | "authors": [ 1861 | { 1862 | "name": "Symfony Community", 1863 | "homepage": "http://symfony.com/contributors" 1864 | }, 1865 | { 1866 | "name": "Fabien Potencier", 1867 | "email": "fabien@symfony.com" 1868 | } 1869 | ], 1870 | "description": "Symfony SwiftmailerBundle", 1871 | "homepage": "http://symfony.com", 1872 | "time": "2014-12-01 17:44:50" 1873 | }, 1874 | { 1875 | "name": "symfony/symfony", 1876 | "version": "v2.6.9", 1877 | "source": { 1878 | "type": "git", 1879 | "url": "https://github.com/symfony/symfony.git", 1880 | "reference": "b06539573ccf64dd3a62852685f052553d02c5ba" 1881 | }, 1882 | "dist": { 1883 | "type": "zip", 1884 | "url": "https://api.github.com/repos/symfony/symfony/zipball/b06539573ccf64dd3a62852685f052553d02c5ba", 1885 | "reference": "b06539573ccf64dd3a62852685f052553d02c5ba", 1886 | "shasum": "" 1887 | }, 1888 | "require": { 1889 | "doctrine/common": "~2.3", 1890 | "php": ">=5.3.3", 1891 | "psr/log": "~1.0", 1892 | "twig/twig": "~1.12,>=1.12.3" 1893 | }, 1894 | "replace": { 1895 | "symfony/browser-kit": "self.version", 1896 | "symfony/class-loader": "self.version", 1897 | "symfony/config": "self.version", 1898 | "symfony/console": "self.version", 1899 | "symfony/css-selector": "self.version", 1900 | "symfony/debug": "self.version", 1901 | "symfony/debug-bundle": "self.version", 1902 | "symfony/dependency-injection": "self.version", 1903 | "symfony/doctrine-bridge": "self.version", 1904 | "symfony/dom-crawler": "self.version", 1905 | "symfony/event-dispatcher": "self.version", 1906 | "symfony/expression-language": "self.version", 1907 | "symfony/filesystem": "self.version", 1908 | "symfony/finder": "self.version", 1909 | "symfony/form": "self.version", 1910 | "symfony/framework-bundle": "self.version", 1911 | "symfony/http-foundation": "self.version", 1912 | "symfony/http-kernel": "self.version", 1913 | "symfony/intl": "self.version", 1914 | "symfony/locale": "self.version", 1915 | "symfony/monolog-bridge": "self.version", 1916 | "symfony/options-resolver": "self.version", 1917 | "symfony/process": "self.version", 1918 | "symfony/propel1-bridge": "self.version", 1919 | "symfony/property-access": "self.version", 1920 | "symfony/proxy-manager-bridge": "self.version", 1921 | "symfony/routing": "self.version", 1922 | "symfony/security": "self.version", 1923 | "symfony/security-acl": "self.version", 1924 | "symfony/security-bundle": "self.version", 1925 | "symfony/security-core": "self.version", 1926 | "symfony/security-csrf": "self.version", 1927 | "symfony/security-http": "self.version", 1928 | "symfony/serializer": "self.version", 1929 | "symfony/stopwatch": "self.version", 1930 | "symfony/swiftmailer-bridge": "self.version", 1931 | "symfony/templating": "self.version", 1932 | "symfony/translation": "self.version", 1933 | "symfony/twig-bridge": "self.version", 1934 | "symfony/twig-bundle": "self.version", 1935 | "symfony/validator": "self.version", 1936 | "symfony/var-dumper": "self.version", 1937 | "symfony/web-profiler-bundle": "self.version", 1938 | "symfony/yaml": "self.version" 1939 | }, 1940 | "require-dev": { 1941 | "doctrine/data-fixtures": "1.0.*", 1942 | "doctrine/dbal": "~2.2", 1943 | "doctrine/doctrine-bundle": "~1.2", 1944 | "doctrine/orm": "~2.2,>=2.2.3", 1945 | "egulias/email-validator": "~1.2", 1946 | "ircmaxell/password-compat": "~1.0", 1947 | "monolog/monolog": "~1.11", 1948 | "ocramius/proxy-manager": "~0.4|~1.0", 1949 | "propel/propel1": "~1.6", 1950 | "symfony/phpunit-bridge": "~2.7" 1951 | }, 1952 | "type": "library", 1953 | "extra": { 1954 | "branch-alias": { 1955 | "dev-master": "2.6-dev" 1956 | } 1957 | }, 1958 | "autoload": { 1959 | "psr-0": { 1960 | "Symfony\\": "src/" 1961 | }, 1962 | "classmap": [ 1963 | "src/Symfony/Component/HttpFoundation/Resources/stubs", 1964 | "src/Symfony/Component/Intl/Resources/stubs" 1965 | ], 1966 | "files": [ 1967 | "src/Symfony/Component/Intl/Resources/stubs/functions.php" 1968 | ] 1969 | }, 1970 | "notification-url": "https://packagist.org/downloads/", 1971 | "license": [ 1972 | "MIT" 1973 | ], 1974 | "authors": [ 1975 | { 1976 | "name": "Fabien Potencier", 1977 | "email": "fabien@symfony.com" 1978 | }, 1979 | { 1980 | "name": "Symfony Community", 1981 | "homepage": "https://symfony.com/contributors" 1982 | } 1983 | ], 1984 | "description": "The Symfony PHP framework", 1985 | "homepage": "https://symfony.com", 1986 | "keywords": [ 1987 | "framework" 1988 | ], 1989 | "time": "2015-05-29 22:55:07" 1990 | }, 1991 | { 1992 | "name": "twig/extensions", 1993 | "version": "v1.2.0", 1994 | "source": { 1995 | "type": "git", 1996 | "url": "https://github.com/twigphp/Twig-extensions.git", 1997 | "reference": "8cf4b9fe04077bd54fc73f4fde83347040c3b8cd" 1998 | }, 1999 | "dist": { 2000 | "type": "zip", 2001 | "url": "https://api.github.com/repos/twigphp/Twig-extensions/zipball/8cf4b9fe04077bd54fc73f4fde83347040c3b8cd", 2002 | "reference": "8cf4b9fe04077bd54fc73f4fde83347040c3b8cd", 2003 | "shasum": "" 2004 | }, 2005 | "require": { 2006 | "twig/twig": "~1.12" 2007 | }, 2008 | "require-dev": { 2009 | "symfony/translation": "~2.3" 2010 | }, 2011 | "suggest": { 2012 | "symfony/translation": "Allow the time_diff output to be translated" 2013 | }, 2014 | "type": "library", 2015 | "extra": { 2016 | "branch-alias": { 2017 | "dev-master": "1.2.x-dev" 2018 | } 2019 | }, 2020 | "autoload": { 2021 | "psr-0": { 2022 | "Twig_Extensions_": "lib/" 2023 | } 2024 | }, 2025 | "notification-url": "https://packagist.org/downloads/", 2026 | "license": [ 2027 | "MIT" 2028 | ], 2029 | "authors": [ 2030 | { 2031 | "name": "Fabien Potencier", 2032 | "email": "fabien@symfony.com" 2033 | } 2034 | ], 2035 | "description": "Common additional features for Twig that do not directly belong in core", 2036 | "homepage": "http://twig.sensiolabs.org/doc/extensions/index.html", 2037 | "keywords": [ 2038 | "i18n", 2039 | "text" 2040 | ], 2041 | "time": "2014-10-30 14:30:03" 2042 | }, 2043 | { 2044 | "name": "twig/twig", 2045 | "version": "v1.18.2", 2046 | "source": { 2047 | "type": "git", 2048 | "url": "https://github.com/twigphp/Twig.git", 2049 | "reference": "e8e6575abf6102af53ec283f7f14b89e304fa602" 2050 | }, 2051 | "dist": { 2052 | "type": "zip", 2053 | "url": "https://api.github.com/repos/twigphp/Twig/zipball/e8e6575abf6102af53ec283f7f14b89e304fa602", 2054 | "reference": "e8e6575abf6102af53ec283f7f14b89e304fa602", 2055 | "shasum": "" 2056 | }, 2057 | "require": { 2058 | "php": ">=5.2.7" 2059 | }, 2060 | "type": "library", 2061 | "extra": { 2062 | "branch-alias": { 2063 | "dev-master": "1.18-dev" 2064 | } 2065 | }, 2066 | "autoload": { 2067 | "psr-0": { 2068 | "Twig_": "lib/" 2069 | } 2070 | }, 2071 | "notification-url": "https://packagist.org/downloads/", 2072 | "license": [ 2073 | "BSD-3-Clause" 2074 | ], 2075 | "authors": [ 2076 | { 2077 | "name": "Fabien Potencier", 2078 | "email": "fabien@symfony.com", 2079 | "homepage": "http://fabien.potencier.org", 2080 | "role": "Lead Developer" 2081 | }, 2082 | { 2083 | "name": "Armin Ronacher", 2084 | "email": "armin.ronacher@active-4.com", 2085 | "role": "Project Founder" 2086 | }, 2087 | { 2088 | "name": "Twig Team", 2089 | "homepage": "http://twig.sensiolabs.org/contributors", 2090 | "role": "Contributors" 2091 | } 2092 | ], 2093 | "description": "Twig, the flexible, fast, and secure template language for PHP", 2094 | "homepage": "http://twig.sensiolabs.org", 2095 | "keywords": [ 2096 | "templating" 2097 | ], 2098 | "time": "2015-06-06 23:31:24" 2099 | }, 2100 | { 2101 | "name": "vich/uploader-bundle", 2102 | "version": "v0.14.0", 2103 | "source": { 2104 | "type": "git", 2105 | "url": "https://github.com/dustin10/VichUploaderBundle.git", 2106 | "reference": "65d244d5e6ef62b4978585cdeb283b6cdab05f6b" 2107 | }, 2108 | "dist": { 2109 | "type": "zip", 2110 | "url": "https://api.github.com/repos/dustin10/VichUploaderBundle/zipball/65d244d5e6ef62b4978585cdeb283b6cdab05f6b", 2111 | "reference": "65d244d5e6ef62b4978585cdeb283b6cdab05f6b", 2112 | "shasum": "" 2113 | }, 2114 | "require": { 2115 | "jms/metadata": "~1.5", 2116 | "php": ">=5.3.2", 2117 | "symfony/finder": ">=2.0", 2118 | "symfony/framework-bundle": "~2.3", 2119 | "symfony/property-access": "~2.3" 2120 | }, 2121 | "require-dev": { 2122 | "doctrine/doctrine-bundle": "*", 2123 | "doctrine/mongodb-odm": "@dev", 2124 | "doctrine/orm": "*", 2125 | "knplabs/knp-gaufrette-bundle": "*", 2126 | "matthiasnoback/symfony-dependency-injection-test": "0.*", 2127 | "mikey179/vfsstream": "~1.0", 2128 | "oneup/flysystem-bundle": "dev-master", 2129 | "phpunit/phpunit": "~4.0", 2130 | "symfony/symfony": "*" 2131 | }, 2132 | "suggest": { 2133 | "doctrine/doctrine-bundle": "*", 2134 | "doctrine/mongodb-odm-bundle": "*", 2135 | "doctrine/orm": ">=2.2.3", 2136 | "doctrine/phpcr-odm": "~1.0", 2137 | "knplabs/knp-gaufrette-bundle": "*", 2138 | "symfony/yaml": "@stable", 2139 | "willdurand/propel-eventdispatcher-bundle": ">=1.2" 2140 | }, 2141 | "type": "symfony-bundle", 2142 | "extra": { 2143 | "branch-alias": { 2144 | "dev-master": "1.0.x-dev" 2145 | } 2146 | }, 2147 | "autoload": { 2148 | "psr-4": { 2149 | "Vich\\UploaderBundle\\": "", 2150 | "Vich\\TestBundle\\": "Tests/Fixtures/App/src/TestBundle/" 2151 | } 2152 | }, 2153 | "notification-url": "https://packagist.org/downloads/", 2154 | "license": [ 2155 | "MIT" 2156 | ], 2157 | "authors": [ 2158 | { 2159 | "name": "Dustin Dobervich", 2160 | "email": "ddobervich@gmail.com" 2161 | } 2162 | ], 2163 | "description": "Ease file uploads attached to entities", 2164 | "homepage": "https://github.com/dustin10/VichUploaderBundle", 2165 | "keywords": [ 2166 | "file uploads", 2167 | "upload" 2168 | ], 2169 | "time": "2014-12-12 10:26:46" 2170 | } 2171 | ], 2172 | "packages-dev": [ 2173 | { 2174 | "name": "sensio/generator-bundle", 2175 | "version": "v2.5.3", 2176 | "target-dir": "Sensio/Bundle/GeneratorBundle", 2177 | "source": { 2178 | "type": "git", 2179 | "url": "https://github.com/sensiolabs/SensioGeneratorBundle.git", 2180 | "reference": "e50108c2133ee5c9c484555faed50c17a61221d3" 2181 | }, 2182 | "dist": { 2183 | "type": "zip", 2184 | "url": "https://api.github.com/repos/sensiolabs/SensioGeneratorBundle/zipball/e50108c2133ee5c9c484555faed50c17a61221d3", 2185 | "reference": "e50108c2133ee5c9c484555faed50c17a61221d3", 2186 | "shasum": "" 2187 | }, 2188 | "require": { 2189 | "symfony/console": "~2.5", 2190 | "symfony/framework-bundle": "~2.2" 2191 | }, 2192 | "require-dev": { 2193 | "doctrine/orm": "~2.2,>=2.2.3", 2194 | "symfony/doctrine-bridge": "~2.2", 2195 | "twig/twig": "~1.11" 2196 | }, 2197 | "type": "symfony-bundle", 2198 | "extra": { 2199 | "branch-alias": { 2200 | "dev-master": "2.5.x-dev" 2201 | } 2202 | }, 2203 | "autoload": { 2204 | "psr-0": { 2205 | "Sensio\\Bundle\\GeneratorBundle": "" 2206 | } 2207 | }, 2208 | "notification-url": "https://packagist.org/downloads/", 2209 | "license": [ 2210 | "MIT" 2211 | ], 2212 | "authors": [ 2213 | { 2214 | "name": "Fabien Potencier", 2215 | "email": "fabien@symfony.com" 2216 | } 2217 | ], 2218 | "description": "This bundle generates code for you", 2219 | "time": "2015-03-17 06:36:52" 2220 | } 2221 | ], 2222 | "aliases": [], 2223 | "minimum-stability": "stable", 2224 | "stability-flags": { 2225 | "friendsofsymfony/user-bundle": 20, 2226 | "stof/doctrine-extensions-bundle": 20 2227 | }, 2228 | "prefer-stable": false, 2229 | "prefer-lowest": false, 2230 | "platform": { 2231 | "php": ">=5.3.3" 2232 | }, 2233 | "platform-dev": [] 2234 | } 2235 | --------------------------------------------------------------------------------