From 8c12847e359e4e5e82968a1f5f0a3eaa9a49b439 Mon Sep 17 00:00:00 2001 From: Lukas Kahwe Smith Date: Sun, 17 Aug 2014 23:58:32 +0200 Subject: [PATCH 01/11] use dev packages --- composer.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index f9c66f13ed..3df7f9390b 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ "autoload": { "psr-0": { "": "src/" } }, - "minimum-stability": "stable", + "minimum-stability": "dev", "require": { "php": ">=5.3.3", "symfony/symfony": "2.3.*", @@ -25,9 +25,9 @@ "symfony/assetic-bundle": "2.3.*", "symfony/swiftmailer-bundle": "2.3.*", "symfony/monolog-bundle": "2.3.*", - "symfony-cmf/symfony-cmf": "1.1.*", - "symfony-cmf/simple-cms-bundle": "1.1.*", - "symfony-cmf/create-bundle": "1.1.*", + "symfony-cmf/symfony-cmf": "1.2.*", + "symfony-cmf/simple-cms-bundle": "1.2.*", + "symfony-cmf/create-bundle": "1.2.*", "sensio/distribution-bundle": "2.3.*", "sensio/framework-extra-bundle": "2.3.*", "sensio/generator-bundle": "2.3.*", @@ -65,7 +65,7 @@ "file": "app/config/parameters.yml" }, "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "1.2-dev" } } } From 76328fe2dd8fde42aba19018ae0d30e7ab091889 Mon Sep 17 00:00:00 2001 From: Lukas Kahwe Smith Date: Thu, 28 Aug 2014 15:31:49 +0200 Subject: [PATCH 02/11] ignore the composer.lock --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index c10bc31ff3..481c83ed72 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ /bin/ /composer.phar *.sqlite +composer.lock \ No newline at end of file From 7f345e1d3088d34a2b0dfea01f754b5e44e00436 Mon Sep 17 00:00:00 2001 From: Lukas Kahwe Smith Date: Fri, 29 Aug 2014 14:25:05 +0200 Subject: [PATCH 03/11] removed unnecessary use statements --- src/Acme/DemoBundle/Document/UnitBlock.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Acme/DemoBundle/Document/UnitBlock.php b/src/Acme/DemoBundle/Document/UnitBlock.php index b8480cd3fe..86751fa511 100644 --- a/src/Acme/DemoBundle/Document/UnitBlock.php +++ b/src/Acme/DemoBundle/Document/UnitBlock.php @@ -2,10 +2,7 @@ namespace Acme\DemoBundle\Document; -use Sonata\BlockBundle\Block\BlockContextInterface; use Symfony\Cmf\Bundle\BlockBundle\Doctrine\Phpcr\AbstractBlock; -use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\OptionsResolver\OptionsResolverInterface; use Doctrine\ODM\PHPCR\Mapping\Annotations as PHPCR; /** From e0e698d9f83f1da7c7a0d5454a47099e6ef37c09 Mon Sep 17 00:00:00 2001 From: WouterJ Date: Tue, 9 Sep 2014 22:29:08 +0200 Subject: [PATCH 04/11] Fetched core SE --- .gitignore | 1 + LICENSE | 2 +- app/.htaccess | 8 ++++++- app/SymfonyRequirements.php | 38 ++++++++++++++++++++++++++-------- app/config/config_dev.yml | 6 +++--- app/config/parameters.yml.dist | 4 ++++ app/config/security.yml | 2 +- app/phpunit.xml.dist | 21 +++++++------------ composer.json | 20 +++++++++--------- src/.htaccess | 8 ++++++- web/app.php | 9 ++++---- web/app_dev.php | 2 +- 12 files changed, 76 insertions(+), 45 deletions(-) diff --git a/.gitignore b/.gitignore index 481c83ed72..1a193d3de9 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ /app/logs/* !app/cache/.gitkeep !app/logs/.gitkeep +/app/phpunit.xml /build/ /vendor/ /bin/ diff --git a/LICENSE b/LICENSE index 88a57f8d8d..b832f11e04 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2004-2013 Fabien Potencier +Copyright (c) 2004-2014 Symfony CMF Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/app/.htaccess b/app/.htaccess index 3418e55a68..fb1de45bdb 100644 --- a/app/.htaccess +++ b/app/.htaccess @@ -1 +1,7 @@ -deny from all \ No newline at end of file + + Require all denied + + + Order deny,allow + Deny from all + diff --git a/app/SymfonyRequirements.php b/app/SymfonyRequirements.php index fb70f803fd..25bc938e25 100644 --- a/app/SymfonyRequirements.php +++ b/app/SymfonyRequirements.php @@ -409,18 +409,20 @@ public function __construct() 'Then run "php composer.phar install" to install them.' ); - $baseDir = basename(__DIR__); + $cacheDir = is_dir(__DIR__.'/../var/cache') ? __DIR__.'/../var/cache' : __DIR__.'/cache'; $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." + is_writable($cacheDir), + 'app/cache/ or var/cache/ directory must be writable', + 'Change the permissions of either "app/cache/" or "var/cache/" directory so that the web server can write into it.' ); + $logsDir = is_dir(__DIR__.'/../var/logs') ? __DIR__.'/../var/logs' : __DIR__.'/logs'; + $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." + is_writable($logsDir), + 'app/logs/ or var/logs/ directory must be writable', + 'Change the permissions of either "app/logs/" or "var/logs/" directory so that the web server can write into it.' ); $this->addPhpIniRequirement( @@ -600,6 +602,12 @@ function_exists('utf8_decode'), 'Install and enable the XML extension.' ); + $this->addRecommendation( + function_exists('filter_var'), + 'filter_var() should be available', + 'Install and enable the filter extension.' + ); + if (!defined('PHP_WINDOWS_VERSION_BUILD')) { $this->addRecommendation( function_exists('posix_isatty'), @@ -648,6 +656,8 @@ class_exists('Locale'), || (extension_loaded('apc') && ini_get('apc.enabled')) || + (extension_loaded('Zend Optimizer+') && ini_get('zend_optimizerplus.enable')) + || (extension_loaded('Zend OPcache') && ini_get('opcache.enable')) || (extension_loaded('xcache') && ini_get('xcache.cacher')) @@ -658,9 +668,19 @@ class_exists('Locale'), $this->addRecommendation( $accelerator, 'a PHP accelerator should be installed', - 'Install and enable a PHP accelerator like APC (highly recommended).' + 'Install and/or enable a PHP accelerator (highly recommended).' ); + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { + $this->addPhpIniRecommendation( + 'realpath_cache_size', + create_function('$cfgValue', 'return (int) $cfgValue > 1000;'), + false, + 'realpath_cache_size should be above 1024 in php.ini', + 'Set "realpath_cache_size" to e.g. "1024" in php.ini* to improve performance on windows.' + ); + } + $this->addPhpIniRecommendation('short_open_tag', false); $this->addPhpIniRecommendation('magic_quotes_gpc', false, true); @@ -678,7 +698,7 @@ class_exists('PDO'), if (class_exists('PDO')) { $drivers = PDO::getAvailableDrivers(); $this->addRecommendation( - count($drivers), + count($drivers) > 0, 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/config/config_dev.yml b/app/config/config_dev.yml index a724592dff..afdabf29cc 100644 --- a/app/config/config_dev.yml +++ b/app/config/config_dev.yml @@ -8,8 +8,8 @@ framework: profiler: { only_exceptions: false } web_profiler: - toolbar: true - intercept_redirects: false + toolbar: "%debug_toolbar%" + intercept_redirects: "%debug_redirects%" monolog: handlers: @@ -27,7 +27,7 @@ monolog: # level: info assetic: - use_controller: true + use_controller: "%use_assetic_controller%" #swiftmailer: # delivery_address: me@example.com diff --git a/app/config/parameters.yml.dist b/app/config/parameters.yml.dist index 06e291daf5..c73c650366 100644 --- a/app/config/parameters.yml.dist +++ b/app/config/parameters.yml.dist @@ -20,3 +20,7 @@ parameters: locale: en secret: ThisTokenIsNotSoSecretChangeIt + + debug_toolbar: true + debug_redirects: false + use_assetic_controller: true diff --git a/app/config/security.yml b/app/config/security.yml index 4428fba1f3..341507be52 100644 --- a/app/config/security.yml +++ b/app/config/security.yml @@ -18,7 +18,7 @@ security: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false - main: + default: pattern: ^/ anonymous: ~ form_login: diff --git a/app/phpunit.xml.dist b/app/phpunit.xml.dist index 1e31086ded..4a831565a0 100644 --- a/app/phpunit.xml.dist +++ b/app/phpunit.xml.dist @@ -1,18 +1,12 @@ - - - + + ../src/*/*Bundle/Tests @@ -37,5 +31,4 @@ - diff --git a/composer.json b/composer.json index 3df7f9390b..520615ad6c 100644 --- a/composer.json +++ b/composer.json @@ -16,26 +16,26 @@ "minimum-stability": "dev", "require": { "php": ">=5.3.3", - "symfony/symfony": "2.3.*", + "symfony/symfony": "~2.5", "jackalope/jackalope-doctrine-dbal": "1.1.*", - "doctrine/doctrine-bundle": "1.2.*", + "doctrine/doctrine-bundle": "~1.2", "doctrine/data-fixtures": "1.0.*", "doctrine/doctrine-cache-bundle": "1.0.*", - "twig/extensions": "1.0.*", - "symfony/assetic-bundle": "2.3.*", - "symfony/swiftmailer-bundle": "2.3.*", - "symfony/monolog-bundle": "2.3.*", + "twig/extensions": "~1.0", + "symfony/assetic-bundle": "~2.3", + "symfony/swiftmailer-bundle": "~2.3", + "symfony/monolog-bundle": "~2.4", "symfony-cmf/symfony-cmf": "1.2.*", "symfony-cmf/simple-cms-bundle": "1.2.*", "symfony-cmf/create-bundle": "1.2.*", - "sensio/distribution-bundle": "2.3.*", - "sensio/framework-extra-bundle": "2.3.*", - "sensio/generator-bundle": "2.3.*", + "sensio/distribution-bundle": "~3.0", + "sensio/framework-extra-bundle": "~3.0", "incenteev/composer-parameter-handler": "~2.0", "nelmio/alice": "1.*" }, "require-dev": { - "liip/functional-test-bundle": "1.0.*" + "liip/functional-test-bundle": "1.0.*", + "sensio/generator-bundle": "~2.3" }, "scripts": { "post-install-cmd": [ diff --git a/src/.htaccess b/src/.htaccess index 3418e55a68..fb1de45bdb 100644 --- a/src/.htaccess +++ b/src/.htaccess @@ -1 +1,7 @@ -deny from all \ No newline at end of file + + Require all denied + + + Order deny,allow + Deny from all + diff --git a/web/app.php b/web/app.php index 4f591c107c..c5c2640906 100644 --- a/web/app.php +++ b/web/app.php @@ -5,11 +5,12 @@ $loader = require_once __DIR__.'/../app/bootstrap.php.cache'; -// Use APC for autoloading to improve performance. -// Change 'sf2' to a unique prefix in order to prevent cache key conflicts -// with other applications also using APC. +// Enable APC for autoloading to improve performance. +// You should change the ApcClassLoader first argument to a unique prefix +// in order to prevent cache key conflicts with other applications +// also using APC. /* -$apcLoader = new ApcClassLoader('sf2', $loader); +$apcLoader = new ApcClassLoader(sha1(__FILE__), $loader); $loader->unregister(); $apcLoader->register(true); */ diff --git a/web/app_dev.php b/web/app_dev.php index 872a882835..e0279c2aeb 100644 --- a/web/app_dev.php +++ b/web/app_dev.php @@ -11,7 +11,7 @@ // Feel free to remove this, extend it, or make something more sophisticated. if (isset($_SERVER['HTTP_CLIENT_IP']) || isset($_SERVER['HTTP_X_FORWARDED_FOR']) - || !in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', 'fe80::1', '::1')) + || !(in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', 'fe80::1', '::1')) || php_sapi_name() === 'cli-server') ) { header('HTTP/1.0 403 Forbidden'); exit('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.'); From 0a747cfda85ba83676262bf328890b31fcaedcc9 Mon Sep 17 00:00:00 2001 From: Lukas Kahwe Smith Date: Tue, 21 Oct 2014 17:29:04 +0200 Subject: [PATCH 05/11] add php 5.6 --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 08a1871293..30a6071bad 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,7 @@ php: - 5.3 - 5.4 - 5.5 + - 5.6 - hhvm matrix: From 9563014f74051fafc0cc5a3e9524f8a1167038e6 Mon Sep 17 00:00:00 2001 From: Lukas Kahwe Smith Date: Thu, 23 Oct 2014 13:39:23 +0200 Subject: [PATCH 06/11] prepare 1.2 stable --- .gitignore | 4 +- app/SymfonyRequirements.php | 707 ------------------------------------ app/check.php | 62 ---- composer.json | 2 +- 4 files changed, 4 insertions(+), 771 deletions(-) delete mode 100644 app/SymfonyRequirements.php delete mode 100644 app/check.php diff --git a/.gitignore b/.gitignore index 1a193d3de9..c3fabf6da6 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,6 @@ /bin/ /composer.phar *.sqlite -composer.lock \ No newline at end of file +composer.lock +app/check.php +app/SymfonyRequirements.php \ No newline at end of file diff --git a/app/SymfonyRequirements.php b/app/SymfonyRequirements.php deleted file mode 100644 index 25bc938e25..0000000000 --- a/app/SymfonyRequirements.php +++ /dev/null @@ -1,707 +0,0 @@ - - * - * 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 overridden 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 recommendations. - * - * @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.' - ); - - $cacheDir = is_dir(__DIR__.'/../var/cache') ? __DIR__.'/../var/cache' : __DIR__.'/cache'; - - $this->addRequirement( - is_writable($cacheDir), - 'app/cache/ or var/cache/ directory must be writable', - 'Change the permissions of either "app/cache/" or "var/cache/" directory so that the web server can write into it.' - ); - - $logsDir = is_dir(__DIR__.'/../var/logs') ? __DIR__.'/../var/logs' : __DIR__.'/logs'; - - $this->addRequirement( - is_writable($logsDir), - 'app/logs/ or var/logs/ directory must be writable', - 'Change the permissions of either "app/logs/" or "var/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, '>=')) { - $timezones = array(); - foreach (DateTimeZone::listAbbreviations() as $abbreviations) { - foreach ($abbreviations as $abbreviation) { - $timezones[$abbreviation['timezone_id']] = true; - } - } - - $this->addRequirement( - isset($timezones[date_default_timezone_get()]), - 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')) { - if (version_compare($installedPhpVersion, '5.4.0', '>=')) { - $this->addRequirement( - version_compare(phpversion('apc'), '3.1.13', '>='), - 'APC version must be at least 3.1.13 when using PHP 5.4', - 'Upgrade your APC extension (3.1.13+).' - ); - } else { - $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 - ); - - $this->addPhpIniRecommendation( - 'xdebug.max_nesting_level', - create_function('$cfgValue', 'return $cfgValue > 100;'), - true, - 'xdebug.max_nesting_level should be above 100 in php.ini', - 'Set "xdebug.max_nesting_level" to e.g. "250" in php.ini* to stop Xdebug\'s infinite recursion protection erroneously throwing a fatal error in your project.' - ); - } - - $pcreVersion = defined('PCRE_VERSION') ? (float) PCRE_VERSION : null; - - $this->addRequirement( - null !== $pcreVersion, - 'PCRE extension must be available', - 'Install the PCRE extension (version 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( - version_compare($installedPhpVersion, '5.4.11', '>='), - 'When using the logout handler from the Symfony Security Component, you should have at least PHP 5.4.11 due to PHP bug #63379 (as a workaround, you can also set invalidate_session to false in the security logout handler configuration)', - 'Install PHP 5.4.11 or newer if your project uses the logout handler from the Symfony Security Component.' - ); - - $this->addRecommendation( - (version_compare($installedPhpVersion, '5.3.18', '>=') && version_compare($installedPhpVersion, '5.4.0', '<')) - || - version_compare($installedPhpVersion, '5.4.8', '>='), - 'You should use PHP 5.3.18+ or PHP 5.4.8+ to always get nice error messages for fatal errors in the development environment due to PHP bug #61767/#60909', - 'Install PHP 5.3.18+ or PHP 5.4.8+ if you want nice error messages for all fatal errors in the development environment.' - ); - - if (null !== $pcreVersion) { - $this->addRecommendation( - $pcreVersion >= 8.0, - sprintf('PCRE extension should be at least version 8.0 (%s installed)', $pcreVersion), - 'PCRE 8.0+ is preconfigured in PHP since 5.3.2 but you are using an outdated version of it. Symfony probably works anyway but it is recommended to upgrade your PCRE extension.' - ); - } - - $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.' - ); - - $this->addRecommendation( - function_exists('filter_var'), - 'filter_var() should be available', - 'Install and enable the filter 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 = - (extension_loaded('eaccelerator') && ini_get('eaccelerator.enable')) - || - (extension_loaded('apc') && ini_get('apc.enabled')) - || - (extension_loaded('Zend Optimizer+') && ini_get('zend_optimizerplus.enable')) - || - (extension_loaded('Zend OPcache') && ini_get('opcache.enable')) - || - (extension_loaded('xcache') && ini_get('xcache.cacher')) - || - (extension_loaded('wincache') && ini_get('wincache.ocenabled')) - ; - - $this->addRecommendation( - $accelerator, - 'a PHP accelerator should be installed', - 'Install and/or enable a PHP accelerator (highly recommended).' - ); - - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - $this->addPhpIniRecommendation( - 'realpath_cache_size', - create_function('$cfgValue', 'return (int) $cfgValue > 1000;'), - false, - 'realpath_cache_size should be above 1024 in php.ini', - 'Set "realpath_cache_size" to e.g. "1024" in php.ini* to improve performance on windows.' - ); - } - - $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) > 0, - 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/check.php b/app/check.php deleted file mode 100644 index 91b826befe..0000000000 --- a/app/check.php +++ /dev/null @@ -1,62 +0,0 @@ -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'); - -$checkPassed = true; -foreach ($symfonyRequirements->getRequirements() as $req) { - /** @var $req Requirement */ - echo_requirement($req); - if (!$req->isFulfilled()) { - $checkPassed = false; - } -} - -echo_title('Optional recommendations'); - -foreach ($symfonyRequirements->getRecommendations() as $req) { - echo_requirement($req); -} - -exit($checkPassed ? 0 : 1); - -/** - * 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/composer.json b/composer.json index 520615ad6c..f6692e6cf1 100644 --- a/composer.json +++ b/composer.json @@ -13,7 +13,7 @@ "autoload": { "psr-0": { "": "src/" } }, - "minimum-stability": "dev", + "minimum-stability": "stable", "require": { "php": ">=5.3.3", "symfony/symfony": "~2.5", From d04f042fc266086e2ae311bcaaf7df48373fb5b3 Mon Sep 17 00:00:00 2001 From: Lukas Kahwe Smith Date: Thu, 23 Oct 2014 14:54:07 +0200 Subject: [PATCH 07/11] tighten dependencies --- composer.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index f6692e6cf1..ec2a65ad40 100644 --- a/composer.json +++ b/composer.json @@ -17,10 +17,9 @@ "require": { "php": ">=5.3.3", "symfony/symfony": "~2.5", - "jackalope/jackalope-doctrine-dbal": "1.1.*", "doctrine/doctrine-bundle": "~1.2", - "doctrine/data-fixtures": "1.0.*", - "doctrine/doctrine-cache-bundle": "1.0.*", + "doctrine/data-fixtures": "~1.0", + "doctrine/doctrine-cache-bundle": "~1.0", "twig/extensions": "~1.0", "symfony/assetic-bundle": "~2.3", "symfony/swiftmailer-bundle": "~2.3", @@ -28,13 +27,14 @@ "symfony-cmf/symfony-cmf": "1.2.*", "symfony-cmf/simple-cms-bundle": "1.2.*", "symfony-cmf/create-bundle": "1.2.*", + "jackalope/jackalope-doctrine-dbal": "1.1.*", "sensio/distribution-bundle": "~3.0", "sensio/framework-extra-bundle": "~3.0", "incenteev/composer-parameter-handler": "~2.0", - "nelmio/alice": "1.*" + "nelmio/alice": "~1.0" }, "require-dev": { - "liip/functional-test-bundle": "1.0.*", + "liip/functional-test-bundle": "~1.0", "sensio/generator-bundle": "~2.3" }, "scripts": { From b02ebb04e90f385d44d9428998c030d4d93f3785 Mon Sep 17 00:00:00 2001 From: Lukas Kahwe Smith Date: Sat, 25 Oct 2014 14:05:29 +0200 Subject: [PATCH 08/11] validate we have the right type of object manager in the fixtures --- src/Acme/DemoBundle/DataFixtures/PHPCR/LoadDemoData.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Acme/DemoBundle/DataFixtures/PHPCR/LoadDemoData.php b/src/Acme/DemoBundle/DataFixtures/PHPCR/LoadDemoData.php index 8a7c9cd3b9..2eafaf39f7 100644 --- a/src/Acme/DemoBundle/DataFixtures/PHPCR/LoadDemoData.php +++ b/src/Acme/DemoBundle/DataFixtures/PHPCR/LoadDemoData.php @@ -21,6 +21,11 @@ class LoadDemoData implements FixtureInterface */ public function load(ObjectManager $manager) { + if (!$manager instanceof DocumentManager) { + $class = get_class($manager); + throw new \RuntimeException("Fixture requires a PHPCR ODM DocumentManager instance, instance of '$class' given."); + } + // tweak homepage $page = $manager->find(null, '/cms/simple'); $page->setBody('Hello'); @@ -30,7 +35,7 @@ public function load(ObjectManager $manager) $menuRoot = $manager->find(null, '/cms/simple'); $homeMenuNode = new MenuNode('home'); $homeMenuNode->setLabel('Home'); - $homeMenuNode->setParent($menuRoot); + $homeMenuNode->setParentDocument($menuRoot); $homeMenuNode->setContent($page); $manager->persist($homeMenuNode); @@ -41,7 +46,7 @@ public function load(ObjectManager $manager) // add menu item for login $loginMenuNode = new MenuNode('login'); $loginMenuNode->setLabel('Admin Login'); - $loginMenuNode->setParent($menuRoot); + $loginMenuNode->setParentDocument($menuRoot); $loginMenuNode->setRoute('_demo_login'); $manager->persist($loginMenuNode); From 5e5c6657ecb37d2a5df1d2f8200595d2579ed0c3 Mon Sep 17 00:00:00 2001 From: Lukas Kahwe Smith Date: Sat, 25 Oct 2014 14:05:47 +0200 Subject: [PATCH 09/11] make it easier to switch to another DB than sqlite --- app/config/config.yml | 12 +++++------- app/config/parameters.yml.dist | 5 +++++ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/app/config/config.yml b/app/config/config.yml index 0f2eef7aa5..13f8d28a17 100644 --- a/app/config/config.yml +++ b/app/config/config.yml @@ -46,15 +46,13 @@ assetic: doctrine: dbal: driver: "%database_driver%" + host: "%database_host%" + port: "%database_port%" + dbname: "%database_name%" + user: "%database_user%" + password: "%database_password%" charset: UTF8 path: "%database_path%" - # if using something else than pdo_sqlite as driver, add the - # parameters in parameters.yml.dist and uncomment the lines below - #host: "%database_host%" - #port: "%database_port%" - #dbname: "%database_name%" - #user: "%database_user%" - #password: "%database_password%" # Doctrine PHPCR-ODM configuration doctrine_phpcr: diff --git a/app/config/parameters.yml.dist b/app/config/parameters.yml.dist index c73c650366..36ced3833d 100644 --- a/app/config/parameters.yml.dist +++ b/app/config/parameters.yml.dist @@ -1,5 +1,10 @@ parameters: database_driver: pdo_sqlite + database_host: ~ + database_port: ~ + database_name: ~ + database_user: ~ + database_password: ~ database_path: "%kernel.root_dir%/app.sqlite" phpcr_backend: From cf491310e13c3435d73fdad5e76c8f46bdf2a0b1 Mon Sep 17 00:00:00 2001 From: Lukas Kahwe Smith Date: Sat, 25 Oct 2014 14:05:57 +0200 Subject: [PATCH 10/11] always enable the demo bundle --- app/AppKernel.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/AppKernel.php b/app/AppKernel.php index 70d2738f42..e6bcb1b7c0 100644 --- a/app/AppKernel.php +++ b/app/AppKernel.php @@ -36,10 +36,12 @@ public function registerBundles() new Symfony\Cmf\Bundle\CreateBundle\CmfCreateBundle(), new FOS\RestBundle\FOSRestBundle(), new JMS\SerializerBundle\JMSSerializerBundle(), + + // Remove this Bundle when using the SE as the basis for a new project + new Acme\DemoBundle\AcmeDemoBundle(), ); if (in_array($this->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(); From 682f051596e99b6b2c7632589a38c44955986bac Mon Sep 17 00:00:00 2001 From: Lukas Kahwe Smith Date: Sat, 25 Oct 2014 16:58:15 +0200 Subject: [PATCH 11/11] also enable demo bundle routing in prod --- app/config/routing.yml | 7 ++++++- app/config/routing_dev.yml | 5 ----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/app/config/routing.yml b/app/config/routing.yml index 48c16c2366..76ac0893b4 100644 --- a/app/config/routing.yml +++ b/app/config/routing.yml @@ -1,2 +1,7 @@ -cmf_create: +# AcmeDemoBundle routes (to be removed) +_demo: + resource: "@AcmeDemoBundle/Resources/config/routing.yml" + prefix: /demo + +_cmf_create: resource: "@CmfCreateBundle/Resources/config/routing/rest.xml" diff --git a/app/config/routing_dev.yml b/app/config/routing_dev.yml index 1dbf1ffe9c..ff93a02ba0 100644 --- a/app/config/routing_dev.yml +++ b/app/config/routing_dev.yml @@ -12,8 +12,3 @@ _configurator: _main: resource: routing.yml - -# AcmeDemoBundle routes (to be removed) -_demo: - resource: "@AcmeDemoBundle/Resources/config/routing.yml" - prefix: /demo