diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e984ef6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +web/bundles/ +app/bootstrap.php.cache +app/cache/* +app/logs/* +build/ +vendor +composer.phar diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..8d9c285 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,10 @@ +language: php + +php: + - 5.3.3 + - 5.3 + - 5.4 + +before_script: composer install + +script: phpunit -c app diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..cdffe7a --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2004-2012 Fabien Potencier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..b70ed05 --- /dev/null +++ b/README.md @@ -0,0 +1,176 @@ +Symfony Standard Edition +======================== + +Welcome to the Symfony Standard Edition - a fully-functional Symfony2 +application that you can use as the skeleton for your new applications. + +This document contains information on how to download, install, and start +using Symfony. For a more detailed explanation, see the [Installation][1] +chapter of the Symfony Documentation. + +1) Installing the Standard Edition +---------------------------------- + +When it comes to installing the Symfony Standard Edition, you have the +following options. + +### Use Composer (*recommended*) + +As Symfony uses [Composer][2] to manage its dependencies, the recommended way +to create a new project is to use it. + +If you don't have Composer yet, download it following the instructions on +http://getcomposer.org/ or just run the following command: + + curl -s https://getcomposer.org/installer | php + +Then, use the `create-project` command to generate a new Symfony application: + + php composer.phar create-project symfony/framework-standard-edition path/to/install 2.1.x-dev + +For an exact version, replace 2.1.x-dev with the latest Symfony version (e.g. 2.1.1). + +Composer will install Symfony and all its dependencies under the +`path/to/install` directory. + +### Download an Archive File + +To quickly test Symfony, you can also download an [archive][3] of the Standard +Edition and unpack it somewhere under your web server root directory. + +If you downloaded an archive "without vendors", you also need to install all +the necessary dependencies. Download composer (see above) and run the +following command: + + php composer.phar install + +2) Checking your System Configuration +------------------------------------- + +Before starting coding, make sure that your local system is properly +configured for Symfony. + +Execute the `check.php` script from the command line: + + php app/check.php + +Access the `config.php` script from a browser: + + http://localhost/path/to/symfony/app/web/config.php + +If you get any warnings or recommendations, fix them before moving on. + +3) Browsing the Demo Application +-------------------------------- + +Congratulations! You're now ready to use Symfony. + +From the `config.php` page, click the "Bypass configuration and go to the +Welcome page" link to load up your first Symfony page. + +You can also use a web-based configurator by clicking on the "Configure your +Symfony Application online" link of the `config.php` page. + +To see a real-live Symfony page in action, access the following page: + + web/app_dev.php/demo/hello/Fabien + +4) Getting started with Symfony +------------------------------- + +This distribution is meant to be the starting point for your Symfony +applications, but it also contains some sample code that you can learn from +and play with. + +A great way to start learning Symfony is via the [Quick Tour][4], which will +take you through all the basic features of Symfony2. + +Once you're feeling good, you can move onto reading the official +[Symfony2 book][5]. + +A default bundle, `AcmeDemoBundle`, shows you Symfony2 in action. After +playing with it, you can remove it by following these steps: + + * delete the `src/Acme` directory; + + * remove the routing entries referencing AcmeBundle in + `app/config/routing_dev.yml`; + + * remove the AcmeBundle from the registered bundles in `app/AppKernel.php`; + + * remove the `web/bundles/acmedemo` directory; + + * remove the `security.providers`, `security.firewalls.login` and + `security.firewalls.secured_area` entries in the `security.yml` file or + tweak the security configuration to fit your needs. + +What's inside? +--------------- + +The Symfony Standard Edition is configured with the following defaults: + + * Twig is the only configured template engine; + + * Doctrine ORM/DBAL is configured; + + * Swiftmailer is configured; + + * Annotations for everything are enabled. + +It comes pre-configured with the following bundles: + + * **FrameworkBundle** - The core Symfony framework bundle + + * [**SensioFrameworkExtraBundle**][6] - Adds several enhancements, including + template and routing annotation capability + + * [**DoctrineBundle**][7] - Adds support for the Doctrine ORM + + * [**TwigBundle**][8] - Adds support for the Twig templating engine + + * [**SecurityBundle**][9] - Adds security by integrating Symfony's security + component + + * [**SwiftmailerBundle**][10] - Adds support for Swiftmailer, a library for + sending emails + + * [**MonologBundle**][11] - Adds support for Monolog, a logging library + + * [**AsseticBundle**][12] - Adds support for Assetic, an asset processing + library + + * [**JMSSecurityExtraBundle**][13] - Allows security to be added via + annotations + + * [**JMSDiExtraBundle**][14] - Adds more powerful dependency injection + features + + * **WebProfilerBundle** (in dev/test env) - Adds profiling functionality and + the web debug toolbar + + * **SensioDistributionBundle** (in dev/test env) - Adds functionality for + configuring and working with Symfony distributions + + * [**SensioGeneratorBundle**][15] (in dev/test env) - Adds code generation + capabilities + + * **AcmeDemoBundle** (in dev/test env) - A demo bundle with some example + code + +Enjoy! + +[1]: http://symfony.com/doc/2.1/book/installation.html +[2]: http://getcomposer.org/ +[3]: http://symfony.com/download +[4]: http://symfony.com/doc/2.1/quick_tour/the_big_picture.html +[5]: http://symfony.com/doc/2.1/index.html +[6]: http://symfony.com/doc/2.1/bundles/SensioFrameworkExtraBundle/index.html +[7]: http://symfony.com/doc/2.1/book/doctrine.html +[8]: http://symfony.com/doc/2.1/book/templating.html +[9]: http://symfony.com/doc/2.1/book/security.html +[10]: http://symfony.com/doc/2.1/cookbook/email.html +[11]: http://symfony.com/doc/2.1/cookbook/logging/monolog.html +[12]: http://symfony.com/doc/2.1/cookbook/assetic/asset_management.html +[13]: http://jmsyst.com/bundles/JMSSecurityExtraBundle/master +[14]: http://jmsyst.com/bundles/JMSDiExtraBundle/master +[15]: http://symfony.com/doc/2.1/bundles/SensioGeneratorBundle/index.html diff --git a/UPGRADE.md b/UPGRADE.md new file mode 100644 index 0000000..caa467a --- /dev/null +++ b/UPGRADE.md @@ -0,0 +1,252 @@ +Symfony Standard Edition Upgrade +================================ + +From Symfony 2.0 to Symfony 2.1 +------------------------------- + +### Project Dependencies + +As of Symfony 2.1, project dependencies are managed by +[Composer](http://getcomposer.org/): + +* The `bin/vendors` script can be removed as `composer.phar` does all the work + now (it is recommended to install it globally on your machine). + +* The `deps` file need to be replaced with the `composer.json` one. + +* The `composer.lock` is the equivalent of the generated `deps.lock` file and + it is automatically generated by Composer. + +Download the default +[`composer.json`](https://raw.github.com/symfony/symfony-standard/master/composer.json) +and +[`composer.lock`](https://raw.github.com/symfony/symfony-standard/master/composer.lock) +files for Symfony 2.1 and put them into the main directory of your project. If +you have customized your `deps` file, move the added dependencies to the +`composer.json` file (many bundles and PHP libraries are already available as +Composer packages -- search for them on [Packagist](http://packagist.org/)). + +Remove your current `vendor` directory. + +Finally, run Composer: + + $ composer.phar install + +### `app/autoload.php` + +The default `autoload.php` reads as follows (it has been simplified a lot as +autoloading for libraries and bundles declared in your `composer.json` file is +automatically managed by the Composer autoloader): + + add('', __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs'); + } + + AnnotationRegistry::registerLoader(array($loader, 'loadClass')); + + return $loader; + +### `app/config/config.yml` + +The `framework.charset` setting must be removed. If you are not using `UTF-8` +for your application, override the `getCharset()` method in your `AppKernel` +class instead: + + class AppKernel extends Kernel + { + public function getCharset() + { + return 'ISO-8859-1'; + } + + // ... + } + +You might want to add the new `strict_requirements` parameter to +`framework.router` (it avoids fatal errors in the production environment when +a link cannot be generated): + + framework: + router: + strict_requirements: "%kernel.debug%" + +The `default_locale` parameter is now a setting of the main `framework` +configuration (it was under the `framework.session` in 2.0): + + framework: + default_locale: "%locale%" + +The `auto_start` setting under `framework.session` must be removed as it is +not used anymore (the session is now always started on-demand). If +`auto_start` was the only setting under the `framework.session` entry, don't +remove it entirely, but set its value to `~` (`~` means `null` in YAML) +instead: + + framework: + session: ~ + +The `trust_proxy_headers` setting was added in the default configuration file +(as it should be set to `true` when you install your application behind a +reverse proxy): + + framework: + trust_proxy_headers: false + +An empty `bundles` entry was added to the `assetic` configuration: + + assetic: + bundles: [] + +The default `swiftmailer` configuration now has the `spool` setting configured +to the `memory` type to defer email sending after the response is sent to the +user (recommended for better end-user performance): + + swiftmailer: + spool: { type: memory } + +The `jms_security_extra` configuration was moved to the `security.yml` +configuration file. + +### `app/config/config_dev.yml` + +An example of how to send all emails to a unique address was added: + + #swiftmailer: + # delivery_address: me@example.com + +### `app/config/config_test.yml` + +The `storage_id` setting must be changed to `session.storage.mock_file`: + + framework: + session: + storage_id: session.storage.mock_file + +### `app/config/parameters.ini` + +The file has been converted to a YAML file which reads as follows: + + parameters: + database_driver: pdo_mysql + database_host: localhost + database_port: ~ + database_name: symfony + database_user: root + database_password: ~ + + mailer_transport: smtp + mailer_host: localhost + mailer_user: ~ + mailer_password: ~ + + locale: en + secret: ThisTokenIsNotSoSecretChangeIt + +Note that if you convert your parameters file to YAML, you must also change +its reference in `app/config/config.yml`. + +### `app/config/routing_dev.yml` + +The `_assetic` entry was removed: + + #_assetic: + # resource: . + # type: assetic + +### `app/config/security.yml` + +Under `security.access_control`, the default rule for internal routes was changed: + + security: + access_control: + #- { path: ^/_internal/secure, roles: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1 } + +Under `security.providers`, the `in_memory` example was updated to the following: + + security: + providers: + in_memory: + memory: + users: + user: { password: userpass, roles: [ 'ROLE_USER' ] } + admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] } + +### `app/AppKernel.php` + +The following bundles have been added to the list of default registered bundles: + + new JMS\AopBundle\JMSAopBundle(), + new JMS\DiExtraBundle\JMSDiExtraBundle($this), + +### `web/app.php` + +The default `web/app.php` file now reads as follows: + + register(true); + */ + + require_once __DIR__.'/../app/AppKernel.php'; + //require_once __DIR__.'/../app/AppCache.php'; + + $kernel = new AppKernel('prod', false); + $kernel->loadClassCache(); + //$kernel = new AppCache($kernel); + $request = Request::createFromGlobals(); + $response = $kernel->handle($request); + $response->send(); + $kernel->terminate($request, $response); + +### `web/app_dev.php` + +The default `web/app_dev.php` file now reads as follows: + + loadClassCache(); + $request = Request::createFromGlobals(); + $response = $kernel->handle($request); + $response->send(); + $kernel->terminate($request, $response); diff --git a/app/.htaccess b/app/.htaccess new file mode 100644 index 0000000..3418e55 --- /dev/null +++ b/app/.htaccess @@ -0,0 +1 @@ +deny from all \ No newline at end of file diff --git a/app/AppCache.php b/app/AppCache.php new file mode 100644 index 0000000..ddb51db --- /dev/null +++ b/app/AppCache.php @@ -0,0 +1,9 @@ +getEnvironment(), array('dev', 'test'))) { + $bundles[] = new Acme\DemoBundle\AcmeDemoBundle(); + $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle(); + $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle(); + $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle(); + } + + return $bundles; + } + + public function registerContainerConfiguration(LoaderInterface $loader) + { + $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml'); + } +} diff --git a/app/Resources/views/base.html.twig b/app/Resources/views/base.html.twig new file mode 100644 index 0000000..bafd28d --- /dev/null +++ b/app/Resources/views/base.html.twig @@ -0,0 +1,13 @@ + + + + + {% block title %}Welcome!{% endblock %} + {% block stylesheets %}{% endblock %} + + + + {% block body %}{% endblock %} + {% block javascripts %}{% endblock %} + + diff --git a/app/SymfonyRequirements.php b/app/SymfonyRequirements.php new file mode 100644 index 0000000..4df46d1 --- /dev/null +++ b/app/SymfonyRequirements.php @@ -0,0 +1,638 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +/* + * Users of PHP 5.2 should be able to run the requirements checks. + * This is why the file and all classes must be compatible with PHP 5.2+ + * (e.g. not using namespaces and closures). + * + * ************** CAUTION ************** + * + * DO NOT EDIT THIS FILE as it will be overriden by Composer as part of + * the installation/update process. The original file resides in the + * SensioDistributionBundle. + * + * ************** CAUTION ************** + */ + +/** + * Represents a single PHP requirement, e.g. an installed extension. + * It can be a mandatory requirement or an optional recommendation. + * There is a special subclass, named PhpIniRequirement, to check a php.ini configuration. + * + * @author Tobias Schultze + */ +class Requirement +{ + private $fulfilled; + private $testMessage; + private $helpText; + private $helpHtml; + private $optional; + + /** + * Constructor that initializes the requirement. + * + * @param Boolean $fulfilled Whether the requirement is fulfilled + * @param string $testMessage The message for testing the requirement + * @param string $helpHtml The help text formatted in HTML for resolving the problem + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + * @param Boolean $optional Whether this is only an optional recommendation not a mandatory requirement + */ + public function __construct($fulfilled, $testMessage, $helpHtml, $helpText = null, $optional = false) + { + $this->fulfilled = (Boolean) $fulfilled; + $this->testMessage = (string) $testMessage; + $this->helpHtml = (string) $helpHtml; + $this->helpText = null === $helpText ? strip_tags($this->helpHtml) : (string) $helpText; + $this->optional = (Boolean) $optional; + } + + /** + * Returns whether the requirement is fulfilled. + * + * @return Boolean true if fulfilled, otherwise false + */ + public function isFulfilled() + { + return $this->fulfilled; + } + + /** + * Returns the message for testing the requirement. + * + * @return string The test message + */ + public function getTestMessage() + { + return $this->testMessage; + } + + /** + * Returns the help text for resolving the problem + * + * @return string The help text + */ + public function getHelpText() + { + return $this->helpText; + } + + /** + * Returns the help text formatted in HTML. + * + * @return string The HTML help + */ + public function getHelpHtml() + { + return $this->helpHtml; + } + + /** + * Returns whether this is only an optional recommendation and not a mandatory requirement. + * + * @return Boolean true if optional, false if mandatory + */ + public function isOptional() + { + return $this->optional; + } +} + +/** + * Represents a PHP requirement in form of a php.ini configuration. + * + * @author Tobias Schultze + */ +class PhpIniRequirement extends Requirement +{ + /** + * Constructor that initializes the requirement. + * + * @param string $cfgName The configuration name used for ini_get() + * @param Boolean|callback $evaluation Either a Boolean indicating whether the configuration should evaluate to true or false, + or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement + * @param Boolean $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false. + This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. + Example: You require a config to be true but PHP later removes this config and defaults it to true internally. + * @param string|null $testMessage The message for testing the requirement (when null and $evaluation is a Boolean a default message is derived) + * @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) + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + * @param Boolean $optional Whether this is only an optional recommendation not a mandatory requirement + */ + public function __construct($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null, $optional = false) + { + $cfgValue = ini_get($cfgName); + + if (is_callable($evaluation)) { + if (null === $testMessage || null === $helpHtml) { + throw new InvalidArgumentException('You must provide the parameters testMessage and helpHtml for a callback evaluation.'); + } + + $fulfilled = call_user_func($evaluation, $cfgValue); + } else { + if (null === $testMessage) { + $testMessage = sprintf('%s %s be %s in php.ini', + $cfgName, + $optional ? 'should' : 'must', + $evaluation ? 'enabled' : 'disabled' + ); + } + + if (null === $helpHtml) { + $helpHtml = sprintf('Set %s to %s in php.ini*.', + $cfgName, + $evaluation ? 'on' : 'off' + ); + } + + $fulfilled = $evaluation == $cfgValue; + } + + parent::__construct($fulfilled || ($approveCfgAbsence && false === $cfgValue), $testMessage, $helpHtml, $helpText, $optional); + } +} + +/** + * A RequirementCollection represents a set of Requirement instances. + * + * @author Tobias Schultze + */ +class RequirementCollection implements IteratorAggregate +{ + private $requirements = array(); + + /** + * Gets the current RequirementCollection as an Iterator. + * + * @return Traversable A Traversable interface + */ + public function getIterator() + { + return new ArrayIterator($this->requirements); + } + + /** + * Adds a Requirement. + * + * @param Requirement $requirement A Requirement instance + */ + public function add(Requirement $requirement) + { + $this->requirements[] = $requirement; + } + + /** + * Adds a mandatory requirement. + * + * @param Boolean $fulfilled Whether the requirement is fulfilled + * @param string $testMessage The message for testing the requirement + * @param string $helpHtml The help text formatted in HTML for resolving the problem + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + */ + public function addRequirement($fulfilled, $testMessage, $helpHtml, $helpText = null) + { + $this->add(new Requirement($fulfilled, $testMessage, $helpHtml, $helpText, false)); + } + + /** + * Adds an optional recommendation. + * + * @param Boolean $fulfilled Whether the recommendation is fulfilled + * @param string $testMessage The message for testing the recommendation + * @param string $helpHtml The help text formatted in HTML for resolving the problem + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + */ + public function addRecommendation($fulfilled, $testMessage, $helpHtml, $helpText = null) + { + $this->add(new Requirement($fulfilled, $testMessage, $helpHtml, $helpText, true)); + } + + /** + * Adds a mandatory requirement in form of a php.ini configuration. + * + * @param string $cfgName The configuration name used for ini_get() + * @param Boolean|callback $evaluation Either a Boolean indicating whether the configuration should evaluate to true or false, + or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement + * @param Boolean $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false. + This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. + Example: You require a config to be true but PHP later removes this config and defaults it to true internally. + * @param string $testMessage The message for testing the requirement (when null and $evaluation is a Boolean a default message is derived) + * @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) + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + */ + public function addPhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null) + { + $this->add(new PhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence, $testMessage, $helpHtml, $helpText, false)); + } + + /** + * Adds an optional recommendation in form of a php.ini configuration. + * + * @param string $cfgName The configuration name used for ini_get() + * @param Boolean|callback $evaluation Either a Boolean indicating whether the configuration should evaluate to true or false, + or a callback function receiving the configuration value as parameter to determine the fulfillment of the requirement + * @param Boolean $approveCfgAbsence If true the Requirement will be fulfilled even if the configuration option does not exist, i.e. ini_get() returns false. + This is helpful for abandoned configs in later PHP versions or configs of an optional extension, like Suhosin. + Example: You require a config to be true but PHP later removes this config and defaults it to true internally. + * @param string $testMessage The message for testing the requirement (when null and $evaluation is a Boolean a default message is derived) + * @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) + * @param string|null $helpText The help text (when null, it will be inferred from $helpHtml, i.e. stripped from HTML tags) + */ + public function addPhpIniRecommendation($cfgName, $evaluation, $approveCfgAbsence = false, $testMessage = null, $helpHtml = null, $helpText = null) + { + $this->add(new PhpIniRequirement($cfgName, $evaluation, $approveCfgAbsence, $testMessage, $helpHtml, $helpText, true)); + } + + /** + * Adds a requirement collection to the current set of requirements. + * + * @param RequirementCollection $collection A RequirementCollection instance + */ + public function addCollection(RequirementCollection $collection) + { + $this->requirements = array_merge($this->requirements, $collection->all()); + } + + /** + * Returns both requirements and recommendations. + * + * @return array Array of Requirement instances + */ + public function all() + { + return $this->requirements; + } + + /** + * Returns all mandatory requirements. + * + * @return array Array of Requirement instances + */ + public function getRequirements() + { + $array = array(); + foreach ($this->requirements as $req) { + if (!$req->isOptional()) { + $array[] = $req; + } + } + + return $array; + } + + /** + * Returns the mandatory requirements that were not met. + * + * @return array Array of Requirement instances + */ + public function getFailedRequirements() + { + $array = array(); + foreach ($this->requirements as $req) { + if (!$req->isFulfilled() && !$req->isOptional()) { + $array[] = $req; + } + } + + return $array; + } + + /** + * Returns all optional recommmendations. + * + * @return array Array of Requirement instances + */ + public function getRecommendations() + { + $array = array(); + foreach ($this->requirements as $req) { + if ($req->isOptional()) { + $array[] = $req; + } + } + + return $array; + } + + /** + * Returns the recommendations that were not met. + * + * @return array Array of Requirement instances + */ + public function getFailedRecommendations() + { + $array = array(); + foreach ($this->requirements as $req) { + if (!$req->isFulfilled() && $req->isOptional()) { + $array[] = $req; + } + } + + return $array; + } + + /** + * Returns whether a php.ini configuration is not correct. + * + * @return Boolean php.ini configuration problem? + */ + public function hasPhpIniConfigIssue() + { + foreach ($this->requirements as $req) { + if (!$req->isFulfilled() && $req instanceof PhpIniRequirement) { + return true; + } + } + + return false; + } + + /** + * Returns the PHP configuration file (php.ini) path. + * + * @return string|false php.ini file path + */ + public function getPhpIniConfigPath() + { + return get_cfg_var('cfg_file_path'); + } +} + +/** + * This class specifies all requirements and optional recommendations that + * are necessary to run the Symfony Standard Edition. + * + * @author Tobias Schultze + * @author Fabien Potencier + */ +class SymfonyRequirements extends RequirementCollection +{ + const REQUIRED_PHP_VERSION = '5.3.3'; + + /** + * Constructor that initializes the requirements. + */ + public function __construct() + { + /* mandatory requirements follow */ + + $installedPhpVersion = phpversion(); + + $this->addRequirement( + version_compare($installedPhpVersion, self::REQUIRED_PHP_VERSION, '>='), + sprintf('PHP version must be at least %s (%s installed)', self::REQUIRED_PHP_VERSION, $installedPhpVersion), + sprintf('You are running PHP version "%s", but Symfony needs at least PHP "%s" to run. + Before using Symfony, upgrade your PHP installation, preferably to the latest version.', + $installedPhpVersion, self::REQUIRED_PHP_VERSION), + sprintf('Install PHP %s or newer (installed version is %s)', self::REQUIRED_PHP_VERSION, $installedPhpVersion) + ); + + $this->addRequirement( + version_compare($installedPhpVersion, '5.3.16', '!='), + 'PHP version must not be 5.3.16 as Symfony won\'t work properly with it', + 'Install PHP 5.3.17 or newer (or downgrade to an earlier PHP version)' + ); + + $this->addRequirement( + is_dir(__DIR__.'/../vendor/composer'), + 'Vendor libraries must be installed', + 'Vendor libraries are missing. Install composer following instructions from http://getcomposer.org/. ' . + 'Then run "php composer.phar install" to install them.' + ); + + $baseDir = basename(__DIR__); + + $this->addRequirement( + is_writable(__DIR__.'/cache'), + "$baseDir/cache/ directory must be writable", + "Change the permissions of the \"$baseDir/cache/\" directory so that the web server can write into it." + ); + + $this->addRequirement( + is_writable(__DIR__.'/logs'), + "$baseDir/logs/ directory must be writable", + "Change the permissions of the \"$baseDir/logs/\" directory so that the web server can write into it." + ); + + $this->addPhpIniRequirement( + 'date.timezone', true, false, + 'date.timezone setting must be set', + 'Set the "date.timezone" setting in php.ini* (like Europe/Paris).' + ); + + if (version_compare($installedPhpVersion, self::REQUIRED_PHP_VERSION, '>=')) { + $this->addRequirement( + (in_array(date_default_timezone_get(), DateTimeZone::listIdentifiers())), + sprintf('Configured default timezone "%s" must be supported by your installation of PHP', date_default_timezone_get()), + '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.' + ); + } + + $this->addRequirement( + function_exists('json_encode'), + 'json_encode() must be available', + 'Install and enable the JSON extension.' + ); + + $this->addRequirement( + function_exists('session_start'), + 'session_start() must be available', + 'Install and enable the session extension.' + ); + + $this->addRequirement( + function_exists('ctype_alpha'), + 'ctype_alpha() must be available', + 'Install and enable the ctype extension.' + ); + + $this->addRequirement( + function_exists('token_get_all'), + 'token_get_all() must be available', + 'Install and enable the Tokenizer extension.' + ); + + $this->addRequirement( + function_exists('simplexml_import_dom'), + 'simplexml_import_dom() must be available', + 'Install and enable the SimpleXML extension.' + ); + + if (function_exists('apc_store') && ini_get('apc.enabled')) { + $this->addRequirement( + version_compare(phpversion('apc'), '3.0.17', '>='), + 'APC version must be at least 3.0.17', + 'Upgrade your APC extension (3.0.17+).' + ); + } + + $this->addPhpIniRequirement('detect_unicode', false); + + if (extension_loaded('suhosin')) { + $this->addPhpIniRequirement( + 'suhosin.executor.include.whitelist', + create_function('$cfgValue', 'return false !== stripos($cfgValue, "phar");'), + false, + 'suhosin.executor.include.whitelist must be configured correctly in php.ini', + 'Add "phar" to suhosin.executor.include.whitelist in php.ini*.' + ); + } + + if (extension_loaded('xdebug')) { + $this->addPhpIniRequirement( + 'xdebug.show_exception_trace', false, true + ); + + $this->addPhpIniRequirement( + 'xdebug.scream', false, true + ); + } + + $pcreVersion = defined('PCRE_VERSION') ? (float) PCRE_VERSION : null; + + $this->addRequirement( + null !== $pcreVersion && $pcreVersion > 8.0, + sprintf('PCRE extension must be available and at least 8.0 (%s installed)', $pcreVersion ? $pcreVersion : 'not'), + 'Upgrade your PCRE extension (8.0+).' + ); + + /* optional recommendations follow */ + + $this->addRecommendation( + file_get_contents(__FILE__) === file_get_contents(__DIR__.'/../vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Resources/skeleton/app/SymfonyRequirements.php'), + 'Requirements file should be up-to-date', + 'Your requirements file is outdated. Run composer install and re-check your configuration.' + ); + + $this->addRecommendation( + version_compare($installedPhpVersion, '5.3.4', '>='), + 'You should use at least PHP 5.3.4 due to PHP bug #52083 in earlier versions', + '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.' + ); + + $this->addRecommendation( + version_compare($installedPhpVersion, '5.3.8', '>='), + 'When using annotations you should have at least PHP 5.3.8 due to PHP bug #55156', + 'Install PHP 5.3.8 or newer if your project uses annotations.' + ); + + $this->addRecommendation( + version_compare($installedPhpVersion, '5.4.0', '!='), + 'You should not use PHP 5.4.0 due to the PHP bug #61453', + '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.' + ); + + $this->addRecommendation( + class_exists('DomDocument'), + 'PHP-XML module should be installed', + 'Install and enable the PHP-XML module.' + ); + + $this->addRecommendation( + function_exists('mb_strlen'), + 'mb_strlen() should be available', + 'Install and enable the mbstring extension.' + ); + + $this->addRecommendation( + function_exists('iconv'), + 'iconv() should be available', + 'Install and enable the iconv extension.' + ); + + $this->addRecommendation( + function_exists('utf8_decode'), + 'utf8_decode() should be available', + 'Install and enable the XML extension.' + ); + + if (!defined('PHP_WINDOWS_VERSION_BUILD')) { + $this->addRecommendation( + function_exists('posix_isatty'), + 'posix_isatty() should be available', + 'Install and enable the php_posix extension (used to colorize the CLI output).' + ); + } + + $this->addRecommendation( + class_exists('Locale'), + 'intl extension should be available', + 'Install and enable the intl extension (used for validators).' + ); + + if (class_exists('Collator')) { + $this->addRecommendation( + null !== new Collator('fr_FR'), + 'intl extension should be correctly configured', + 'The intl extension does not behave properly. This problem is typical on PHP 5.3.X x64 WIN builds.' + ); + } + + if (class_exists('Locale')) { + if (defined('INTL_ICU_VERSION')) { + $version = INTL_ICU_VERSION; + } else { + $reflector = new ReflectionExtension('intl'); + + ob_start(); + $reflector->info(); + $output = strip_tags(ob_get_clean()); + + preg_match('/^ICU version +(?:=> )?(.*)$/m', $output, $matches); + $version = $matches[1]; + } + + $this->addRecommendation( + version_compare($version, '4.0', '>='), + 'intl ICU version should be at least 4+', + 'Upgrade your intl extension with a newer ICU version (4+).' + ); + } + + $accelerator = + (function_exists('apc_store') && ini_get('apc.enabled')) + || + function_exists('eaccelerator_put') && ini_get('eaccelerator.enable') + || + function_exists('xcache_set') + ; + + $this->addRecommendation( + $accelerator, + 'a PHP accelerator should be installed', + 'Install and enable a PHP accelerator like APC (highly recommended).' + ); + + $this->addPhpIniRecommendation('short_open_tag', false); + + $this->addPhpIniRecommendation('magic_quotes_gpc', false, true); + + $this->addPhpIniRecommendation('register_globals', false, true); + + $this->addPhpIniRecommendation('session.auto_start', false); + + $this->addRecommendation( + class_exists('PDO'), + 'PDO should be installed', + 'Install PDO (mandatory for Doctrine).' + ); + + if (class_exists('PDO')) { + $drivers = PDO::getAvailableDrivers(); + $this->addRecommendation( + count($drivers), + sprintf('PDO should have some drivers installed (currently available: %s)', count($drivers) ? implode(', ', $drivers) : 'none'), + 'Install PDO drivers (mandatory for Doctrine).' + ); + } + } +} diff --git a/app/autoload.php b/app/autoload.php new file mode 100644 index 0000000..a68e37f --- /dev/null +++ b/app/autoload.php @@ -0,0 +1,16 @@ +add('', __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs'); +} + +AnnotationRegistry::registerLoader(array($loader, 'loadClass')); + +return $loader; diff --git a/app/check.php b/app/check.php new file mode 100644 index 0000000..daa6d0a --- /dev/null +++ b/app/check.php @@ -0,0 +1,55 @@ +getPhpIniConfigPath(); + +echo "********************************\n"; +echo "* *\n"; +echo "* Symfony requirements check *\n"; +echo "* *\n"; +echo "********************************\n\n"; + +echo $iniPath ? sprintf("* Configuration file used by PHP: %s\n\n", $iniPath) : "* WARNING: No configuration file (php.ini) used by PHP!\n\n"; + +echo "** ATTENTION **\n"; +echo "* The PHP CLI can use a different php.ini file\n"; +echo "* than the one used with your web server.\n"; +if ('\\' == DIRECTORY_SEPARATOR) { + echo "* (especially on the Windows platform)\n"; +} +echo "* To be on the safe side, please also launch the requirements check\n"; +echo "* from your web server using the web/config.php script.\n"; + +echo_title('Mandatory requirements'); + +foreach ($symfonyRequirements->getRequirements() as $req) { + echo_requirement($req); +} + +echo_title('Optional recommendations'); + +foreach ($symfonyRequirements->getRecommendations() as $req) { + echo_requirement($req); +} + +/** + * Prints a Requirement instance + */ +function echo_requirement(Requirement $requirement) +{ + $result = $requirement->isFulfilled() ? 'OK' : ($requirement->isOptional() ? 'WARNING' : 'ERROR'); + echo ' ' . str_pad($result, 9); + echo $requirement->getTestMessage() . "\n"; + + if (!$requirement->isFulfilled()) { + echo sprintf(" %s\n\n", $requirement->getHelpText()); + } +} + +function echo_title($title) +{ + echo "\n** $title **\n\n"; +} diff --git a/app/config/config.yml b/app/config/config.yml new file mode 100644 index 0000000..6859cea --- /dev/null +++ b/app/config/config.yml @@ -0,0 +1,59 @@ +imports: + - { resource: parameters.yml } + - { resource: security.yml } + +framework: + #esi: ~ + #translator: { fallback: "%locale%" } + secret: "%secret%" + router: + resource: "%kernel.root_dir%/config/routing.yml" + strict_requirements: "%kernel.debug%" + form: true + csrf_protection: true + validation: { enable_annotations: true } + templating: { engines: ['twig'] } #assets_version: SomeVersionScheme + default_locale: "%locale%" + trust_proxy_headers: false # Whether or not the Request object should trust proxy headers (X_FORWARDED_FOR/HTTP_CLIENT_IP) + session: ~ + +# Twig Configuration +twig: + debug: "%kernel.debug%" + strict_variables: "%kernel.debug%" + +# Assetic Configuration +assetic: + debug: "%kernel.debug%" + use_controller: false + bundles: [ ] + #java: /usr/bin/java + filters: + cssrewrite: ~ + #closure: + # jar: "%kernel.root_dir%/Resources/java/compiler.jar" + #yui_css: + # jar: "%kernel.root_dir%/Resources/java/yuicompressor-2.4.7.jar" + +# Doctrine Configuration +doctrine: + dbal: + driver: "%database_driver%" + host: "%database_host%" + port: "%database_port%" + dbname: "%database_name%" + user: "%database_user%" + password: "%database_password%" + charset: UTF8 + + orm: + auto_generate_proxy_classes: "%kernel.debug%" + auto_mapping: true + +# Swiftmailer Configuration +swiftmailer: + transport: "%mailer_transport%" + host: "%mailer_host%" + username: "%mailer_user%" + password: "%mailer_password%" + spool: { type: memory } diff --git a/app/config/config_dev.yml b/app/config/config_dev.yml new file mode 100644 index 0000000..8dbf07b --- /dev/null +++ b/app/config/config_dev.yml @@ -0,0 +1,26 @@ +imports: + - { resource: config.yml } + +framework: + router: { resource: "%kernel.root_dir%/config/routing_dev.yml" } + profiler: { only_exceptions: false } + +web_profiler: + toolbar: true + intercept_redirects: false + +monolog: + handlers: + main: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug + firephp: + type: firephp + level: info + +assetic: + use_controller: true + +#swiftmailer: +# delivery_address: me@example.com diff --git a/app/config/config_prod.yml b/app/config/config_prod.yml new file mode 100644 index 0000000..332a137 --- /dev/null +++ b/app/config/config_prod.yml @@ -0,0 +1,19 @@ +imports: + - { resource: config.yml } + +#doctrine: +# orm: +# metadata_cache_driver: apc +# result_cache_driver: apc +# query_cache_driver: apc + +monolog: + handlers: + main: + type: fingers_crossed + action_level: error + handler: nested + nested: + type: stream + path: "%kernel.logs_dir%/%kernel.environment%.log" + level: debug diff --git a/app/config/config_test.yml b/app/config/config_test.yml new file mode 100644 index 0000000..e7f44e5 --- /dev/null +++ b/app/config/config_test.yml @@ -0,0 +1,14 @@ +imports: + - { resource: config_dev.yml } + +framework: + test: ~ + session: + storage_id: session.storage.mock_file + +web_profiler: + toolbar: false + intercept_redirects: false + +swiftmailer: + disable_delivery: true diff --git a/app/config/parameters.yml b/app/config/parameters.yml new file mode 100644 index 0000000..6f0c6ee --- /dev/null +++ b/app/config/parameters.yml @@ -0,0 +1,15 @@ +parameters: + database_driver: pdo_mysql + database_host: localhost + database_port: ~ + database_name: symfony + database_user: root + database_password: ~ + + mailer_transport: smtp + mailer_host: localhost + mailer_user: ~ + mailer_password: ~ + + locale: en + secret: ThisTokenIsNotSoSecretChangeIt diff --git a/app/config/routing.yml b/app/config/routing.yml new file mode 100644 index 0000000..684d364 --- /dev/null +++ b/app/config/routing.yml @@ -0,0 +1,4 @@ +# Internal routing configuration to handle ESI +#_internal: +# resource: "@FrameworkBundle/Resources/config/routing/internal.xml" +# prefix: /_internal diff --git a/app/config/routing_dev.yml b/app/config/routing_dev.yml new file mode 100644 index 0000000..22a48ae --- /dev/null +++ b/app/config/routing_dev.yml @@ -0,0 +1,27 @@ +_welcome: + pattern: / + defaults: { _controller: AcmeDemoBundle:Welcome:index } + +_demo_secured: + resource: "@AcmeDemoBundle/Controller/SecuredController.php" + type: annotation + +_demo: + resource: "@AcmeDemoBundle/Controller/DemoController.php" + type: annotation + prefix: /demo + +_wdt: + resource: "@WebProfilerBundle/Resources/config/routing/wdt.xml" + prefix: /_wdt + +_profiler: + resource: "@WebProfilerBundle/Resources/config/routing/profiler.xml" + prefix: /_profiler + +_configurator: + resource: "@SensioDistributionBundle/Resources/config/routing/webconfigurator.xml" + prefix: /_configurator + +_main: + resource: routing.yml diff --git a/app/config/security.yml b/app/config/security.yml new file mode 100644 index 0000000..e01c1c2 --- /dev/null +++ b/app/config/security.yml @@ -0,0 +1,43 @@ +jms_security_extra: + secure_all_services: false + expressions: true + +security: + encoders: + Symfony\Component\Security\Core\User\User: plaintext + + role_hierarchy: + ROLE_ADMIN: ROLE_USER + ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH] + + providers: + in_memory: + memory: + users: + user: { password: userpass, roles: [ 'ROLE_USER' ] } + admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] } + + firewalls: + dev: + pattern: ^/(_(profiler|wdt)|css|images|js)/ + security: false + + login: + pattern: ^/demo/secured/login$ + security: false + + secured_area: + pattern: ^/demo/secured/ + form_login: + check_path: /demo/secured/login_check + login_path: /demo/secured/login + logout: + path: /demo/secured/logout + target: /demo/ + #anonymous: ~ + #http_basic: + # realm: "Secured Demo Area" + + access_control: + #- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https } + #- { path: ^/_internal/secure, roles: IS_AUTHENTICATED_ANONYMOUSLY, ip: 127.0.0.1 } diff --git a/app/console b/app/console new file mode 100644 index 0000000..1de6db4 --- /dev/null +++ b/app/console @@ -0,0 +1,22 @@ +#!/usr/bin/env php +getParameterOption(array('--env', '-e'), getenv('SYMFONY_ENV') ?: 'dev'); +$debug = getenv('SYMFONY_DEBUG') !== '0' && !$input->hasParameterOption(array('--no-debug', '')) && $env !== 'prod'; + +$kernel = new AppKernel($env, $debug); +$application = new Application($kernel); +$application->run($input); diff --git a/app/phpunit.xml.dist b/app/phpunit.xml.dist new file mode 100644 index 0000000..1e31086 --- /dev/null +++ b/app/phpunit.xml.dist @@ -0,0 +1,41 @@ + + + + + + + + ../src/*/*Bundle/Tests + ../src/*/Bundle/*Bundle/Tests + + + + + + + + ../src + + ../src/*/*Bundle/Resources + ../src/*/*Bundle/Tests + ../src/*/Bundle/*Bundle/Resources + ../src/*/Bundle/*Bundle/Tests + + + + + diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..fd1aa0e --- /dev/null +++ b/composer.json @@ -0,0 +1,41 @@ +{ + "name": "symfony/framework-standard-edition", + "description": "The \"Symfony Standard Edition\" distribution", + "autoload": { + "psr-0": { "": "src/" } + }, + "require": { + "php": ">=5.3.3", + "symfony/symfony": "2.1.*", + "doctrine/orm": ">=2.2.3,<2.4-dev", + "doctrine/doctrine-bundle": "1.0.*", + "twig/extensions": "1.0.*", + "symfony/assetic-bundle": "2.1.*", + "symfony/swiftmailer-bundle": "2.1.*", + "symfony/monolog-bundle": "2.1.*", + "sensio/distribution-bundle": "2.1.*", + "sensio/framework-extra-bundle": "2.1.*", + "sensio/generator-bundle": "2.1.*", + "jms/security-extra-bundle": "1.2.*", + "jms/di-extra-bundle": "1.1.*" + }, + "scripts": { + "post-install-cmd": [ + "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap", + "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache", + "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets", + "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile" + ], + "post-update-cmd": [ + "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap", + "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache", + "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets", + "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile" + ] + }, + "minimum-stability": "dev", + "extra": { + "symfony-app-dir": "app", + "symfony-web-dir": "web" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..458219f --- /dev/null +++ b/composer.lock @@ -0,0 +1,1213 @@ +{ + "hash": "871ca732d39c832f0b78012cc83cec2e", + "packages": [ + { + "name": "doctrine/common", + "version": "2.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/doctrine/common", + "reference": "bb0aebbf234db52df476a2b473d434745b34221c" + }, + "dist": { + "type": "zip", + "url": "https://github.com/doctrine/common/zipball/bb0aebbf234db52df476a2b473d434745b34221c", + "reference": "bb0aebbf234db52df476a2b473d434745b34221c", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "time": "1348120518", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-0": { + "Doctrine\\Common": "lib/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "http://jmsyst.com", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Common Library for Doctrine projects", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "collections", + "spl", + "eventmanager", + "annotations", + "persistence" + ] + }, + { + "name": "doctrine/dbal", + "version": "2.3.x-dev", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal", + "reference": "9395ca33971c0ff875d71a0271e6c0d5b0f01508" + }, + "dist": { + "type": "zip", + "url": "https://github.com/doctrine/dbal/zipball/9395ca33971c0ff875d71a0271e6c0d5b0f01508", + "reference": "9395ca33971c0ff875d71a0271e6c0d5b0f01508", + "shasum": "" + }, + "require": { + "php": ">=5.3.2", + "doctrine/common": "2.3.*" + }, + "time": "1350419590", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-0": { + "Doctrine\\DBAL": "lib/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + } + ], + "description": "Database Abstraction Layer", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "persistence", + "dbal", + "queryobject" + ] + }, + { + "name": "doctrine/doctrine-bundle", + "version": "dev-master", + "target-dir": "Doctrine/Bundle/DoctrineBundle", + "source": { + "type": "git", + "url": "git://github.com/doctrine/DoctrineBundle.git", + "reference": "a3b99ec049b7c488c70b8776a67c594e6ddf54cd" + }, + "dist": { + "type": "zip", + "url": "https://github.com/doctrine/DoctrineBundle/zipball/a3b99ec049b7c488c70b8776a67c594e6ddf54cd", + "reference": "a3b99ec049b7c488c70b8776a67c594e6ddf54cd", + "shasum": "" + }, + "require": { + "php": ">=5.3.2", + "doctrine/dbal": ">=2.2,<2.4-dev", + "symfony/framework-bundle": ">=2.1,<2.3-dev", + "symfony/doctrine-bridge": ">=2.1,<2.3-dev" + }, + "require-dev": { + "doctrine/orm": ">=2.2,<2.4-dev", + "symfony/yaml": ">=2.1,<2.3-dev", + "symfony/validator": ">=2.1,<2.3-dev" + }, + "suggest": { + "doctrine/orm": "The Doctrine ORM integration is optional in the bundle." + }, + "time": "1350120716", + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-0": { + "Doctrine\\Bundle\\DoctrineBundle": "" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + } + ], + "description": "Symfony DoctrineBundle", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "orm", + "persistence", + "dbal" + ] + }, + { + "name": "doctrine/orm", + "version": "2.3.x-dev", + "source": { + "type": "git", + "url": "git://github.com/doctrine/doctrine2.git", + "reference": "6bad0109599348c5216df35f62b80a20ba16c507" + }, + "dist": { + "type": "zip", + "url": "https://github.com/doctrine/doctrine2/zipball/6bad0109599348c5216df35f62b80a20ba16c507", + "reference": "6bad0109599348c5216df35f62b80a20ba16c507", + "shasum": "" + }, + "require": { + "php": ">=5.3.2", + "ext-pdo": "*", + "symfony/console": "2.*", + "doctrine/dbal": "2.3.*" + }, + "suggest": { + "symfony/yaml": "If you want to use YAML Metadata Mapping Driver" + }, + "time": "1350071385", + "bin": [ + "bin/doctrine", + "bin/doctrine.php" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-0": { + "Doctrine\\ORM": "lib/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com", + "homepage": "http://www.jwage.com/" + }, + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com", + "homepage": "http://www.instaclick.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + } + ], + "description": "Object-Relational-Mapper for PHP", + "homepage": "http://www.doctrine-project.org", + "keywords": [ + "database", + "orm" + ] + }, + { + "name": "jms/aop-bundle", + "version": "1.0.0", + "target-dir": "JMS/AopBundle", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/JMSAopBundle", + "reference": "1.0.0" + }, + "dist": { + "type": "zip", + "url": "https://github.com/schmittjoh/JMSAopBundle/zipball/1.0.0", + "reference": "1.0.0", + "shasum": "" + }, + "require": { + "symfony/framework-bundle": "2.*", + "jms/cg": "1.0.0" + }, + "time": "2012-01-02 12:50:26", + "type": "symfony-bundle", + "installation-source": "source", + "autoload": { + "psr-0": { + "JMS\\AopBundle": "" + } + }, + "license": [ + "Apache" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "http://jmsyst.com", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Adds AOP capabilities to Symfony2", + "keywords": [ + "annotations", + "aop" + ] + }, + { + "name": "jms/cg", + "version": "1.0.0", + "source": { + "type": "git", + "url": "git://github.com/schmittjoh/cg-library.git", + "reference": "1.0.0" + }, + "dist": { + "type": "zip", + "url": "https://github.com/schmittjoh/cg-library/zipball/1.0.0", + "reference": "1.0.0", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2012-01-02 20:40:52", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "CG\\": "src/" + } + }, + "license": [ + "Apache" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "http://jmsyst.com", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Toolset for generating PHP code", + "keywords": [ + "code generation" + ] + }, + { + "name": "jms/di-extra-bundle", + "version": "1.1.x-dev", + "target-dir": "JMS/DiExtraBundle", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/JMSDiExtraBundle", + "reference": "1.1.1" + }, + "dist": { + "type": "zip", + "url": "https://github.com/schmittjoh/JMSDiExtraBundle/zipball/1.1.1", + "reference": "1.1.1", + "shasum": "" + }, + "require": { + "symfony/framework-bundle": "2.1.*", + "jms/aop-bundle": "1.0.*", + "jms/metadata": "1.1.*", + "symfony/process": "2.1.*", + "symfony/finder": "2.1.*" + }, + "require-dev": { + "jms/security-extra-bundle": "1.*", + "symfony/validator": "*", + "symfony/form": "*", + "symfony/class-loader": "*", + "symfony/yaml": "*", + "symfony/browser-kit": "*", + "symfony/security-bundle": "*", + "symfony/twig-bundle": "*", + "sensio/framework-extra-bundle": "*", + "doctrine/doctrine-bundle": "*", + "doctrine/orm": "*" + }, + "time": "1348217792", + "type": "symfony-bundle", + "installation-source": "source", + "autoload": { + "psr-0": { + "JMS\\DiExtraBundle": "" + } + }, + "license": [ + "Apache" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "http://jmsyst.com", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Allows to configure dependency injection using annotations", + "homepage": "http://jmsyst.com/bundles/JMSDiExtraBundle", + "keywords": [ + "dependency injection", + "annotations" + ] + }, + { + "name": "jms/metadata", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/metadata", + "reference": "1.1.1" + }, + "dist": { + "type": "zip", + "url": "https://github.com/schmittjoh/metadata/zipball/1.1.1", + "reference": "1.1.1", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "2012-01-02 21:32:49", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Metadata\\": "src/" + } + }, + "license": [ + "Apache" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "http://jmsyst.com", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Class/method/property metadata management in PHP", + "keywords": [ + "annotations", + "yaml", + "xml", + "metadata" + ] + }, + { + "name": "jms/security-extra-bundle", + "version": "1.2.x-dev", + "target-dir": "JMS/SecurityExtraBundle", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/JMSSecurityExtraBundle", + "reference": "9ab6aceda50fc7a2b07d741ba4b3f0695508afcb" + }, + "dist": { + "type": "zip", + "url": "https://github.com/schmittjoh/JMSSecurityExtraBundle/zipball/9ab6aceda50fc7a2b07d741ba4b3f0695508afcb", + "reference": "9ab6aceda50fc7a2b07d741ba4b3f0695508afcb", + "shasum": "" + }, + "require": { + "symfony/framework-bundle": "2.1.*", + "symfony/security-bundle": "*", + "jms/metadata": "1.1.*", + "jms/aop-bundle": "1.0.*", + "jms/di-extra-bundle": "1.1.*" + }, + "require-dev": { + "sensio/framework-extra-bundle": "*", + "symfony/class-loader": "*", + "symfony/yaml": "*", + "symfony/browser-kit": "*", + "symfony/finder": "*", + "symfony/css-selector": "*", + "symfony/process": "*", + "doctrine/doctrine-bundle": "*", + "symfony/twig-bundle": "*", + "doctrine/orm": "*", + "symfony/form": "*", + "symfony/validator": "*" + }, + "time": "1346947943", + "type": "symfony-bundle", + "installation-source": "source", + "autoload": { + "psr-0": { + "JMS\\SecurityExtraBundle": "" + } + }, + "license": [ + "Apache2" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "http://jmsyst.com", + "role": "Developer of wrapped JMSSerializerBundle" + } + ], + "description": "Enhances the Symfony2 Security Component by adding several new features", + "homepage": "http://jmsyst.com/bundles/JMSSecurityExtraBundle", + "keywords": [ + "annotations", + "authorization", + "security", + "secure", + "expression" + ] + }, + { + "name": "kriswallsmith/assetic", + "version": "dev-master", + "source": { + "type": "git", + "url": "http://github.com/kriswallsmith/assetic.git", + "reference": "a1b6fa1f7bb27c203b6c3cf7d0dd0184f8dffcdc" + }, + "dist": { + "type": "zip", + "url": "https://github.com/kriswallsmith/assetic/zipball/a1b6fa1f7bb27c203b6c3cf7d0dd0184f8dffcdc", + "reference": "a1b6fa1f7bb27c203b6c3cf7d0dd0184f8dffcdc", + "shasum": "" + }, + "require": { + "symfony/process": ">=2.1.0,<2.3-dev", + "php": ">=5.3.1" + }, + "require-dev": { + "twig/twig": ">=1.6.0,<2.0", + "leafo/lessphp": "*", + "leafo/scssphp": "*", + "ptachoire/cssembed": "*", + "leafo/scssphp-compass": "*" + }, + "suggest": { + "twig/twig": "Assetic provides the integration with the Twig templating engine", + "leafo/lessphp": "Assetic provides the integration with the lessphp LESS compiler", + "leafo/scssphp": "Assetic provides the integration with the scssphp SCSS compiler", + "ptachoire/cssembed": "Assetic provides the integration with phpcssembed to embed data uris", + "leafo/scssphp-compass": "Assetic provides the integration with the SCSS compass plugin" + }, + "time": "1351079542", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-0": { + "Assetic": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kris Wallsmith", + "email": "kris.wallsmith@gmail.com", + "homepage": "http://kriswallsmith.net/" + } + ], + "description": "Asset Management for PHP", + "homepage": "https://github.com/kriswallsmith/assetic", + "keywords": [ + "assets", + "compression", + "minification" + ] + }, + { + "name": "monolog/monolog", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog", + "reference": "38bb472abb27db138536f845f7d259c1c47bbd3f" + }, + "dist": { + "type": "zip", + "url": "https://github.com/Seldaek/monolog/zipball/38bb472abb27db138536f845f7d259c1c47bbd3f", + "reference": "38bb472abb27db138536f845f7d259c1c47bbd3f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "require-dev": { + "mlehner/gelf-php": "1.0.*" + }, + "suggest": { + "mlehner/gelf-php": "Allow sending log messages to a GrayLog2 server", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-mongo": "Allow sending log messages to a MongoDB server" + }, + "time": "1351084926", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3.x-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-0": { + "Monolog": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be", + "role": "Developer" + } + ], + "description": "Logging for PHP 5.3", + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging" + ] + }, + { + "name": "sensio/distribution-bundle", + "version": "2.1.x-dev", + "target-dir": "Sensio/Bundle/DistributionBundle", + "source": { + "type": "git", + "url": "https://github.com/sensio/SensioDistributionBundle", + "reference": "v2.1.3" + }, + "dist": { + "type": "zip", + "url": "https://github.com/sensio/SensioDistributionBundle/zipball/v2.1.3", + "reference": "v2.1.3", + "shasum": "" + }, + "require": { + "symfony/framework-bundle": "2.1.*" + }, + "time": "1347340208", + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-0": { + "Sensio\\Bundle\\DistributionBundle": "" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "The base bundle for the Symfony Distributions", + "keywords": [ + "distribution", + "configuration" + ] + }, + { + "name": "sensio/framework-extra-bundle", + "version": "2.1.x-dev", + "target-dir": "Sensio/Bundle/FrameworkExtraBundle", + "source": { + "type": "git", + "url": "https://github.com/sensio/SensioFrameworkExtraBundle", + "reference": "v2.1.3" + }, + "dist": { + "type": "zip", + "url": "https://github.com/sensio/SensioFrameworkExtraBundle/zipball/v2.1.3", + "reference": "v2.1.3", + "shasum": "" + }, + "require": { + "symfony/framework-bundle": "2.1.*", + "doctrine/common": ">=2.1,<2.4-dev" + }, + "time": "1350448707", + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-0": { + "Sensio\\Bundle\\FrameworkExtraBundle": "" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "This bundle provides a way to configure your controllers with annotations", + "keywords": [ + "annotations", + "controllers" + ] + }, + { + "name": "sensio/generator-bundle", + "version": "2.1.x-dev", + "target-dir": "Sensio/Bundle/GeneratorBundle", + "source": { + "type": "git", + "url": "https://github.com/sensio/SensioGeneratorBundle", + "reference": "v2.1.3" + }, + "dist": { + "type": "zip", + "url": "https://github.com/sensio/SensioGeneratorBundle/zipball/v2.1.3", + "reference": "v2.1.3", + "shasum": "" + }, + "require": { + "symfony/framework-bundle": "2.1.*", + "symfony/console": "2.1.*" + }, + "require-dev": { + "symfony/doctrine-bridge": "2.1.*", + "doctrine/orm": ">=2.1,<2.4-dev", + "twig/twig": ">=1.8,<2.0-dev" + }, + "time": "1348030981", + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-0": { + "Sensio\\Bundle\\GeneratorBundle": "" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "This bundle generates code for you" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v4.2.2", + "source": { + "type": "git", + "url": "git://github.com/swiftmailer/swiftmailer.git", + "reference": "v4.2.2" + }, + "dist": { + "type": "zip", + "url": "https://github.com/swiftmailer/swiftmailer/zipball/v4.2.2", + "reference": "v4.2.2", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "time": "2012-10-25 01:30:40", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.2-dev" + } + }, + "installation-source": "source", + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "license": [ + "LGPL" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Chris Corbyn" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "http://swiftmailer.org", + "keywords": [ + "mail", + "mailer" + ] + }, + { + "name": "symfony/assetic-bundle", + "version": "dev-master", + "target-dir": "Symfony/Bundle/AsseticBundle", + "source": { + "type": "git", + "url": "https://github.com/symfony/AsseticBundle", + "reference": "4eea8571954132e4715a5e756fe6a90a7e2d90f6" + }, + "dist": { + "type": "zip", + "url": "https://github.com/symfony/AsseticBundle/zipball/4eea8571954132e4715a5e756fe6a90a7e2d90f6", + "reference": "4eea8571954132e4715a5e756fe6a90a7e2d90f6", + "shasum": "" + }, + "require": { + "php": ">=5.3.0", + "kriswallsmith/assetic": "1.1.*", + "symfony/framework-bundle": ">=2.1.0,<2.3-dev" + }, + "require-dev": { + "symfony/twig-bundle": ">=2.1.0,<2.3-dev", + "symfony/console": ">=2.1.0,<2.3-dev", + "symfony/class-loader": ">=2.1.0,<2.3-dev", + "symfony/yaml": ">=2.1.0,<2.3-dev", + "symfony/form": ">=2.1.0,<2.3-dev", + "symfony/dom-crawler": ">=2.1.0,<2.3-dev", + "symfony/css-selector": ">=2.1.0,<2.3-dev" + }, + "suggest": { + "symfony/twig-bundle": ">=2.1.0,<2.3-dev" + }, + "time": "1350864366", + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-0": { + "Symfony\\Bundle\\AsseticBundle": "" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kris Wallsmith", + "email": "kris.wallsmith@gmail.com", + "homepage": "http://kriswallsmith.net/" + } + ], + "description": "Integrates Assetic into Symfony2", + "homepage": "https://github.com/symfony/AsseticBundle", + "keywords": [ + "assets", + "compression", + "minification" + ] + }, + { + "name": "symfony/monolog-bundle", + "version": "dev-master", + "target-dir": "Symfony/Bundle/MonologBundle", + "source": { + "type": "git", + "url": "https://github.com/symfony/MonologBundle", + "reference": "51517152a608926ee6b40ed8cfbba1a708f0a14f" + }, + "dist": { + "type": "zip", + "url": "https://github.com/symfony/MonologBundle/zipball/51517152a608926ee6b40ed8cfbba1a708f0a14f", + "reference": "51517152a608926ee6b40ed8cfbba1a708f0a14f", + "shasum": "" + }, + "require": { + "php": ">=5.3.2", + "monolog/monolog": "1.*", + "symfony/monolog-bridge": ">=2.1.0,<2.3-dev", + "symfony/dependency-injection": ">=2.1.0,<2.3-dev", + "symfony/config": ">=2.1.0,<2.3-dev" + }, + "require-dev": { + "symfony/yaml": ">=2.1.0,<2.3-dev", + "symfony/config": ">=2.1.0,<2.3-dev" + }, + "time": "1348137624", + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-0": { + "Symfony\\Bundle\\MonologBundle": "" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony MonologBundle", + "homepage": "http://symfony.com" + }, + { + "name": "symfony/swiftmailer-bundle", + "version": "dev-master", + "target-dir": "Symfony/Bundle/SwiftmailerBundle", + "source": { + "type": "git", + "url": "https://github.com/symfony/SwiftmailerBundle", + "reference": "2393ba6d4f1b544349123e24a16bbc749bef9e55" + }, + "dist": { + "type": "zip", + "url": "https://github.com/symfony/SwiftmailerBundle/zipball/2393ba6d4f1b544349123e24a16bbc749bef9e55", + "reference": "2393ba6d4f1b544349123e24a16bbc749bef9e55", + "shasum": "" + }, + "require": { + "php": ">=5.3.2", + "swiftmailer/swiftmailer": ">=4.2.0,<4.3-dev", + "symfony/swiftmailer-bridge": ">=2.1.0,<2.3-dev" + }, + "require-dev": { + "symfony/dependency-injection": ">=2.1.0,<2.3-dev", + "symfony/http-kernel": ">=2.1.0,<2.3-dev", + "symfony/config": ">=2.1.0,<2.3-dev", + "symfony/yaml": ">=2.1.0,<2.3-dev" + }, + "time": "1350447491", + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-0": { + "Symfony\\Bundle\\SwiftmailerBundle": "" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "Symfony SwiftmailerBundle", + "homepage": "http://symfony.com" + }, + { + "name": "symfony/symfony", + "version": "2.1.x-dev", + "source": { + "type": "git", + "url": "git://github.com/symfony/symfony.git", + "reference": "v2.1.3" + }, + "dist": { + "type": "zip", + "url": "https://github.com/symfony/symfony/zipball/v2.1.3", + "reference": "v2.1.3", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "doctrine/common": ">2.2,<2.4-dev", + "twig/twig": ">=1.9.1,<2.0-dev" + }, + "replace": { + "symfony/doctrine-bridge": "self.version", + "symfony/monolog-bridge": "self.version", + "symfony/propel1-bridge": "self.version", + "symfony/swiftmailer-bridge": "self.version", + "symfony/twig-bridge": "self.version", + "symfony/framework-bundle": "self.version", + "symfony/security-bundle": "self.version", + "symfony/twig-bundle": "self.version", + "symfony/web-profiler-bundle": "self.version", + "symfony/browser-kit": "self.version", + "symfony/class-loader": "self.version", + "symfony/config": "self.version", + "symfony/console": "self.version", + "symfony/css-selector": "self.version", + "symfony/dependency-injection": "self.version", + "symfony/dom-crawler": "self.version", + "symfony/event-dispatcher": "self.version", + "symfony/filesystem": "self.version", + "symfony/finder": "self.version", + "symfony/form": "self.version", + "symfony/http-foundation": "self.version", + "symfony/http-kernel": "self.version", + "symfony/locale": "self.version", + "symfony/options-resolver": "self.version", + "symfony/process": "self.version", + "symfony/routing": "self.version", + "symfony/security": "self.version", + "symfony/serializer": "self.version", + "symfony/templating": "self.version", + "symfony/translation": "self.version", + "symfony/validator": "self.version", + "symfony/yaml": "self.version" + }, + "require-dev": { + "doctrine/dbal": ">=2.2,<2.4-dev", + "doctrine/orm": ">=2.2.3,<2.4-dev", + "doctrine/data-fixtures": "1.0.*", + "propel/propel1": "dev-master", + "monolog/monolog": "1.*" + }, + "time": "1351584854", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-0": { + "Symfony": "src/", + "SessionHandlerInterface": "src/Symfony/Component/HttpFoundation/Resources/stubs" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + } + ], + "description": "The Symfony PHP framework", + "homepage": "http://symfony.com", + "keywords": [ + "framework" + ] + }, + { + "name": "twig/extensions", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/fabpot/Twig-extensions", + "reference": "dcdff02fbac1282e6b8f4d0558cc7e9580105688" + }, + "dist": { + "type": "zip", + "url": "https://github.com/fabpot/Twig-extensions/zipball/dcdff02fbac1282e6b8f4d0558cc7e9580105688", + "reference": "dcdff02fbac1282e6b8f4d0558cc7e9580105688", + "shasum": "" + }, + "require": { + "twig/twig": "1.*" + }, + "time": "1349889206", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-0": { + "Twig_Extensions_": "lib/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Common additional features for Twig that do not directly belong in core", + "homepage": "https://github.com/fabpot/Twig-extensions", + "keywords": [ + "debug", + "i18n", + "text" + ] + }, + { + "name": "twig/twig", + "version": "dev-master", + "source": { + "type": "git", + "url": "git://github.com/fabpot/Twig.git", + "reference": "0505c2fefd5eaa81c628b0cf8a9b8a2bc612321c" + }, + "dist": { + "type": "zip", + "url": "https://github.com/fabpot/Twig/zipball/0505c2fefd5eaa81c628b0cf8a9b8a2bc612321c", + "reference": "0505c2fefd5eaa81c628b0cf8a9b8a2bc612321c", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "time": "1351434618", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.11-dev" + } + }, + "installation-source": "source", + "autoload": { + "psr-0": { + "Twig_": "lib/" + } + }, + "license": [ + "BSD-3" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Armin Ronacher", + "email": "armin.ronacher@active-4.com" + } + ], + "description": "Twig, the flexible, fast, and secure template language for PHP", + "homepage": "http://twig.sensiolabs.org", + "keywords": [ + "templating" + ] + } + ], + "packages-dev": [ + + ], + "aliases": [ + + ], + "minimum-stability": "dev", + "stability-flags": [ + + ] +} diff --git a/src/.htaccess b/src/.htaccess new file mode 100644 index 0000000..3418e55 --- /dev/null +++ b/src/.htaccess @@ -0,0 +1 @@ +deny from all \ No newline at end of file diff --git a/src/Acme/DemoBundle/AcmeDemoBundle.php b/src/Acme/DemoBundle/AcmeDemoBundle.php new file mode 100644 index 0000000..269fc1e --- /dev/null +++ b/src/Acme/DemoBundle/AcmeDemoBundle.php @@ -0,0 +1,9 @@ + $name); + } + + /** + * @Route("/contact", name="_demo_contact") + * @Template() + */ + public function contactAction() + { + $form = $this->get('form.factory')->create(new ContactType()); + + $request = $this->get('request'); + if ('POST' == $request->getMethod()) { + $form->bindRequest($request); + if ($form->isValid()) { + $mailer = $this->get('mailer'); + // .. setup a message and send it + // http://symfony.com/doc/current/cookbook/email.html + + $this->get('session')->setFlash('notice', 'Message sent!'); + + return new RedirectResponse($this->generateUrl('_demo')); + } + } + + return array('form' => $form->createView()); + } +} diff --git a/src/Acme/DemoBundle/Controller/SecuredController.php b/src/Acme/DemoBundle/Controller/SecuredController.php new file mode 100644 index 0000000..9848e42 --- /dev/null +++ b/src/Acme/DemoBundle/Controller/SecuredController.php @@ -0,0 +1,69 @@ +get('request')->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) { + $error = $this->get('request')->attributes->get(SecurityContext::AUTHENTICATION_ERROR); + } else { + $error = $this->get('request')->getSession()->get(SecurityContext::AUTHENTICATION_ERROR); + } + + return array( + 'last_username' => $this->get('request')->getSession()->get(SecurityContext::LAST_USERNAME), + 'error' => $error, + ); + } + + /** + * @Route("/login_check", name="_security_check") + */ + public function securityCheckAction() + { + // The security layer will intercept this request + } + + /** + * @Route("/logout", name="_demo_logout") + */ + public function logoutAction() + { + // The security layer will intercept this request + } + + /** + * @Route("/hello", defaults={"name"="World"}), + * @Route("/hello/{name}", name="_demo_secured_hello") + * @Template() + */ + public function helloAction($name) + { + return array('name' => $name); + } + + /** + * @Route("/hello/admin/{name}", name="_demo_secured_hello_admin") + * @Secure(roles="ROLE_ADMIN") + * @Template() + */ + public function helloadminAction($name) + { + return array('name' => $name); + } +} diff --git a/src/Acme/DemoBundle/Controller/WelcomeController.php b/src/Acme/DemoBundle/Controller/WelcomeController.php new file mode 100644 index 0000000..acceedf --- /dev/null +++ b/src/Acme/DemoBundle/Controller/WelcomeController.php @@ -0,0 +1,18 @@ +render('AcmeDemoBundle:Welcome:index.html.twig'); + } +} diff --git a/src/Acme/DemoBundle/DependencyInjection/AcmeDemoExtension.php b/src/Acme/DemoBundle/DependencyInjection/AcmeDemoExtension.php new file mode 100644 index 0000000..6dfcc82 --- /dev/null +++ b/src/Acme/DemoBundle/DependencyInjection/AcmeDemoExtension.php @@ -0,0 +1,22 @@ +load('services.xml'); + } + + public function getAlias() + { + return 'acme_demo'; + } +} diff --git a/src/Acme/DemoBundle/EventListener/ControllerListener.php b/src/Acme/DemoBundle/EventListener/ControllerListener.php new file mode 100644 index 0000000..5274f71 --- /dev/null +++ b/src/Acme/DemoBundle/EventListener/ControllerListener.php @@ -0,0 +1,25 @@ +extension = $extension; + } + + public function onKernelController(FilterControllerEvent $event) + { + if (HttpKernelInterface::MASTER_REQUEST === $event->getRequestType()) { + $this->extension->setController($event->getController()); + } + } +} diff --git a/src/Acme/DemoBundle/Form/ContactType.php b/src/Acme/DemoBundle/Form/ContactType.php new file mode 100644 index 0000000..2c76cdb --- /dev/null +++ b/src/Acme/DemoBundle/Form/ContactType.php @@ -0,0 +1,20 @@ +add('email', 'email'); + $builder->add('message', 'textarea'); + } + + public function getName() + { + return 'contact'; + } +} diff --git a/src/Acme/DemoBundle/Resources/config/services.xml b/src/Acme/DemoBundle/Resources/config/services.xml new file mode 100644 index 0000000..d6274ce --- /dev/null +++ b/src/Acme/DemoBundle/Resources/config/services.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + diff --git a/src/Acme/DemoBundle/Resources/public/css/demo.css b/src/Acme/DemoBundle/Resources/public/css/demo.css new file mode 100644 index 0000000..0a9d8e2 --- /dev/null +++ b/src/Acme/DemoBundle/Resources/public/css/demo.css @@ -0,0 +1,294 @@ +/* +Copyright (c) 2010, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.com/yui/license.html +version: 2.8.2r1 + +Reset +*/ + +html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var,optgroup{font-style:inherit;font-weight:inherit;}del,ins{text-decoration:none;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym{border:0;font-variant:normal;}sup{vertical-align:baseline;}sub{vertical-align:baseline;}legend{color:#000;}input,button,textarea,select,optgroup,option{font-family:inherit;font-size:inherit;font-style:inherit;font-weight:inherit;}input,button,textarea,select{*font-size:100%;} + +html, body +{ + background-color: #EFEFEF; +} + +body +{ + font-size: 14px; + font-family: "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif; + color: #313131; +} + +a +{ + color: #08C; + text-decoration: none; +} + +a:hover +{ + text-decoration: underline; +} + +strong +{ + font-weight: bold; +} + +em +{ + font-style: italic; +} + +h1, h2, h3 +{ + font-family: Georgia, "Times New Roman", Times, serif; + color: #404040; +} + +h1 +{ + font-size: 45px; + padding-bottom: 30px; +} + +h2 +{ + font-weight: bold; + color: #FFFFFF; + /* Font is duplicated of body (sans-serif) */ + font-family: "Lucida Sans Unicode", "Lucida Grande", Verdana, Arial, Helvetica, sans-serif; + + margin-bottom: 10px; + background-color: #aacd4e; + padding: 2px 4px; + display: inline-block; + text-transform: uppercase; + +} + +p +{ + line-height: 20px; + padding-bottom: 20px; +} + +ul#demo-list a +{ + background: url(../images/blue-arrow.png) no-repeat right 6px; + padding-right: 10px; + margin-right: 30px; +} + +ul, ol +{ + padding-left: 20px; +} + +li +{ + padding-bottom: 18px; +} + +ol li +{ + list-style-type: decimal; +} + +ul li +{ + list-style-type: none; +} + +#symfony-header +{ + position: relative; + padding: 30px 30px 20px 30px; +} + +#symfony-wrapper +{ + width: 970px; + margin: 0 auto; +} + +.symfony-content +{ + background-color: white; + border: 1px solid #DFDFDF; + padding: 50px; + -moz-border-radius: 16px; + -webkit-border-radius: 16px; + border-radius: 16px; + margin-bottom: 20px; + word-wrap: break-word; +} + +#symfony-search +{ + position: absolute; + top: 50px; + right: 30px; +} + +#symfony-search input[type="search"] +{ + -webkit-appearance: textfield; +} + +#symfony-search-field +{ + width: 190px; +} + +#symfony-search label +{ + display: block; + float: left; + width: 20px; + height: 25px; + background: url(../images/search.png) no-repeat left 5px; +} + +#symfony-search label span +{ + display: none; +} + +input[type=text], input[type=password] +{ + border: 1px solid #DADADA; + background: white url(../images/field-background.gif) repeat-x left top; + padding: 5px 6px; + color: #565656; + font-family: 'Lucida Sans Unicode', 'Lucida Grande', Verdana, Arial, Helvetica, sans-serif; + font-size: 12px; +} + +.symfony-button-grey, +.symfony-button-green +{ + font-size: 0.85em; + font-weight: bold; + + cursor: pointer; + + display: inline-block; + outline: none; + + text-align: center; + text-transform: uppercase; + + padding: 3px 10px; + + text-shadow: 0 1px 1px rgba(0,0,0,.3); + + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.symfony-button-grey +{ + color: #868686; + font-weight: normal; + + padding: 5px 10px; + border: solid 1px #d7d7d7; + background: #ffffff; + background: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#d7d7d7)); + background: -moz-linear-gradient(top, #ffffff, #d7d7d7); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#d7d7d7'); +} + +.symfony-button-green +{ + padding: 5px 12px; + + color: white; + + border: solid 1px #a7da39; + background: #a7da39; + background: -webkit-gradient(linear, left top, left bottom, from(#a7da39), to(#6a9211)); + background: -moz-linear-gradient(top, #a7da39, #6a9211); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#a7da39', endColorstr='#6a9211'); +} + +.symfony-blocks-welcome +{ + overflow: hidden; +} + +.symfony-blocks-welcome > div +{ + background-color: whitesmoke; + float: left; + width: 240px; + margin-right: 14px; + text-align: center; + padding: 26px 20px; +} + +.symfony-blocks-welcome > div.block-demo +{ + margin-right: 0; +} + +.symfony-blocks-welcome .illustration +{ + padding-bottom: 20px; +} + +.symfony-blocks-help +{ + overflow: hidden; +} + +.symfony-blocks-help +{ + margin-top: 30px; + padding: 18px; + border: 1px solid #E6E6E6; +} + +.symfony-blocks-help > div +{ + width: 254px; + float: left; +} + +.flash-message +{ + padding: 10px; + margin: 5px; + margin-top: 15px; + background-color: #ffe; +} + +.error +{ + color: red; +} + +#login label, #contact_form label +{ + display: block; + float: left; + width: 90px; +} + +ul#menu +{ + float: right; + margin-bottom: 20px; + padding-left: 0; +} + +#menu li +{ + padding-left: 0; + margin-right: 10px; + display: inline; +} diff --git a/src/Acme/DemoBundle/Resources/public/images/blue-arrow.png b/src/Acme/DemoBundle/Resources/public/images/blue-arrow.png new file mode 100644 index 0000000..fa82d4b Binary files /dev/null and b/src/Acme/DemoBundle/Resources/public/images/blue-arrow.png differ diff --git a/src/Acme/DemoBundle/Resources/public/images/field-background.gif b/src/Acme/DemoBundle/Resources/public/images/field-background.gif new file mode 100644 index 0000000..7c0efc1 Binary files /dev/null and b/src/Acme/DemoBundle/Resources/public/images/field-background.gif differ diff --git a/src/Acme/DemoBundle/Resources/public/images/logo.gif b/src/Acme/DemoBundle/Resources/public/images/logo.gif new file mode 100644 index 0000000..703cf45 Binary files /dev/null and b/src/Acme/DemoBundle/Resources/public/images/logo.gif differ diff --git a/src/Acme/DemoBundle/Resources/public/images/search.png b/src/Acme/DemoBundle/Resources/public/images/search.png new file mode 100644 index 0000000..3c88b6a Binary files /dev/null and b/src/Acme/DemoBundle/Resources/public/images/search.png differ diff --git a/src/Acme/DemoBundle/Resources/public/images/welcome-configure.gif b/src/Acme/DemoBundle/Resources/public/images/welcome-configure.gif new file mode 100644 index 0000000..931179a Binary files /dev/null and b/src/Acme/DemoBundle/Resources/public/images/welcome-configure.gif differ diff --git a/src/Acme/DemoBundle/Resources/public/images/welcome-demo.gif b/src/Acme/DemoBundle/Resources/public/images/welcome-demo.gif new file mode 100644 index 0000000..0623de5 Binary files /dev/null and b/src/Acme/DemoBundle/Resources/public/images/welcome-demo.gif differ diff --git a/src/Acme/DemoBundle/Resources/public/images/welcome-quick-tour.gif b/src/Acme/DemoBundle/Resources/public/images/welcome-quick-tour.gif new file mode 100644 index 0000000..b9018b1 Binary files /dev/null and b/src/Acme/DemoBundle/Resources/public/images/welcome-quick-tour.gif differ diff --git a/src/Acme/DemoBundle/Resources/views/Demo/contact.html.twig b/src/Acme/DemoBundle/Resources/views/Demo/contact.html.twig new file mode 100644 index 0000000..e5b7523 --- /dev/null +++ b/src/Acme/DemoBundle/Resources/views/Demo/contact.html.twig @@ -0,0 +1,15 @@ +{% extends "AcmeDemoBundle::layout.html.twig" %} + +{% block title "Symfony - Contact form" %} + +{% block content %} +
+ {{ form_errors(form) }} + + {{ form_row(form.email) }} + {{ form_row(form.message) }} + + {{ form_rest(form) }} + +
+{% endblock %} diff --git a/src/Acme/DemoBundle/Resources/views/Demo/hello.html.twig b/src/Acme/DemoBundle/Resources/views/Demo/hello.html.twig new file mode 100644 index 0000000..3997ff6 --- /dev/null +++ b/src/Acme/DemoBundle/Resources/views/Demo/hello.html.twig @@ -0,0 +1,9 @@ +{% extends "AcmeDemoBundle::layout.html.twig" %} + +{% block title "Hello " ~ name %} + +{% block content %} +

Hello {{ name }}!

+{% endblock %} + +{% set code = code(_self) %} diff --git a/src/Acme/DemoBundle/Resources/views/Demo/index.html.twig b/src/Acme/DemoBundle/Resources/views/Demo/index.html.twig new file mode 100644 index 0000000..75f118d --- /dev/null +++ b/src/Acme/DemoBundle/Resources/views/Demo/index.html.twig @@ -0,0 +1,14 @@ +{% extends "AcmeDemoBundle::layout.html.twig" %} + +{% block title "Symfony - Demos" %} + +{% block content_header '' %} + +{% block content %} +

Available demos

+ +{% endblock %} diff --git a/src/Acme/DemoBundle/Resources/views/Secured/hello.html.twig b/src/Acme/DemoBundle/Resources/views/Secured/hello.html.twig new file mode 100644 index 0000000..c8da283 --- /dev/null +++ b/src/Acme/DemoBundle/Resources/views/Secured/hello.html.twig @@ -0,0 +1,11 @@ +{% extends "AcmeDemoBundle:Secured:layout.html.twig" %} + +{% block title "Hello " ~ name %} + +{% block content %} +

Hello {{ name }}!

+ + Hello resource secured for admin only. +{% endblock %} + +{% set code = code(_self) %} diff --git a/src/Acme/DemoBundle/Resources/views/Secured/helloadmin.html.twig b/src/Acme/DemoBundle/Resources/views/Secured/helloadmin.html.twig new file mode 100644 index 0000000..425213e --- /dev/null +++ b/src/Acme/DemoBundle/Resources/views/Secured/helloadmin.html.twig @@ -0,0 +1,9 @@ +{% extends "AcmeDemoBundle:Secured:layout.html.twig" %} + +{% block title "Hello " ~ name %} + +{% block content %} +

Hello {{ name }} secured for Admins only!

+{% endblock %} + +{% set code = code(_self) %} diff --git a/src/Acme/DemoBundle/Resources/views/Secured/layout.html.twig b/src/Acme/DemoBundle/Resources/views/Secured/layout.html.twig new file mode 100644 index 0000000..aeea55c --- /dev/null +++ b/src/Acme/DemoBundle/Resources/views/Secured/layout.html.twig @@ -0,0 +1,6 @@ +{% extends "AcmeDemoBundle::layout.html.twig" %} + +{% block content_header_more %} + {{ parent() }} +
  • logged in as {{ app.user ? app.user.username : 'Anonymous' }} - Logout
  • +{% endblock %} diff --git a/src/Acme/DemoBundle/Resources/views/Secured/login.html.twig b/src/Acme/DemoBundle/Resources/views/Secured/login.html.twig new file mode 100644 index 0000000..005175d --- /dev/null +++ b/src/Acme/DemoBundle/Resources/views/Secured/login.html.twig @@ -0,0 +1,29 @@ +{% extends 'AcmeDemoBundle::layout.html.twig' %} + +{% block content %} +

    Login

    + +

    + Choose between two default users: user/userpass (ROLE_USER) or admin/adminpass (ROLE_ADMIN) +

    + + {% if error %} +
    {{ error.message }}
    + {% endif %} + +
    +
    + + +
    + +
    + + +
    + + +
    +{% endblock %} + +{% set code = code(_self) %} diff --git a/src/Acme/DemoBundle/Resources/views/Welcome/index.html.twig b/src/Acme/DemoBundle/Resources/views/Welcome/index.html.twig new file mode 100644 index 0000000..e373981 --- /dev/null +++ b/src/Acme/DemoBundle/Resources/views/Welcome/index.html.twig @@ -0,0 +1,65 @@ +{% extends 'AcmeDemoBundle::layout.html.twig' %} + +{% block title %}Symfony - Welcome{% endblock %} + +{% block content_header '' %} + +{% block content %} + {% set version = constant('Symfony\\Component\\HttpKernel\\Kernel::MAJOR_VERSION') ~ '.' ~ constant('Symfony\\Component\\HttpKernel\\Kernel::MINOR_VERSION')%} + +

    Welcome!

    + +

    Congratulations! You have successfully installed a new Symfony application.

    + +
    + + {% if app.environment == 'dev' %} +
    +
    + Configure your application +
    + Configure +
    + {% endif %} +
    +
    + Demo +
    + Run The Demo +
    +
    + +
    +
    + +
    +
    + +
    +
    + +
    +
    +{% endblock %} diff --git a/src/Acme/DemoBundle/Resources/views/layout.html.twig b/src/Acme/DemoBundle/Resources/views/layout.html.twig new file mode 100644 index 0000000..3dd3936 --- /dev/null +++ b/src/Acme/DemoBundle/Resources/views/layout.html.twig @@ -0,0 +1,49 @@ + + + + + {% block title %}Demo Bundle{% endblock %} + + + + +
    +
    + + Symfony logo + + +
    + + {% for flashMessage in app.session.flashbag.get('notice') %} +
    + Notice: {{ flashMessage }} +
    + {% endfor %} + + {% block content_header %} + + +
    + {% endblock %} + +
    + {% block content %} + {% endblock %} +
    + + {% if code is defined %} +

    Code behind this page

    +
    {{ code|raw }}
    + {% endif %} +
    + + diff --git a/src/Acme/DemoBundle/Tests/Controller/DemoControllerTest.php b/src/Acme/DemoBundle/Tests/Controller/DemoControllerTest.php new file mode 100644 index 0000000..2941af9 --- /dev/null +++ b/src/Acme/DemoBundle/Tests/Controller/DemoControllerTest.php @@ -0,0 +1,17 @@ +request('GET', '/demo/hello/Fabien'); + + $this->assertTrue($crawler->filter('html:contains("Hello Fabien")')->count() > 0); + } +} diff --git a/src/Acme/DemoBundle/Twig/Extension/DemoExtension.php b/src/Acme/DemoBundle/Twig/Extension/DemoExtension.php new file mode 100644 index 0000000..8f6533a --- /dev/null +++ b/src/Acme/DemoBundle/Twig/Extension/DemoExtension.php @@ -0,0 +1,80 @@ +loader = $loader; + } + + public function setController($controller) + { + $this->controller = $controller; + } + + /** + * {@inheritdoc} + */ + public function getFunctions() + { + return array( + 'code' => new \Twig_Function_Method($this, 'getCode', array('is_safe' => array('html'))), + ); + } + + public function getCode($template) + { + $controller = htmlspecialchars($this->getControllerCode(), ENT_QUOTES, 'UTF-8'); + $template = htmlspecialchars($this->getTemplateCode($template), ENT_QUOTES, 'UTF-8'); + + // remove the code block + $template = str_replace('{% set code = code(_self) %}', '', $template); + + return <<Controller Code

    +
    $controller
    + +

    Template Code

    +
    $template
    +EOF; + } + + protected function getControllerCode() + { + $class = get_class($this->controller[0]); + if (class_exists('CG\Core\ClassUtils')) { + $class = ClassUtils::getUserClass($class); + } + + $r = new \ReflectionClass($class); + $m = $r->getMethod($this->controller[1]); + + $code = file($r->getFilename()); + + return ' '.$m->getDocComment()."\n".implode('', array_slice($code, $m->getStartline() - 1, $m->getEndLine() - $m->getStartline() + 1)); + } + + protected function getTemplateCode($template) + { + return $this->loader->getSource($template->getTemplateName()); + } + + /** + * Returns the name of the extension. + * + * @return string The extension name + */ + public function getName() + { + return 'demo'; + } +} diff --git a/web/.htaccess b/web/.htaccess new file mode 100644 index 0000000..08dce6f --- /dev/null +++ b/web/.htaccess @@ -0,0 +1,10 @@ + + RewriteEngine On + + # + # RewriteBase / + # + + RewriteCond %{REQUEST_FILENAME} !-f + RewriteRule ^(.*)$ app.php [QSA,L] + diff --git a/web/app.php b/web/app.php new file mode 100644 index 0000000..2b4d5e7 --- /dev/null +++ b/web/app.php @@ -0,0 +1,24 @@ +register(true); +*/ + +require_once __DIR__.'/../app/AppKernel.php'; +//require_once __DIR__.'/../app/AppCache.php'; + +$kernel = new AppKernel('prod', false); +$kernel->loadClassCache(); +//$kernel = new AppCache($kernel); +$request = Request::createFromGlobals(); +$response = $kernel->handle($request); +$response->send(); +$kernel->terminate($request, $response); diff --git a/web/app_dev.php b/web/app_dev.php new file mode 100644 index 0000000..5a05245 --- /dev/null +++ b/web/app_dev.php @@ -0,0 +1,30 @@ +loadClassCache(); +$request = Request::createFromGlobals(); +$response = $kernel->handle($request); +$response->send(); +$kernel->terminate($request, $response); diff --git a/web/apple-touch-icon.png b/web/apple-touch-icon.png new file mode 100644 index 0000000..11f17e6 Binary files /dev/null and b/web/apple-touch-icon.png differ diff --git a/web/config.php b/web/config.php new file mode 100644 index 0000000..ad215f3 --- /dev/null +++ b/web/config.php @@ -0,0 +1,98 @@ +getFailedRequirements(); +$minorProblems = $symfonyRequirements->getFailedRecommendations(); + +?> + + + + + + Symfony Configuration + + +
    +
    +
    + + +
    +

    Welcome!

    +

    Welcome to your new Symfony project.

    +

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

    + + +

    Major problems

    +

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

    +
      + +
    1. getHelpHtml() ?>
    2. + +
    + + + +

    Recommendations

    +

    + Additionally, toTo enhance your Symfony experience, + it’s recommended that you fix the following: +

    +
      + +
    1. getHelpHtml() ?>
    2. + +
    + + + hasPhpIniConfigIssue()): ?> +

    * + getPhpIniConfigPath()): ?> + Changes to the php.ini file must be done in "getPhpIniConfigPath() ?>". + + To change settings, create a "php.ini". + +

    + + + +

    Your configuration looks good to run Symfony.

    + + + +
    +
    +
    +
    Symfony Standard Edition
    +
    + + diff --git a/web/favicon.ico b/web/favicon.ico new file mode 100644 index 0000000..8648036 Binary files /dev/null and b/web/favicon.ico differ diff --git a/web/robots.txt b/web/robots.txt new file mode 100644 index 0000000..214e411 --- /dev/null +++ b/web/robots.txt @@ -0,0 +1,4 @@ +# www.robotstxt.org/ +# www.google.com/support/webmasters/bin/answer.py?hl=en&answer=156449 + +User-agent: *