├── .gitignore ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── app.yaml ├── app ├── AppCache.php ├── AppKernel.php ├── Resources │ └── views │ │ ├── base.html.twig │ │ └── default │ │ └── index.html.twig ├── cache │ └── .gitkeep ├── config │ ├── config.yml │ ├── parameters.yml.dist │ ├── routing.yml │ ├── security.yml │ └── services.yml └── console ├── composer.json ├── composer.lock ├── scripts ├── deploy.php └── server.php ├── src └── AppEngine │ ├── Cache │ └── Adapter │ │ └── MemcachedAdapter.php │ ├── HelloWorldBundle │ ├── AppEngineHelloWorldBundle.php │ ├── Controller │ │ └── DefaultController.php │ └── Tests │ │ └── Controller │ │ └── DefaultControllerTest.php │ └── Twig │ └── Environment.php └── web └── app.php /.gitignore: -------------------------------------------------------------------------------- 1 | /web/bundles/ 2 | /app/bootstrap.php.cache 3 | /app/cache/* 4 | /app/config/parameters.yml 5 | /app/logs/* 6 | !app/cache/.gitkeep 7 | !app/logs/.gitkeep 8 | /app/phpunit.xml 9 | /build/ 10 | /vendor/ 11 | /bin/ 12 | /composer.phar 13 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # How to become a contributor and submit your own code 2 | 3 | ## Contributor License Agreements 4 | 5 | We'd love to accept your patches! Before we can take them, we have to jump a couple of legal hurdles. 6 | 7 | Please fill out either the individual or corporate Contributor License Agreement (CLA). 8 | 9 | * If you are an individual writing original source code and you're sure you own the intellectual property, then you'll need to sign an [individual CLA](http://code.google.com/legal/individual-cla-v1.0.html). 10 | * If you work for a company that wants to allow you to contribute your work, then you'll need to sign a [corporate CLA](http://code.google.com/legal/corporate-cla-v1.0.html). 11 | 12 | Follow either of the two links above to access the appropriate CLA and instructions for how to sign and return it. Once we receive it, we'll be able to accept your pull requests. 13 | 14 | ## Contributing A Patch 15 | 16 | 1. Submit an issue describing your proposed change to the repo in question. 17 | 1. The repo owner will respond to your issue promptly. 18 | 1. If your proposed change is accepted, and you haven't already done so, sign a Contributor License Agreement (see details above). 19 | 1. Fork the desired repo, develop and test your code changes. 20 | 1. Submit a pull request. 21 | 22 | ## Protocols for Collaborative Development 23 | 24 | Please read [this doc](docs/devel/collab.md) for information on how we're running development for the project. 25 | Also take a look at the [development guide](docs/devel/development.md) for information on how to set up your environment, run tests, manage dependencies, etc. 26 | 27 | ## Adding dependencies 28 | 29 | If your patch depends on new packages, add that package with [`godep`](https://github.com/tools/godep). Follow the [instructions to add a dependency](docs/devel/development.md#godep-and-dependency-management). 30 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | 203 | 204 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![status: inactive](https://img.shields.io/badge/status-inactive-red.svg) 2 | 3 | This project is no longer actively developed or maintained. 4 | 5 | Please check out [Running Symfony on App Engine for PHP 7.2][symfony-appengine-php72] instead. 6 | 7 | ## [Symfony][symfony] for [Google App Engine][appengine] 8 | This repository contains a Symfony app for Google App Engine, based off the Symfony Standard Edition. 9 | 10 | See [How to Run Symfony Hello World on App Engine Standard Environment][symfony_community] 11 | for the full tutorial. 12 | 13 | [symfony_community]: https://cloud.google.com/community/tutorials/symfony-hello-world-app-engine 14 | 15 | ## Installation 16 | 17 | Install this via [composer][composer]. Follow the 18 | [installation instructions][composer_install] if you do not already have 19 | composer installed. 20 | 21 | Once composer is installed, execute the following command to create this project: 22 | 23 | ```sh 24 | composer create-project google/appengine-symfony-starter-project 25 | ``` 26 | 27 | ## Set Up 28 | 29 | To run the starter app, be sure to authorize gcloud for your project. 30 | 31 | ``` 32 | gcloud auth login 33 | ``` 34 | 35 | ## Run Locally 36 | 37 | ```sh 38 | composer run-script server --timeout=0 39 | ``` 40 | 41 | Now browse to `http://localhost:8080` in your browser to view your running 42 | application. This builds the cache for the "dev" environment and runs the 43 | `dev_appserver.py` script, which will be available if you've installed the 44 | [Google App Engine Launcher][app_engine_launcher]. The command for this is 45 | defined in `scripts/deploy.php`. 46 | 47 | ## Deployment 48 | 49 | Deploy to your App Engine instance by running the following command: 50 | 51 | ```sh 52 | composer run-script deploy --timeout=0 53 | ``` 54 | 55 | This builds the cache for the "prod" environment and runs `gcloud app deploy`, 56 | which will be available if you've installed the 57 | [Google Cloud SDK][gcloud]. The command for this is defined in 58 | `scripts/deploy.php`. 59 | 60 | > See also the [Symfony Hello World][gcp_symfony_hello] tutorial 61 | 62 | ## Using Twig 63 | 64 | It should be noted this example application uses a subclass of `Twig_Environment`, 65 | defined in `src/Twig/Environment.php` and configured in `app/config/services.yml`. 66 | The reason for this subclass is to customize the `getOptionsHash` method. Without 67 | this, the cache cannot be warmed up outside of the PHP version being used in App 68 | Engine. 69 | 70 | ## Troubleshooting 71 | 72 | 1. If Composer fails to download the dependencies, make sure that your local PHP installation 73 | satisfies Composer's [system requirements][composer_reqs]. Specifically, [cURL][curl] support is 74 | required. 75 | 76 | 1. If you see errors about missing the default Cloud Storage bucket, follow the 77 | [cloud integration instructions][gcs_setup] to create a default bucket for your project. 78 | 79 | ## Contributing 80 | Have a patch that will benefit this project? Awesome! Follow these steps to have it accepted. 81 | 82 | 1. Please sign our [Contributor License Agreement](CONTRIBUTING.md). 83 | 1. Fork this Git repository and make your changes. 84 | 1. Create a Pull Request 85 | 1. Incorporate review feedback to your changes. 86 | 1. Accepted! 87 | 88 | ## License 89 | All files in this repository are under the [MIT License](LICENSE) unless noted otherwise. 90 | 91 | [symfony]: http://symfony.com/ 92 | [appengine]: https://cloud.google.com/appengine/ 93 | [app_engine_launcher]: https://cloud.google.com/appengine/docs/standard/php/download 94 | [gcloud]: https://cloud.google.com/sdk/docs/ 95 | [composer]: https://getcomposer.org 96 | [composer_install]: https://getcomposer.org/doc/00-intro.md 97 | [gcs]: https://cloud.google.com/appengine/docs/php/googlestorage/setup 98 | [gcp_symfony_hello]: https://cloud.google.com/appengine/docs/php/symfony-hello-world 99 | [composer_reqs]: https://getcomposer.org/doc/00-intro.md#system-requirements 100 | [curl]: http://php.net/manual/en/book.curl.php 101 | [gcs_setup]: https://cloud.google.com/appengine/docs/php/googlestorage/setup 102 | [symfony-appengine-php72]: https://cloud.google.com/community/tutorials/run-symfony-on-appengine-standard 103 | -------------------------------------------------------------------------------- /app.yaml: -------------------------------------------------------------------------------- 1 | # Copyright 2015 Google Inc. All Rights Reserved. 2 | runtime: php55 3 | api_version: 1 4 | threadsafe: true 5 | 6 | handlers: 7 | # tell appengine where our static assets live 8 | - url: /bundles 9 | static_dir: web/bundles 10 | 11 | # the symfony front controller 12 | - url: /.* 13 | script: web/app.php 14 | 15 | # [START env_vars] 16 | env_variables: 17 | SYMFONY_ENV: prod 18 | # [END env_vars] 19 | 20 | # Do not deploy bundle tests 21 | skip_files: 22 | - (.*/)?Tests\/(.*) 23 | -------------------------------------------------------------------------------- /app/AppCache.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file at https://github.com/symfony/symfony-standard/blob/2.8/LICENSE 10 | */ 11 | 12 | require_once __DIR__.'/AppKernel.php'; 13 | 14 | use Symfony\Bundle\FrameworkBundle\HttpCache\HttpCache; 15 | 16 | class AppCache extends HttpCache 17 | { 18 | } 19 | -------------------------------------------------------------------------------- /app/AppKernel.php: -------------------------------------------------------------------------------- 1 | onAppEngine() ? 'prod' : 'dev'; 29 | } 30 | parent::__construct($env, $debug); 31 | } 32 | 33 | public function registerBundles() 34 | { 35 | $bundles = array( 36 | new Symfony\Bundle\FrameworkBundle\FrameworkBundle(), 37 | new Symfony\Bundle\SecurityBundle\SecurityBundle(), 38 | new Symfony\Bundle\TwigBundle\TwigBundle(), 39 | new Symfony\Bundle\MonologBundle\MonologBundle(), 40 | new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(), 41 | new AppEngine\HelloWorldBundle\AppEngineHelloWorldBundle(), 42 | ); 43 | 44 | if (in_array($this->getEnvironment(), array('dev', 'test'))) { 45 | $bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle(); 46 | $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle(); 47 | $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle(); 48 | } 49 | 50 | return $bundles; 51 | } 52 | 53 | public function registerContainerConfiguration(LoaderInterface $loader) 54 | { 55 | $loader->load(__DIR__.'/config/config.yml'); 56 | } 57 | 58 | private function onAppEngine() 59 | { 60 | return isset($_SERVER['SERVER_SOFTWARE']) 61 | && 0 === strpos($_SERVER['SERVER_SOFTWARE'], 'Google App Engine'); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /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/Resources/views/default/index.html.twig: -------------------------------------------------------------------------------- 1 | {% extends 'base.html.twig' %} 2 | 3 | {% block body %} 4 | Homepage. 5 | {% endblock %} 6 | -------------------------------------------------------------------------------- /app/cache/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GoogleCloudPlatform/appengine-symfony-starter-project/a792dda9d0c8cb684b710ebf7ca11909e4b4ce8e/app/cache/.gitkeep -------------------------------------------------------------------------------- /app/config/config.yml: -------------------------------------------------------------------------------- 1 | # Copyright 2015 Google Inc. All Rights Reserved. 2 | imports: 3 | - { resource: parameters.yml } 4 | - { resource: security.yml } 5 | - { resource: services.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: session.handler.memcache 26 | fragments: ~ 27 | http_method_override: true 28 | 29 | # Twig Configuration 30 | twig: 31 | debug: "%kernel.debug%" 32 | strict_variables: "%kernel.debug%" 33 | 34 | monolog: 35 | handlers: 36 | stdout: 37 | type: syslog 38 | level: warning 39 | -------------------------------------------------------------------------------- /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 | 22 | # If you'd like to use Google Cloud Storage for files and assets, set the 23 | # bucket name here. 24 | google_storage_bucket: YOUR_GCS_BUCKET_NAME 25 | -------------------------------------------------------------------------------- /app/config/routing.yml: -------------------------------------------------------------------------------- 1 | app: 2 | resource: "@AppEngineHelloWorldBundle/Controller/" 3 | type: annotation 4 | -------------------------------------------------------------------------------- /app/config/security.yml: -------------------------------------------------------------------------------- 1 | security: 2 | providers: 3 | in_memory: 4 | memory: ~ 5 | 6 | firewalls: 7 | dev: 8 | pattern: ^/(_(profiler|wdt|error)|css|images|js)/ 9 | security: false 10 | 11 | default: 12 | anonymous: ~ 13 | -------------------------------------------------------------------------------- /app/config/services.yml: -------------------------------------------------------------------------------- 1 | # Learn more about services, parameters and containers at 2 | # http://symfony.com/doc/current/book/service_container.html 3 | parameters: 4 | # parameter_name: value 5 | 6 | services: 7 | memcache: 8 | class: Memcache 9 | session.handler.memcache: 10 | class: Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcacheSessionHandler 11 | arguments: 12 | - "@memcache" 13 | - { prefix: ~, expiretime: ~ } 14 | 15 | # Use a special Memcache Adapter for App Engine because of the differences 16 | # between the Memcache Proxy and an actual Memcache instance. 17 | cache.system: "@cache.adapter.appengine_memcached" 18 | cache.adapter.appengine_memcached: 19 | class: AppEngine\Cache\Adapter\MemcachedAdapter 20 | abstract: true 21 | public: true 22 | tags: 23 | - name: cache.pool 24 | provider: cache.default_memcached_provider 25 | clearer: cache.default_clearer 26 | - name: monolog.logger 27 | channel: cache 28 | arguments: 29 | - ~ # Memcached connection service 30 | - ~ # namespace 31 | - 0 # default lifetime 32 | call: 33 | - method: setLogger 34 | arguemnts: ['@logger'] 35 | 36 | # Uses a twig subclass to avoid cache differences between PHP versions. 37 | # This is required in order to prebuild the cache for App Engine. 38 | twig: 39 | class: AppEngine\Twig\Environment 40 | arguments: 41 | - "@twig.loader" 42 | call: 43 | - method: addGlobal 44 | arguments: [app, "@twig.app_variable"] 45 | - method: addRuntimeLoader 46 | arguments: ["@twig.runtime_loader"] 47 | configurator: ["@twig.configurator.environment", configure] 48 | -------------------------------------------------------------------------------- /app/console: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | 8 | * 9 | * For the full copyright and license information, please view the LICENSE 10 | * file at https://github.com/symfony/symfony-standard/blob/2.8/LICENSE 11 | */ 12 | 13 | // if you don't want to setup permissions the proper way, just uncomment the following PHP line 14 | // read http://symfony.com/doc/current/book/installation.html#configuration-and-setup for more information 15 | //umask(0000); 16 | 17 | set_time_limit(0); 18 | 19 | require_once __DIR__.'/../vendor/autoload.php'; 20 | // require_once __DIR__.'/bootstrap.php.cache'; 21 | require_once __DIR__.'/AppKernel.php'; 22 | 23 | use Symfony\Bundle\FrameworkBundle\Console\Application; 24 | use Symfony\Component\Console\Input\ArgvInput; 25 | use Symfony\Component\Debug\Debug; 26 | 27 | $input = new ArgvInput(); 28 | $env = $input->getParameterOption(array('--env', '-e'), getenv('SYMFONY_ENV') ?: 'dev'); 29 | $debug = getenv('SYMFONY_DEBUG') !== '0' && !$input->hasParameterOption(array('--no-debug', '')) && $env !== 'prod'; 30 | 31 | if ($debug) { 32 | Debug::enable(); 33 | } 34 | 35 | $kernel = new AppKernel($env, $debug); 36 | $application = new Application($kernel); 37 | $application->run($input); 38 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "google/appengine-symfony-starter-project", 3 | "license": "MIT", 4 | "type": "project", 5 | "description": "A Symfony hello world for App Engine", 6 | "keywords": ["google", "appengine", "symfony"], 7 | "homepage": "https://cloud.google.com/appengine/docs/php/symfony-hello-world", 8 | "support": { 9 | "issues": "https://github.com/GoogleCloudPlatform/symfony-helloworld/issues", 10 | "forum": "https://groups.google.com/forum/#!forum/google-appengine" 11 | }, 12 | "autoload": { 13 | "psr-0": { 14 | "": "src/" 15 | } 16 | }, 17 | "require": { 18 | "php": ">=5.5.9", 19 | "symfony/symfony": "3.3.0", 20 | "symfony/console": "^3.2", 21 | "doctrine/annotations": "^1.2", 22 | "sensio/framework-extra-bundle": "^3.0", 23 | "sensio/distribution-bundle": "^5.0", 24 | "symfony/monolog-bundle": "^3.1" 25 | }, 26 | "scripts": { 27 | "post-root-package-install": [ 28 | "SymfonyStandard\\Composer::hookRootPackageInstall" 29 | ], 30 | "post-install-cmd": [ 31 | "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters", 32 | "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap" 33 | ], 34 | "post-update-cmd": [ 35 | "Incenteev\\ParameterHandler\\ScriptHandler::buildParameters", 36 | "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap" 37 | ], 38 | "deploy": "php scripts/deploy.php", 39 | "server": "php scripts/server.php" 40 | }, 41 | "config": { 42 | "bin-dir": "bin" 43 | }, 44 | "extra": { 45 | "symfony-app-dir": "app", 46 | "symfony-web-dir": "web", 47 | "symfony-assets-install": "relative", 48 | "incenteev-parameters": { 49 | "file": "app/config/parameters.yml" 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "f9fb9fa8dba90b26d959f9033f3595fc", 8 | "packages": [ 9 | { 10 | "name": "composer/ca-bundle", 11 | "version": "1.0.7", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/composer/ca-bundle.git", 15 | "reference": "b17e6153cb7f33c7e44eb59578dc12eee5dc8e12" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/composer/ca-bundle/zipball/b17e6153cb7f33c7e44eb59578dc12eee5dc8e12", 20 | "reference": "b17e6153cb7f33c7e44eb59578dc12eee5dc8e12", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "ext-openssl": "*", 25 | "ext-pcre": "*", 26 | "php": "^5.3.2 || ^7.0" 27 | }, 28 | "require-dev": { 29 | "phpunit/phpunit": "^4.5", 30 | "psr/log": "^1.0", 31 | "symfony/process": "^2.5 || ^3.0" 32 | }, 33 | "suggest": { 34 | "symfony/process": "This is necessary to reliably check whether openssl_x509_parse is vulnerable on older php versions, but can be ignored on PHP 5.5.6+" 35 | }, 36 | "type": "library", 37 | "extra": { 38 | "branch-alias": { 39 | "dev-master": "1.x-dev" 40 | } 41 | }, 42 | "autoload": { 43 | "psr-4": { 44 | "Composer\\CaBundle\\": "src" 45 | } 46 | }, 47 | "notification-url": "https://packagist.org/downloads/", 48 | "license": [ 49 | "MIT" 50 | ], 51 | "authors": [ 52 | { 53 | "name": "Jordi Boggiano", 54 | "email": "j.boggiano@seld.be", 55 | "homepage": "http://seld.be" 56 | } 57 | ], 58 | "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", 59 | "keywords": [ 60 | "cabundle", 61 | "cacert", 62 | "certificate", 63 | "ssl", 64 | "tls" 65 | ], 66 | "time": "2017-03-06T11:59:08+00:00" 67 | }, 68 | { 69 | "name": "doctrine/annotations", 70 | "version": "v1.4.0", 71 | "source": { 72 | "type": "git", 73 | "url": "https://github.com/doctrine/annotations.git", 74 | "reference": "54cacc9b81758b14e3ce750f205a393d52339e97" 75 | }, 76 | "dist": { 77 | "type": "zip", 78 | "url": "https://api.github.com/repos/doctrine/annotations/zipball/54cacc9b81758b14e3ce750f205a393d52339e97", 79 | "reference": "54cacc9b81758b14e3ce750f205a393d52339e97", 80 | "shasum": "" 81 | }, 82 | "require": { 83 | "doctrine/lexer": "1.*", 84 | "php": "^5.6 || ^7.0" 85 | }, 86 | "require-dev": { 87 | "doctrine/cache": "1.*", 88 | "phpunit/phpunit": "^5.7" 89 | }, 90 | "type": "library", 91 | "extra": { 92 | "branch-alias": { 93 | "dev-master": "1.4.x-dev" 94 | } 95 | }, 96 | "autoload": { 97 | "psr-4": { 98 | "Doctrine\\Common\\Annotations\\": "lib/Doctrine/Common/Annotations" 99 | } 100 | }, 101 | "notification-url": "https://packagist.org/downloads/", 102 | "license": [ 103 | "MIT" 104 | ], 105 | "authors": [ 106 | { 107 | "name": "Roman Borschel", 108 | "email": "roman@code-factory.org" 109 | }, 110 | { 111 | "name": "Benjamin Eberlei", 112 | "email": "kontakt@beberlei.de" 113 | }, 114 | { 115 | "name": "Guilherme Blanco", 116 | "email": "guilhermeblanco@gmail.com" 117 | }, 118 | { 119 | "name": "Jonathan Wage", 120 | "email": "jonwage@gmail.com" 121 | }, 122 | { 123 | "name": "Johannes Schmitt", 124 | "email": "schmittjoh@gmail.com" 125 | } 126 | ], 127 | "description": "Docblock Annotations Parser", 128 | "homepage": "http://www.doctrine-project.org", 129 | "keywords": [ 130 | "annotations", 131 | "docblock", 132 | "parser" 133 | ], 134 | "time": "2017-02-24T16:22:25+00:00" 135 | }, 136 | { 137 | "name": "doctrine/cache", 138 | "version": "v1.6.1", 139 | "source": { 140 | "type": "git", 141 | "url": "https://github.com/doctrine/cache.git", 142 | "reference": "b6f544a20f4807e81f7044d31e679ccbb1866dc3" 143 | }, 144 | "dist": { 145 | "type": "zip", 146 | "url": "https://api.github.com/repos/doctrine/cache/zipball/b6f544a20f4807e81f7044d31e679ccbb1866dc3", 147 | "reference": "b6f544a20f4807e81f7044d31e679ccbb1866dc3", 148 | "shasum": "" 149 | }, 150 | "require": { 151 | "php": "~5.5|~7.0" 152 | }, 153 | "conflict": { 154 | "doctrine/common": ">2.2,<2.4" 155 | }, 156 | "require-dev": { 157 | "phpunit/phpunit": "~4.8|~5.0", 158 | "predis/predis": "~1.0", 159 | "satooshi/php-coveralls": "~0.6" 160 | }, 161 | "type": "library", 162 | "extra": { 163 | "branch-alias": { 164 | "dev-master": "1.6.x-dev" 165 | } 166 | }, 167 | "autoload": { 168 | "psr-4": { 169 | "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" 170 | } 171 | }, 172 | "notification-url": "https://packagist.org/downloads/", 173 | "license": [ 174 | "MIT" 175 | ], 176 | "authors": [ 177 | { 178 | "name": "Roman Borschel", 179 | "email": "roman@code-factory.org" 180 | }, 181 | { 182 | "name": "Benjamin Eberlei", 183 | "email": "kontakt@beberlei.de" 184 | }, 185 | { 186 | "name": "Guilherme Blanco", 187 | "email": "guilhermeblanco@gmail.com" 188 | }, 189 | { 190 | "name": "Jonathan Wage", 191 | "email": "jonwage@gmail.com" 192 | }, 193 | { 194 | "name": "Johannes Schmitt", 195 | "email": "schmittjoh@gmail.com" 196 | } 197 | ], 198 | "description": "Caching library offering an object-oriented API for many cache backends", 199 | "homepage": "http://www.doctrine-project.org", 200 | "keywords": [ 201 | "cache", 202 | "caching" 203 | ], 204 | "time": "2016-10-29T11:16:17+00:00" 205 | }, 206 | { 207 | "name": "doctrine/collections", 208 | "version": "v1.4.0", 209 | "source": { 210 | "type": "git", 211 | "url": "https://github.com/doctrine/collections.git", 212 | "reference": "1a4fb7e902202c33cce8c55989b945612943c2ba" 213 | }, 214 | "dist": { 215 | "type": "zip", 216 | "url": "https://api.github.com/repos/doctrine/collections/zipball/1a4fb7e902202c33cce8c55989b945612943c2ba", 217 | "reference": "1a4fb7e902202c33cce8c55989b945612943c2ba", 218 | "shasum": "" 219 | }, 220 | "require": { 221 | "php": "^5.6 || ^7.0" 222 | }, 223 | "require-dev": { 224 | "doctrine/coding-standard": "~0.1@dev", 225 | "phpunit/phpunit": "^5.7" 226 | }, 227 | "type": "library", 228 | "extra": { 229 | "branch-alias": { 230 | "dev-master": "1.3.x-dev" 231 | } 232 | }, 233 | "autoload": { 234 | "psr-0": { 235 | "Doctrine\\Common\\Collections\\": "lib/" 236 | } 237 | }, 238 | "notification-url": "https://packagist.org/downloads/", 239 | "license": [ 240 | "MIT" 241 | ], 242 | "authors": [ 243 | { 244 | "name": "Roman Borschel", 245 | "email": "roman@code-factory.org" 246 | }, 247 | { 248 | "name": "Benjamin Eberlei", 249 | "email": "kontakt@beberlei.de" 250 | }, 251 | { 252 | "name": "Guilherme Blanco", 253 | "email": "guilhermeblanco@gmail.com" 254 | }, 255 | { 256 | "name": "Jonathan Wage", 257 | "email": "jonwage@gmail.com" 258 | }, 259 | { 260 | "name": "Johannes Schmitt", 261 | "email": "schmittjoh@gmail.com" 262 | } 263 | ], 264 | "description": "Collections Abstraction library", 265 | "homepage": "http://www.doctrine-project.org", 266 | "keywords": [ 267 | "array", 268 | "collections", 269 | "iterator" 270 | ], 271 | "time": "2017-01-03T10:49:41+00:00" 272 | }, 273 | { 274 | "name": "doctrine/common", 275 | "version": "v2.7.2", 276 | "source": { 277 | "type": "git", 278 | "url": "https://github.com/doctrine/common.git", 279 | "reference": "930297026c8009a567ac051fd545bf6124150347" 280 | }, 281 | "dist": { 282 | "type": "zip", 283 | "url": "https://api.github.com/repos/doctrine/common/zipball/930297026c8009a567ac051fd545bf6124150347", 284 | "reference": "930297026c8009a567ac051fd545bf6124150347", 285 | "shasum": "" 286 | }, 287 | "require": { 288 | "doctrine/annotations": "1.*", 289 | "doctrine/cache": "1.*", 290 | "doctrine/collections": "1.*", 291 | "doctrine/inflector": "1.*", 292 | "doctrine/lexer": "1.*", 293 | "php": "~5.6|~7.0" 294 | }, 295 | "require-dev": { 296 | "phpunit/phpunit": "^5.4.6" 297 | }, 298 | "type": "library", 299 | "extra": { 300 | "branch-alias": { 301 | "dev-master": "2.7.x-dev" 302 | } 303 | }, 304 | "autoload": { 305 | "psr-4": { 306 | "Doctrine\\Common\\": "lib/Doctrine/Common" 307 | } 308 | }, 309 | "notification-url": "https://packagist.org/downloads/", 310 | "license": [ 311 | "MIT" 312 | ], 313 | "authors": [ 314 | { 315 | "name": "Roman Borschel", 316 | "email": "roman@code-factory.org" 317 | }, 318 | { 319 | "name": "Benjamin Eberlei", 320 | "email": "kontakt@beberlei.de" 321 | }, 322 | { 323 | "name": "Guilherme Blanco", 324 | "email": "guilhermeblanco@gmail.com" 325 | }, 326 | { 327 | "name": "Jonathan Wage", 328 | "email": "jonwage@gmail.com" 329 | }, 330 | { 331 | "name": "Johannes Schmitt", 332 | "email": "schmittjoh@gmail.com" 333 | } 334 | ], 335 | "description": "Common Library for Doctrine projects", 336 | "homepage": "http://www.doctrine-project.org", 337 | "keywords": [ 338 | "annotations", 339 | "collections", 340 | "eventmanager", 341 | "persistence", 342 | "spl" 343 | ], 344 | "time": "2017-01-13T14:02:13+00:00" 345 | }, 346 | { 347 | "name": "doctrine/inflector", 348 | "version": "v1.1.0", 349 | "source": { 350 | "type": "git", 351 | "url": "https://github.com/doctrine/inflector.git", 352 | "reference": "90b2128806bfde671b6952ab8bea493942c1fdae" 353 | }, 354 | "dist": { 355 | "type": "zip", 356 | "url": "https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae", 357 | "reference": "90b2128806bfde671b6952ab8bea493942c1fdae", 358 | "shasum": "" 359 | }, 360 | "require": { 361 | "php": ">=5.3.2" 362 | }, 363 | "require-dev": { 364 | "phpunit/phpunit": "4.*" 365 | }, 366 | "type": "library", 367 | "extra": { 368 | "branch-alias": { 369 | "dev-master": "1.1.x-dev" 370 | } 371 | }, 372 | "autoload": { 373 | "psr-0": { 374 | "Doctrine\\Common\\Inflector\\": "lib/" 375 | } 376 | }, 377 | "notification-url": "https://packagist.org/downloads/", 378 | "license": [ 379 | "MIT" 380 | ], 381 | "authors": [ 382 | { 383 | "name": "Roman Borschel", 384 | "email": "roman@code-factory.org" 385 | }, 386 | { 387 | "name": "Benjamin Eberlei", 388 | "email": "kontakt@beberlei.de" 389 | }, 390 | { 391 | "name": "Guilherme Blanco", 392 | "email": "guilhermeblanco@gmail.com" 393 | }, 394 | { 395 | "name": "Jonathan Wage", 396 | "email": "jonwage@gmail.com" 397 | }, 398 | { 399 | "name": "Johannes Schmitt", 400 | "email": "schmittjoh@gmail.com" 401 | } 402 | ], 403 | "description": "Common String Manipulations with regard to casing and singular/plural rules.", 404 | "homepage": "http://www.doctrine-project.org", 405 | "keywords": [ 406 | "inflection", 407 | "pluralize", 408 | "singularize", 409 | "string" 410 | ], 411 | "time": "2015-11-06T14:35:42+00:00" 412 | }, 413 | { 414 | "name": "doctrine/lexer", 415 | "version": "v1.0.1", 416 | "source": { 417 | "type": "git", 418 | "url": "https://github.com/doctrine/lexer.git", 419 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c" 420 | }, 421 | "dist": { 422 | "type": "zip", 423 | "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c", 424 | "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c", 425 | "shasum": "" 426 | }, 427 | "require": { 428 | "php": ">=5.3.2" 429 | }, 430 | "type": "library", 431 | "extra": { 432 | "branch-alias": { 433 | "dev-master": "1.0.x-dev" 434 | } 435 | }, 436 | "autoload": { 437 | "psr-0": { 438 | "Doctrine\\Common\\Lexer\\": "lib/" 439 | } 440 | }, 441 | "notification-url": "https://packagist.org/downloads/", 442 | "license": [ 443 | "MIT" 444 | ], 445 | "authors": [ 446 | { 447 | "name": "Roman Borschel", 448 | "email": "roman@code-factory.org" 449 | }, 450 | { 451 | "name": "Guilherme Blanco", 452 | "email": "guilhermeblanco@gmail.com" 453 | }, 454 | { 455 | "name": "Johannes Schmitt", 456 | "email": "schmittjoh@gmail.com" 457 | } 458 | ], 459 | "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.", 460 | "homepage": "http://www.doctrine-project.org", 461 | "keywords": [ 462 | "lexer", 463 | "parser" 464 | ], 465 | "time": "2014-09-09T13:34:57+00:00" 466 | }, 467 | { 468 | "name": "fig/link-util", 469 | "version": "1.0.0", 470 | "source": { 471 | "type": "git", 472 | "url": "https://github.com/php-fig/link-util.git", 473 | "reference": "1a07821801a148be4add11ab0603e4af55a72fac" 474 | }, 475 | "dist": { 476 | "type": "zip", 477 | "url": "https://api.github.com/repos/php-fig/link-util/zipball/1a07821801a148be4add11ab0603e4af55a72fac", 478 | "reference": "1a07821801a148be4add11ab0603e4af55a72fac", 479 | "shasum": "" 480 | }, 481 | "require": { 482 | "php": ">=5.5.0", 483 | "psr/link": "~1.0@dev" 484 | }, 485 | "require-dev": { 486 | "phpunit/phpunit": "^5.1", 487 | "squizlabs/php_codesniffer": "^2.3.1" 488 | }, 489 | "type": "library", 490 | "extra": { 491 | "branch-alias": { 492 | "dev-master": "1.0.x-dev" 493 | } 494 | }, 495 | "autoload": { 496 | "psr-4": { 497 | "Fig\\Link\\": "src/" 498 | } 499 | }, 500 | "notification-url": "https://packagist.org/downloads/", 501 | "license": [ 502 | "MIT" 503 | ], 504 | "authors": [ 505 | { 506 | "name": "PHP-FIG", 507 | "homepage": "http://www.php-fig.org/" 508 | } 509 | ], 510 | "description": "Common utility implementations for HTTP links", 511 | "keywords": [ 512 | "http", 513 | "http-link", 514 | "link", 515 | "psr", 516 | "psr-13", 517 | "rest" 518 | ], 519 | "time": "2016-10-17T18:31:11+00:00" 520 | }, 521 | { 522 | "name": "monolog/monolog", 523 | "version": "1.22.1", 524 | "source": { 525 | "type": "git", 526 | "url": "https://github.com/Seldaek/monolog.git", 527 | "reference": "1e044bc4b34e91743943479f1be7a1d5eb93add0" 528 | }, 529 | "dist": { 530 | "type": "zip", 531 | "url": "https://api.github.com/repos/Seldaek/monolog/zipball/1e044bc4b34e91743943479f1be7a1d5eb93add0", 532 | "reference": "1e044bc4b34e91743943479f1be7a1d5eb93add0", 533 | "shasum": "" 534 | }, 535 | "require": { 536 | "php": ">=5.3.0", 537 | "psr/log": "~1.0" 538 | }, 539 | "provide": { 540 | "psr/log-implementation": "1.0.0" 541 | }, 542 | "require-dev": { 543 | "aws/aws-sdk-php": "^2.4.9 || ^3.0", 544 | "doctrine/couchdb": "~1.0@dev", 545 | "graylog2/gelf-php": "~1.0", 546 | "jakub-onderka/php-parallel-lint": "0.9", 547 | "php-amqplib/php-amqplib": "~2.4", 548 | "php-console/php-console": "^3.1.3", 549 | "phpunit/phpunit": "~4.5", 550 | "phpunit/phpunit-mock-objects": "2.3.0", 551 | "ruflin/elastica": ">=0.90 <3.0", 552 | "sentry/sentry": "^0.13", 553 | "swiftmailer/swiftmailer": "~5.3" 554 | }, 555 | "suggest": { 556 | "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", 557 | "doctrine/couchdb": "Allow sending log messages to a CouchDB server", 558 | "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", 559 | "ext-mongo": "Allow sending log messages to a MongoDB server", 560 | "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", 561 | "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver", 562 | "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", 563 | "php-console/php-console": "Allow sending log messages to Google Chrome", 564 | "rollbar/rollbar": "Allow sending log messages to Rollbar", 565 | "ruflin/elastica": "Allow sending log messages to an Elastic Search server", 566 | "sentry/sentry": "Allow sending log messages to a Sentry server" 567 | }, 568 | "type": "library", 569 | "extra": { 570 | "branch-alias": { 571 | "dev-master": "2.0.x-dev" 572 | } 573 | }, 574 | "autoload": { 575 | "psr-4": { 576 | "Monolog\\": "src/Monolog" 577 | } 578 | }, 579 | "notification-url": "https://packagist.org/downloads/", 580 | "license": [ 581 | "MIT" 582 | ], 583 | "authors": [ 584 | { 585 | "name": "Jordi Boggiano", 586 | "email": "j.boggiano@seld.be", 587 | "homepage": "http://seld.be" 588 | } 589 | ], 590 | "description": "Sends your logs to files, sockets, inboxes, databases and various web services", 591 | "homepage": "http://github.com/Seldaek/monolog", 592 | "keywords": [ 593 | "log", 594 | "logging", 595 | "psr-3" 596 | ], 597 | "time": "2017-03-13T07:08:03+00:00" 598 | }, 599 | { 600 | "name": "paragonie/random_compat", 601 | "version": "v2.0.10", 602 | "source": { 603 | "type": "git", 604 | "url": "https://github.com/paragonie/random_compat.git", 605 | "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d" 606 | }, 607 | "dist": { 608 | "type": "zip", 609 | "url": "https://api.github.com/repos/paragonie/random_compat/zipball/634bae8e911eefa89c1abfbf1b66da679ac8f54d", 610 | "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d", 611 | "shasum": "" 612 | }, 613 | "require": { 614 | "php": ">=5.2.0" 615 | }, 616 | "require-dev": { 617 | "phpunit/phpunit": "4.*|5.*" 618 | }, 619 | "suggest": { 620 | "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes." 621 | }, 622 | "type": "library", 623 | "autoload": { 624 | "files": [ 625 | "lib/random.php" 626 | ] 627 | }, 628 | "notification-url": "https://packagist.org/downloads/", 629 | "license": [ 630 | "MIT" 631 | ], 632 | "authors": [ 633 | { 634 | "name": "Paragon Initiative Enterprises", 635 | "email": "security@paragonie.com", 636 | "homepage": "https://paragonie.com" 637 | } 638 | ], 639 | "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", 640 | "keywords": [ 641 | "csprng", 642 | "pseudorandom", 643 | "random" 644 | ], 645 | "time": "2017-03-13T16:27:32+00:00" 646 | }, 647 | { 648 | "name": "psr/cache", 649 | "version": "1.0.1", 650 | "source": { 651 | "type": "git", 652 | "url": "https://github.com/php-fig/cache.git", 653 | "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8" 654 | }, 655 | "dist": { 656 | "type": "zip", 657 | "url": "https://api.github.com/repos/php-fig/cache/zipball/d11b50ad223250cf17b86e38383413f5a6764bf8", 658 | "reference": "d11b50ad223250cf17b86e38383413f5a6764bf8", 659 | "shasum": "" 660 | }, 661 | "require": { 662 | "php": ">=5.3.0" 663 | }, 664 | "type": "library", 665 | "extra": { 666 | "branch-alias": { 667 | "dev-master": "1.0.x-dev" 668 | } 669 | }, 670 | "autoload": { 671 | "psr-4": { 672 | "Psr\\Cache\\": "src/" 673 | } 674 | }, 675 | "notification-url": "https://packagist.org/downloads/", 676 | "license": [ 677 | "MIT" 678 | ], 679 | "authors": [ 680 | { 681 | "name": "PHP-FIG", 682 | "homepage": "http://www.php-fig.org/" 683 | } 684 | ], 685 | "description": "Common interface for caching libraries", 686 | "keywords": [ 687 | "cache", 688 | "psr", 689 | "psr-6" 690 | ], 691 | "time": "2016-08-06T20:24:11+00:00" 692 | }, 693 | { 694 | "name": "psr/container", 695 | "version": "1.0.0", 696 | "source": { 697 | "type": "git", 698 | "url": "https://github.com/php-fig/container.git", 699 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" 700 | }, 701 | "dist": { 702 | "type": "zip", 703 | "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 704 | "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", 705 | "shasum": "" 706 | }, 707 | "require": { 708 | "php": ">=5.3.0" 709 | }, 710 | "type": "library", 711 | "extra": { 712 | "branch-alias": { 713 | "dev-master": "1.0.x-dev" 714 | } 715 | }, 716 | "autoload": { 717 | "psr-4": { 718 | "Psr\\Container\\": "src/" 719 | } 720 | }, 721 | "notification-url": "https://packagist.org/downloads/", 722 | "license": [ 723 | "MIT" 724 | ], 725 | "authors": [ 726 | { 727 | "name": "PHP-FIG", 728 | "homepage": "http://www.php-fig.org/" 729 | } 730 | ], 731 | "description": "Common Container Interface (PHP FIG PSR-11)", 732 | "homepage": "https://github.com/php-fig/container", 733 | "keywords": [ 734 | "PSR-11", 735 | "container", 736 | "container-interface", 737 | "container-interop", 738 | "psr" 739 | ], 740 | "time": "2017-02-14T16:28:37+00:00" 741 | }, 742 | { 743 | "name": "psr/link", 744 | "version": "1.0.0", 745 | "source": { 746 | "type": "git", 747 | "url": "https://github.com/php-fig/link.git", 748 | "reference": "eea8e8662d5cd3ae4517c9b864493f59fca95562" 749 | }, 750 | "dist": { 751 | "type": "zip", 752 | "url": "https://api.github.com/repos/php-fig/link/zipball/eea8e8662d5cd3ae4517c9b864493f59fca95562", 753 | "reference": "eea8e8662d5cd3ae4517c9b864493f59fca95562", 754 | "shasum": "" 755 | }, 756 | "require": { 757 | "php": ">=5.3.0" 758 | }, 759 | "type": "library", 760 | "extra": { 761 | "branch-alias": { 762 | "dev-master": "1.0.x-dev" 763 | } 764 | }, 765 | "autoload": { 766 | "psr-4": { 767 | "Psr\\Link\\": "src/" 768 | } 769 | }, 770 | "notification-url": "https://packagist.org/downloads/", 771 | "license": [ 772 | "MIT" 773 | ], 774 | "authors": [ 775 | { 776 | "name": "PHP-FIG", 777 | "homepage": "http://www.php-fig.org/" 778 | } 779 | ], 780 | "description": "Common interfaces for HTTP links", 781 | "keywords": [ 782 | "http", 783 | "http-link", 784 | "link", 785 | "psr", 786 | "psr-13", 787 | "rest" 788 | ], 789 | "time": "2016-10-28T16:06:13+00:00" 790 | }, 791 | { 792 | "name": "psr/log", 793 | "version": "1.0.2", 794 | "source": { 795 | "type": "git", 796 | "url": "https://github.com/php-fig/log.git", 797 | "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" 798 | }, 799 | "dist": { 800 | "type": "zip", 801 | "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", 802 | "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", 803 | "shasum": "" 804 | }, 805 | "require": { 806 | "php": ">=5.3.0" 807 | }, 808 | "type": "library", 809 | "extra": { 810 | "branch-alias": { 811 | "dev-master": "1.0.x-dev" 812 | } 813 | }, 814 | "autoload": { 815 | "psr-4": { 816 | "Psr\\Log\\": "Psr/Log/" 817 | } 818 | }, 819 | "notification-url": "https://packagist.org/downloads/", 820 | "license": [ 821 | "MIT" 822 | ], 823 | "authors": [ 824 | { 825 | "name": "PHP-FIG", 826 | "homepage": "http://www.php-fig.org/" 827 | } 828 | ], 829 | "description": "Common interface for logging libraries", 830 | "homepage": "https://github.com/php-fig/log", 831 | "keywords": [ 832 | "log", 833 | "psr", 834 | "psr-3" 835 | ], 836 | "time": "2016-10-10T12:19:37+00:00" 837 | }, 838 | { 839 | "name": "psr/simple-cache", 840 | "version": "1.0.0", 841 | "source": { 842 | "type": "git", 843 | "url": "https://github.com/php-fig/simple-cache.git", 844 | "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24" 845 | }, 846 | "dist": { 847 | "type": "zip", 848 | "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24", 849 | "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24", 850 | "shasum": "" 851 | }, 852 | "require": { 853 | "php": ">=5.3.0" 854 | }, 855 | "type": "library", 856 | "extra": { 857 | "branch-alias": { 858 | "dev-master": "1.0.x-dev" 859 | } 860 | }, 861 | "autoload": { 862 | "psr-4": { 863 | "Psr\\SimpleCache\\": "src/" 864 | } 865 | }, 866 | "notification-url": "https://packagist.org/downloads/", 867 | "license": [ 868 | "MIT" 869 | ], 870 | "authors": [ 871 | { 872 | "name": "PHP-FIG", 873 | "homepage": "http://www.php-fig.org/" 874 | } 875 | ], 876 | "description": "Common interfaces for simple caching", 877 | "keywords": [ 878 | "cache", 879 | "caching", 880 | "psr", 881 | "psr-16", 882 | "simple-cache" 883 | ], 884 | "time": "2017-01-02T13:31:39+00:00" 885 | }, 886 | { 887 | "name": "sensio/distribution-bundle", 888 | "version": "v5.0.20", 889 | "source": { 890 | "type": "git", 891 | "url": "https://github.com/sensiolabs/SensioDistributionBundle.git", 892 | "reference": "4b019d4c0bd64438c42e4b6b0726085b409be8d9" 893 | }, 894 | "dist": { 895 | "type": "zip", 896 | "url": "https://api.github.com/repos/sensiolabs/SensioDistributionBundle/zipball/4b019d4c0bd64438c42e4b6b0726085b409be8d9", 897 | "reference": "4b019d4c0bd64438c42e4b6b0726085b409be8d9", 898 | "shasum": "" 899 | }, 900 | "require": { 901 | "php": ">=5.3.9", 902 | "sensiolabs/security-checker": "~3.0|~4.0", 903 | "symfony/class-loader": "~2.3|~3.0", 904 | "symfony/config": "~2.3|~3.0", 905 | "symfony/dependency-injection": "~2.3|~3.0", 906 | "symfony/filesystem": "~2.3|~3.0", 907 | "symfony/http-kernel": "~2.3|~3.0", 908 | "symfony/process": "~2.3|~3.0" 909 | }, 910 | "type": "symfony-bundle", 911 | "extra": { 912 | "branch-alias": { 913 | "dev-master": "5.0.x-dev" 914 | } 915 | }, 916 | "autoload": { 917 | "psr-4": { 918 | "Sensio\\Bundle\\DistributionBundle\\": "" 919 | } 920 | }, 921 | "notification-url": "https://packagist.org/downloads/", 922 | "license": [ 923 | "MIT" 924 | ], 925 | "authors": [ 926 | { 927 | "name": "Fabien Potencier", 928 | "email": "fabien@symfony.com" 929 | } 930 | ], 931 | "description": "Base bundle for Symfony Distributions", 932 | "keywords": [ 933 | "configuration", 934 | "distribution" 935 | ], 936 | "time": "2017-05-11T16:21:03+00:00" 937 | }, 938 | { 939 | "name": "sensio/framework-extra-bundle", 940 | "version": "v3.0.26", 941 | "source": { 942 | "type": "git", 943 | "url": "https://github.com/sensiolabs/SensioFrameworkExtraBundle.git", 944 | "reference": "6d6cbe971554f0a2cc84965850481eb04a2a0059" 945 | }, 946 | "dist": { 947 | "type": "zip", 948 | "url": "https://api.github.com/repos/sensiolabs/SensioFrameworkExtraBundle/zipball/6d6cbe971554f0a2cc84965850481eb04a2a0059", 949 | "reference": "6d6cbe971554f0a2cc84965850481eb04a2a0059", 950 | "shasum": "" 951 | }, 952 | "require": { 953 | "doctrine/common": "~2.2", 954 | "symfony/dependency-injection": "~2.3|~3.0", 955 | "symfony/framework-bundle": "~2.3|~3.0" 956 | }, 957 | "require-dev": { 958 | "doctrine/doctrine-bundle": "~1.5", 959 | "doctrine/orm": "~2.4,>=2.4.5", 960 | "symfony/asset": "~2.7|~3.0", 961 | "symfony/browser-kit": "~2.3|~3.0", 962 | "symfony/dom-crawler": "~2.3|~3.0", 963 | "symfony/expression-language": "~2.4|~3.0", 964 | "symfony/finder": "~2.3|~3.0", 965 | "symfony/phpunit-bridge": "~3.2", 966 | "symfony/psr-http-message-bridge": "^0.3", 967 | "symfony/security-bundle": "~2.4|~3.0", 968 | "symfony/templating": "~2.3|~3.0", 969 | "symfony/translation": "~2.3|~3.0", 970 | "symfony/twig-bundle": "~2.3|~3.0", 971 | "symfony/yaml": "~2.3|~3.0", 972 | "twig/twig": "~1.12|~2.0", 973 | "zendframework/zend-diactoros": "^1.3" 974 | }, 975 | "suggest": { 976 | "symfony/expression-language": "", 977 | "symfony/psr-http-message-bridge": "To use the PSR-7 converters", 978 | "symfony/security-bundle": "" 979 | }, 980 | "type": "symfony-bundle", 981 | "extra": { 982 | "branch-alias": { 983 | "dev-master": "3.0.x-dev" 984 | } 985 | }, 986 | "autoload": { 987 | "psr-4": { 988 | "Sensio\\Bundle\\FrameworkExtraBundle\\": "" 989 | } 990 | }, 991 | "notification-url": "https://packagist.org/downloads/", 992 | "license": [ 993 | "MIT" 994 | ], 995 | "authors": [ 996 | { 997 | "name": "Fabien Potencier", 998 | "email": "fabien@symfony.com" 999 | } 1000 | ], 1001 | "description": "This bundle provides a way to configure your controllers with annotations", 1002 | "keywords": [ 1003 | "annotations", 1004 | "controllers" 1005 | ], 1006 | "time": "2017-05-11T17:01:57+00:00" 1007 | }, 1008 | { 1009 | "name": "sensiolabs/security-checker", 1010 | "version": "v4.0.4", 1011 | "source": { 1012 | "type": "git", 1013 | "url": "https://github.com/sensiolabs/security-checker.git", 1014 | "reference": "9e69eddf3bc49d1ee5c7908564da3141796d4bbc" 1015 | }, 1016 | "dist": { 1017 | "type": "zip", 1018 | "url": "https://api.github.com/repos/sensiolabs/security-checker/zipball/9e69eddf3bc49d1ee5c7908564da3141796d4bbc", 1019 | "reference": "9e69eddf3bc49d1ee5c7908564da3141796d4bbc", 1020 | "shasum": "" 1021 | }, 1022 | "require": { 1023 | "composer/ca-bundle": "^1.0", 1024 | "symfony/console": "~2.7|~3.0" 1025 | }, 1026 | "bin": [ 1027 | "security-checker" 1028 | ], 1029 | "type": "library", 1030 | "extra": { 1031 | "branch-alias": { 1032 | "dev-master": "4.0-dev" 1033 | } 1034 | }, 1035 | "autoload": { 1036 | "psr-0": { 1037 | "SensioLabs\\Security": "" 1038 | } 1039 | }, 1040 | "notification-url": "https://packagist.org/downloads/", 1041 | "license": [ 1042 | "MIT" 1043 | ], 1044 | "authors": [ 1045 | { 1046 | "name": "Fabien Potencier", 1047 | "email": "fabien.potencier@gmail.com" 1048 | } 1049 | ], 1050 | "description": "A security checker for your composer.lock", 1051 | "time": "2017-03-31T14:50:32+00:00" 1052 | }, 1053 | { 1054 | "name": "symfony/monolog-bundle", 1055 | "version": "v3.1.0", 1056 | "source": { 1057 | "type": "git", 1058 | "url": "https://github.com/symfony/monolog-bundle.git", 1059 | "reference": "6f96c7dbb6b2ef70b307a1a6f897153cbca3da47" 1060 | }, 1061 | "dist": { 1062 | "type": "zip", 1063 | "url": "https://api.github.com/repos/symfony/monolog-bundle/zipball/6f96c7dbb6b2ef70b307a1a6f897153cbca3da47", 1064 | "reference": "6f96c7dbb6b2ef70b307a1a6f897153cbca3da47", 1065 | "shasum": "" 1066 | }, 1067 | "require": { 1068 | "monolog/monolog": "~1.22", 1069 | "php": ">=5.3.2", 1070 | "symfony/config": "~2.7|~3.0", 1071 | "symfony/dependency-injection": "~2.7|~3.0", 1072 | "symfony/http-kernel": "~2.7|~3.0", 1073 | "symfony/monolog-bridge": "~2.7|~3.0" 1074 | }, 1075 | "require-dev": { 1076 | "phpunit/phpunit": "^4.8", 1077 | "symfony/console": "~2.3|~3.0", 1078 | "symfony/yaml": "~2.3|~3.0" 1079 | }, 1080 | "type": "symfony-bundle", 1081 | "extra": { 1082 | "branch-alias": { 1083 | "dev-master": "3.x-dev" 1084 | } 1085 | }, 1086 | "autoload": { 1087 | "psr-4": { 1088 | "Symfony\\Bundle\\MonologBundle\\": "" 1089 | } 1090 | }, 1091 | "notification-url": "https://packagist.org/downloads/", 1092 | "license": [ 1093 | "MIT" 1094 | ], 1095 | "authors": [ 1096 | { 1097 | "name": "Symfony Community", 1098 | "homepage": "http://symfony.com/contributors" 1099 | }, 1100 | { 1101 | "name": "Fabien Potencier", 1102 | "email": "fabien@symfony.com" 1103 | } 1104 | ], 1105 | "description": "Symfony MonologBundle", 1106 | "homepage": "http://symfony.com", 1107 | "keywords": [ 1108 | "log", 1109 | "logging" 1110 | ], 1111 | "time": "2017-03-26T11:55:59+00:00" 1112 | }, 1113 | { 1114 | "name": "symfony/polyfill-intl-icu", 1115 | "version": "v1.3.0", 1116 | "source": { 1117 | "type": "git", 1118 | "url": "https://github.com/symfony/polyfill-intl-icu.git", 1119 | "reference": "2d6e2b20d457603eefb6e614286c22efca30fdb4" 1120 | }, 1121 | "dist": { 1122 | "type": "zip", 1123 | "url": "https://api.github.com/repos/symfony/polyfill-intl-icu/zipball/2d6e2b20d457603eefb6e614286c22efca30fdb4", 1124 | "reference": "2d6e2b20d457603eefb6e614286c22efca30fdb4", 1125 | "shasum": "" 1126 | }, 1127 | "require": { 1128 | "php": ">=5.3.3", 1129 | "symfony/intl": "~2.3|~3.0" 1130 | }, 1131 | "suggest": { 1132 | "ext-intl": "For best performance" 1133 | }, 1134 | "type": "library", 1135 | "extra": { 1136 | "branch-alias": { 1137 | "dev-master": "1.3-dev" 1138 | } 1139 | }, 1140 | "autoload": { 1141 | "files": [ 1142 | "bootstrap.php" 1143 | ] 1144 | }, 1145 | "notification-url": "https://packagist.org/downloads/", 1146 | "license": [ 1147 | "MIT" 1148 | ], 1149 | "authors": [ 1150 | { 1151 | "name": "Nicolas Grekas", 1152 | "email": "p@tchwork.com" 1153 | }, 1154 | { 1155 | "name": "Symfony Community", 1156 | "homepage": "https://symfony.com/contributors" 1157 | } 1158 | ], 1159 | "description": "Symfony polyfill for intl's ICU-related data and classes", 1160 | "homepage": "https://symfony.com", 1161 | "keywords": [ 1162 | "compatibility", 1163 | "icu", 1164 | "intl", 1165 | "polyfill", 1166 | "portable", 1167 | "shim" 1168 | ], 1169 | "time": "2016-11-14T01:06:16+00:00" 1170 | }, 1171 | { 1172 | "name": "symfony/polyfill-mbstring", 1173 | "version": "v1.3.0", 1174 | "source": { 1175 | "type": "git", 1176 | "url": "https://github.com/symfony/polyfill-mbstring.git", 1177 | "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4" 1178 | }, 1179 | "dist": { 1180 | "type": "zip", 1181 | "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/e79d363049d1c2128f133a2667e4f4190904f7f4", 1182 | "reference": "e79d363049d1c2128f133a2667e4f4190904f7f4", 1183 | "shasum": "" 1184 | }, 1185 | "require": { 1186 | "php": ">=5.3.3" 1187 | }, 1188 | "suggest": { 1189 | "ext-mbstring": "For best performance" 1190 | }, 1191 | "type": "library", 1192 | "extra": { 1193 | "branch-alias": { 1194 | "dev-master": "1.3-dev" 1195 | } 1196 | }, 1197 | "autoload": { 1198 | "psr-4": { 1199 | "Symfony\\Polyfill\\Mbstring\\": "" 1200 | }, 1201 | "files": [ 1202 | "bootstrap.php" 1203 | ] 1204 | }, 1205 | "notification-url": "https://packagist.org/downloads/", 1206 | "license": [ 1207 | "MIT" 1208 | ], 1209 | "authors": [ 1210 | { 1211 | "name": "Nicolas Grekas", 1212 | "email": "p@tchwork.com" 1213 | }, 1214 | { 1215 | "name": "Symfony Community", 1216 | "homepage": "https://symfony.com/contributors" 1217 | } 1218 | ], 1219 | "description": "Symfony polyfill for the Mbstring extension", 1220 | "homepage": "https://symfony.com", 1221 | "keywords": [ 1222 | "compatibility", 1223 | "mbstring", 1224 | "polyfill", 1225 | "portable", 1226 | "shim" 1227 | ], 1228 | "time": "2016-11-14T01:06:16+00:00" 1229 | }, 1230 | { 1231 | "name": "symfony/polyfill-php56", 1232 | "version": "v1.3.0", 1233 | "source": { 1234 | "type": "git", 1235 | "url": "https://github.com/symfony/polyfill-php56.git", 1236 | "reference": "1dd42b9b89556f18092f3d1ada22cb05ac85383c" 1237 | }, 1238 | "dist": { 1239 | "type": "zip", 1240 | "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/1dd42b9b89556f18092f3d1ada22cb05ac85383c", 1241 | "reference": "1dd42b9b89556f18092f3d1ada22cb05ac85383c", 1242 | "shasum": "" 1243 | }, 1244 | "require": { 1245 | "php": ">=5.3.3", 1246 | "symfony/polyfill-util": "~1.0" 1247 | }, 1248 | "type": "library", 1249 | "extra": { 1250 | "branch-alias": { 1251 | "dev-master": "1.3-dev" 1252 | } 1253 | }, 1254 | "autoload": { 1255 | "psr-4": { 1256 | "Symfony\\Polyfill\\Php56\\": "" 1257 | }, 1258 | "files": [ 1259 | "bootstrap.php" 1260 | ] 1261 | }, 1262 | "notification-url": "https://packagist.org/downloads/", 1263 | "license": [ 1264 | "MIT" 1265 | ], 1266 | "authors": [ 1267 | { 1268 | "name": "Nicolas Grekas", 1269 | "email": "p@tchwork.com" 1270 | }, 1271 | { 1272 | "name": "Symfony Community", 1273 | "homepage": "https://symfony.com/contributors" 1274 | } 1275 | ], 1276 | "description": "Symfony polyfill backporting some PHP 5.6+ features to lower PHP versions", 1277 | "homepage": "https://symfony.com", 1278 | "keywords": [ 1279 | "compatibility", 1280 | "polyfill", 1281 | "portable", 1282 | "shim" 1283 | ], 1284 | "time": "2016-11-14T01:06:16+00:00" 1285 | }, 1286 | { 1287 | "name": "symfony/polyfill-php70", 1288 | "version": "v1.3.0", 1289 | "source": { 1290 | "type": "git", 1291 | "url": "https://github.com/symfony/polyfill-php70.git", 1292 | "reference": "13ce343935f0f91ca89605a2f6ca6f5c2f3faac2" 1293 | }, 1294 | "dist": { 1295 | "type": "zip", 1296 | "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/13ce343935f0f91ca89605a2f6ca6f5c2f3faac2", 1297 | "reference": "13ce343935f0f91ca89605a2f6ca6f5c2f3faac2", 1298 | "shasum": "" 1299 | }, 1300 | "require": { 1301 | "paragonie/random_compat": "~1.0|~2.0", 1302 | "php": ">=5.3.3" 1303 | }, 1304 | "type": "library", 1305 | "extra": { 1306 | "branch-alias": { 1307 | "dev-master": "1.3-dev" 1308 | } 1309 | }, 1310 | "autoload": { 1311 | "psr-4": { 1312 | "Symfony\\Polyfill\\Php70\\": "" 1313 | }, 1314 | "files": [ 1315 | "bootstrap.php" 1316 | ], 1317 | "classmap": [ 1318 | "Resources/stubs" 1319 | ] 1320 | }, 1321 | "notification-url": "https://packagist.org/downloads/", 1322 | "license": [ 1323 | "MIT" 1324 | ], 1325 | "authors": [ 1326 | { 1327 | "name": "Nicolas Grekas", 1328 | "email": "p@tchwork.com" 1329 | }, 1330 | { 1331 | "name": "Symfony Community", 1332 | "homepage": "https://symfony.com/contributors" 1333 | } 1334 | ], 1335 | "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", 1336 | "homepage": "https://symfony.com", 1337 | "keywords": [ 1338 | "compatibility", 1339 | "polyfill", 1340 | "portable", 1341 | "shim" 1342 | ], 1343 | "time": "2016-11-14T01:06:16+00:00" 1344 | }, 1345 | { 1346 | "name": "symfony/polyfill-util", 1347 | "version": "v1.3.0", 1348 | "source": { 1349 | "type": "git", 1350 | "url": "https://github.com/symfony/polyfill-util.git", 1351 | "reference": "746bce0fca664ac0a575e465f65c6643faddf7fb" 1352 | }, 1353 | "dist": { 1354 | "type": "zip", 1355 | "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/746bce0fca664ac0a575e465f65c6643faddf7fb", 1356 | "reference": "746bce0fca664ac0a575e465f65c6643faddf7fb", 1357 | "shasum": "" 1358 | }, 1359 | "require": { 1360 | "php": ">=5.3.3" 1361 | }, 1362 | "type": "library", 1363 | "extra": { 1364 | "branch-alias": { 1365 | "dev-master": "1.3-dev" 1366 | } 1367 | }, 1368 | "autoload": { 1369 | "psr-4": { 1370 | "Symfony\\Polyfill\\Util\\": "" 1371 | } 1372 | }, 1373 | "notification-url": "https://packagist.org/downloads/", 1374 | "license": [ 1375 | "MIT" 1376 | ], 1377 | "authors": [ 1378 | { 1379 | "name": "Nicolas Grekas", 1380 | "email": "p@tchwork.com" 1381 | }, 1382 | { 1383 | "name": "Symfony Community", 1384 | "homepage": "https://symfony.com/contributors" 1385 | } 1386 | ], 1387 | "description": "Symfony utilities for portability of PHP codes", 1388 | "homepage": "https://symfony.com", 1389 | "keywords": [ 1390 | "compat", 1391 | "compatibility", 1392 | "polyfill", 1393 | "shim" 1394 | ], 1395 | "time": "2016-11-14T01:06:16+00:00" 1396 | }, 1397 | { 1398 | "name": "symfony/symfony", 1399 | "version": "v3.3.0", 1400 | "source": { 1401 | "type": "git", 1402 | "url": "https://github.com/symfony/symfony.git", 1403 | "reference": "5a7e31c48e7cd4831efa409fffb661beb9995174" 1404 | }, 1405 | "dist": { 1406 | "type": "zip", 1407 | "url": "https://api.github.com/repos/symfony/symfony/zipball/5a7e31c48e7cd4831efa409fffb661beb9995174", 1408 | "reference": "5a7e31c48e7cd4831efa409fffb661beb9995174", 1409 | "shasum": "" 1410 | }, 1411 | "require": { 1412 | "doctrine/common": "~2.4", 1413 | "fig/link-util": "^1.0", 1414 | "php": ">=5.5.9", 1415 | "psr/cache": "~1.0", 1416 | "psr/container": "^1.0", 1417 | "psr/link": "^1.0", 1418 | "psr/log": "~1.0", 1419 | "psr/simple-cache": "^1.0", 1420 | "symfony/polyfill-intl-icu": "~1.0", 1421 | "symfony/polyfill-mbstring": "~1.0", 1422 | "symfony/polyfill-php56": "~1.0", 1423 | "symfony/polyfill-php70": "~1.0", 1424 | "symfony/polyfill-util": "~1.0", 1425 | "twig/twig": "~1.32|~2.2" 1426 | }, 1427 | "conflict": { 1428 | "phpdocumentor/reflection-docblock": "<3.0", 1429 | "phpdocumentor/type-resolver": "<0.2.0", 1430 | "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" 1431 | }, 1432 | "provide": { 1433 | "psr/cache-implementation": "1.0", 1434 | "psr/container-implementation": "1.0", 1435 | "psr/simple-cache-implementation": "1.0" 1436 | }, 1437 | "replace": { 1438 | "symfony/asset": "self.version", 1439 | "symfony/browser-kit": "self.version", 1440 | "symfony/cache": "self.version", 1441 | "symfony/class-loader": "self.version", 1442 | "symfony/config": "self.version", 1443 | "symfony/console": "self.version", 1444 | "symfony/css-selector": "self.version", 1445 | "symfony/debug": "self.version", 1446 | "symfony/debug-bundle": "self.version", 1447 | "symfony/dependency-injection": "self.version", 1448 | "symfony/doctrine-bridge": "self.version", 1449 | "symfony/dom-crawler": "self.version", 1450 | "symfony/dotenv": "self.version", 1451 | "symfony/event-dispatcher": "self.version", 1452 | "symfony/expression-language": "self.version", 1453 | "symfony/filesystem": "self.version", 1454 | "symfony/finder": "self.version", 1455 | "symfony/form": "self.version", 1456 | "symfony/framework-bundle": "self.version", 1457 | "symfony/http-foundation": "self.version", 1458 | "symfony/http-kernel": "self.version", 1459 | "symfony/inflector": "self.version", 1460 | "symfony/intl": "self.version", 1461 | "symfony/ldap": "self.version", 1462 | "symfony/monolog-bridge": "self.version", 1463 | "symfony/options-resolver": "self.version", 1464 | "symfony/process": "self.version", 1465 | "symfony/property-access": "self.version", 1466 | "symfony/property-info": "self.version", 1467 | "symfony/proxy-manager-bridge": "self.version", 1468 | "symfony/routing": "self.version", 1469 | "symfony/security": "self.version", 1470 | "symfony/security-bundle": "self.version", 1471 | "symfony/security-core": "self.version", 1472 | "symfony/security-csrf": "self.version", 1473 | "symfony/security-guard": "self.version", 1474 | "symfony/security-http": "self.version", 1475 | "symfony/serializer": "self.version", 1476 | "symfony/stopwatch": "self.version", 1477 | "symfony/templating": "self.version", 1478 | "symfony/translation": "self.version", 1479 | "symfony/twig-bridge": "self.version", 1480 | "symfony/twig-bundle": "self.version", 1481 | "symfony/validator": "self.version", 1482 | "symfony/var-dumper": "self.version", 1483 | "symfony/web-link": "self.version", 1484 | "symfony/web-profiler-bundle": "self.version", 1485 | "symfony/web-server-bundle": "self.version", 1486 | "symfony/workflow": "self.version", 1487 | "symfony/yaml": "self.version" 1488 | }, 1489 | "require-dev": { 1490 | "cache/integration-tests": "dev-master", 1491 | "doctrine/cache": "~1.6", 1492 | "doctrine/data-fixtures": "1.0.*", 1493 | "doctrine/dbal": "~2.4", 1494 | "doctrine/doctrine-bundle": "~1.4", 1495 | "doctrine/orm": "~2.4,>=2.4.5", 1496 | "egulias/email-validator": "~1.2,>=1.2.8|~2.0", 1497 | "monolog/monolog": "~1.11", 1498 | "ocramius/proxy-manager": "~0.4|~1.0|~2.0", 1499 | "phpdocumentor/reflection-docblock": "^3.0", 1500 | "predis/predis": "~1.0", 1501 | "sensio/framework-extra-bundle": "^3.0.2", 1502 | "symfony/phpunit-bridge": "~3.2", 1503 | "symfony/polyfill-apcu": "~1.1", 1504 | "symfony/security-acl": "~2.8|~3.0" 1505 | }, 1506 | "type": "library", 1507 | "extra": { 1508 | "branch-alias": { 1509 | "dev-master": "3.3-dev" 1510 | } 1511 | }, 1512 | "autoload": { 1513 | "psr-4": { 1514 | "Symfony\\Bridge\\Doctrine\\": "src/Symfony/Bridge/Doctrine/", 1515 | "Symfony\\Bridge\\Monolog\\": "src/Symfony/Bridge/Monolog/", 1516 | "Symfony\\Bridge\\ProxyManager\\": "src/Symfony/Bridge/ProxyManager/", 1517 | "Symfony\\Bridge\\Swiftmailer\\": "src/Symfony/Bridge/Swiftmailer/", 1518 | "Symfony\\Bridge\\Twig\\": "src/Symfony/Bridge/Twig/", 1519 | "Symfony\\Bundle\\": "src/Symfony/Bundle/", 1520 | "Symfony\\Component\\": "src/Symfony/Component/" 1521 | }, 1522 | "classmap": [ 1523 | "src/Symfony/Component/Intl/Resources/stubs" 1524 | ], 1525 | "exclude-from-classmap": [ 1526 | "**/Tests/" 1527 | ] 1528 | }, 1529 | "notification-url": "https://packagist.org/downloads/", 1530 | "license": [ 1531 | "MIT" 1532 | ], 1533 | "authors": [ 1534 | { 1535 | "name": "Fabien Potencier", 1536 | "email": "fabien@symfony.com" 1537 | }, 1538 | { 1539 | "name": "Symfony Community", 1540 | "homepage": "https://symfony.com/contributors" 1541 | } 1542 | ], 1543 | "description": "The Symfony PHP framework", 1544 | "homepage": "https://symfony.com", 1545 | "keywords": [ 1546 | "framework" 1547 | ], 1548 | "time": "2017-05-29T21:02:32+00:00" 1549 | }, 1550 | { 1551 | "name": "twig/twig", 1552 | "version": "v1.34.3", 1553 | "source": { 1554 | "type": "git", 1555 | "url": "https://github.com/twigphp/Twig.git", 1556 | "reference": "451c6f4197e113e24c1c85bc3fc8c2d77adeff2e" 1557 | }, 1558 | "dist": { 1559 | "type": "zip", 1560 | "url": "https://api.github.com/repos/twigphp/Twig/zipball/451c6f4197e113e24c1c85bc3fc8c2d77adeff2e", 1561 | "reference": "451c6f4197e113e24c1c85bc3fc8c2d77adeff2e", 1562 | "shasum": "" 1563 | }, 1564 | "require": { 1565 | "php": ">=5.3.3" 1566 | }, 1567 | "require-dev": { 1568 | "psr/container": "^1.0", 1569 | "symfony/debug": "~2.7", 1570 | "symfony/phpunit-bridge": "~3.3@dev" 1571 | }, 1572 | "type": "library", 1573 | "extra": { 1574 | "branch-alias": { 1575 | "dev-master": "1.34-dev" 1576 | } 1577 | }, 1578 | "autoload": { 1579 | "psr-0": { 1580 | "Twig_": "lib/" 1581 | }, 1582 | "psr-4": { 1583 | "Twig\\": "src/" 1584 | } 1585 | }, 1586 | "notification-url": "https://packagist.org/downloads/", 1587 | "license": [ 1588 | "BSD-3-Clause" 1589 | ], 1590 | "authors": [ 1591 | { 1592 | "name": "Fabien Potencier", 1593 | "email": "fabien@symfony.com", 1594 | "homepage": "http://fabien.potencier.org", 1595 | "role": "Lead Developer" 1596 | }, 1597 | { 1598 | "name": "Armin Ronacher", 1599 | "email": "armin.ronacher@active-4.com", 1600 | "role": "Project Founder" 1601 | }, 1602 | { 1603 | "name": "Twig Team", 1604 | "homepage": "http://twig.sensiolabs.org/contributors", 1605 | "role": "Contributors" 1606 | } 1607 | ], 1608 | "description": "Twig, the flexible, fast, and secure template language for PHP", 1609 | "homepage": "http://twig.sensiolabs.org", 1610 | "keywords": [ 1611 | "templating" 1612 | ], 1613 | "time": "2017-06-07T18:45:17+00:00" 1614 | } 1615 | ], 1616 | "packages-dev": [], 1617 | "aliases": [], 1618 | "minimum-stability": "stable", 1619 | "stability-flags": [], 1620 | "prefer-stable": false, 1621 | "prefer-lowest": false, 1622 | "platform": { 1623 | "php": ">=5.5.9" 1624 | }, 1625 | "platform-dev": [] 1626 | } 1627 | -------------------------------------------------------------------------------- /scripts/deploy.php: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env php 2 | 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 | namespace AppEngine\Cache\Adapter; 13 | 14 | use Symfony\Component\Cache\Adapter\AbstractAdapter; 15 | use Symfony\Component\Cache\Traits\MemcachedTrait; 16 | 17 | class MemcachedAdapter extends AbstractAdapter 18 | { 19 | use MemcachedTrait; 20 | 21 | protected $maxIdLength = 250; 22 | 23 | public function __construct(\Memcached $client, $namespace = '', $defaultLifetime = 0) 24 | { 25 | $this->init($client, $namespace, $defaultLifetime); 26 | } 27 | 28 | public static function isSupported() 29 | { 30 | // we have to override this for App engine because the Memcache Proxy does not 31 | // support a version number. 32 | // @see Symfony\Component\Cache\Traits\MemcacheTrait::isSupported 33 | return extension_loaded('memcached'); 34 | } 35 | 36 | private function init(\Memcached $client, $namespace, $defaultLifetime) 37 | { 38 | if (!static::isSupported()) { 39 | throw new CacheException('Memcached >= 2.2.0 is required'); 40 | } 41 | // We have to override this for App engine because the OPT_SERIALIZER option 42 | // is not set, which throws an exception in the built-in handler. 43 | // @see Symfony\Component\Cache\Traits\MemcacheTrait::init 44 | $this->maxIdLength -= strlen($client->getOption(\Memcached::OPT_PREFIX_KEY)); 45 | 46 | parent::__construct($namespace, $defaultLifetime); 47 | $this->client = $client; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/AppEngine/HelloWorldBundle/AppEngineHelloWorldBundle.php: -------------------------------------------------------------------------------- 1 | render('default/index.html.twig'); 33 | } 34 | 35 | /** 36 | * @Route("/storage", name="storage") 37 | */ 38 | public function storageAction() 39 | { 40 | $bucketName = $this->getParameter('google_storage_bucket'); 41 | if ($bucketName == 'YOUR_GCS_BUCKET_NAME') { 42 | throw new \InvalidArgumentException('Change YOUR_GCS_BUCKET_NAME ' 43 | . 'to the name of your Cloud Storage bucket in ' 44 | . '"app/config/parameters.yml"'); 45 | } 46 | $fileUri = sprintf('gs://%s/helloworld.txt', $bucketName, $filename); 47 | if (!file_exists($fileUri)) { 48 | file_put_contents($fileUri, 'Hello World!'); 49 | } 50 | 51 | // Use the Cloud Storage stream wrapper to read the file, a la 52 | // "gs:///" 53 | $this->get('logger')->info('Reading from: '. $fileUri); 54 | return new Response(file_get_contents($fileUri)); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/AppEngine/HelloWorldBundle/Tests/Controller/DefaultControllerTest.php: -------------------------------------------------------------------------------- 1 | request('GET', '/'); 30 | 31 | $this->assertEquals(200, $client->getResponse()->getStatusCode()); 32 | $this->assertTrue($crawler->filter('html:contains("Homepage")')->count() > 0); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/AppEngine/Twig/Environment.php: -------------------------------------------------------------------------------- 1 | getLoader()->getCacheKey($name).$this->getOptionsHash(); 32 | 33 | return $this->templateClassPrefix.hash('sha256', $key).(null === $index ? '' : '_'.$index); 34 | } 35 | 36 | /** 37 | * Uses a twig subclass to avoid cache differences between PHP versions. 38 | * This is required in order to prebuild the cache for App Engine. 39 | */ 40 | private function getOptionsHash() 41 | { 42 | $hashParts = array_merge( 43 | array_keys($this->extensions), 44 | array( 45 | (int) function_exists('twig_template_get_attributes'), 46 | self::VERSION, 47 | (int) $this->debug, 48 | $this->baseTemplateClass, 49 | (int) $this->strictVariables, 50 | ) 51 | ); 52 | return implode(':', $hashParts); 53 | } 54 | } -------------------------------------------------------------------------------- /web/app.php: -------------------------------------------------------------------------------- 1 | unregister(); 29 | $apcLoader->register(true); 30 | } 31 | 32 | require_once __DIR__.'/../app/AppKernel.php'; 33 | 34 | $kernel = new AppKernel(); 35 | //$kernel = new AppCache($kernel); 36 | 37 | // When using the HttpCache, you need to call the method in your front controller instead of relying on the configuration parameter 38 | //Request::enableHttpMethodParameterOverride(); 39 | $request = Request::createFromGlobals(); 40 | $response = $kernel->handle($request); 41 | $response->send(); 42 | $kernel->terminate($request, $response); 43 | --------------------------------------------------------------------------------