Conditions | 40 |
Paths | > 20000 |
Total Lines | 383 |
Code Lines | 250 |
Lines | 0 |
Ratio | 0 % |
Changes | 0 |
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
1 | <?php |
||
388 | public function __construct() |
||
389 | { |
||
390 | /* mandatory requirements follow */ |
||
391 | |||
392 | $installedPhpVersion = phpversion(); |
||
393 | $requiredPhpVersion = $this->getPhpRequiredVersion(); |
||
394 | |||
395 | $this->addRecommendation( |
||
396 | $requiredPhpVersion, |
||
397 | 'Vendors should be installed in order to check all requirements.', |
||
398 | 'Run the <code>composer install</code> command.', |
||
399 | 'Run the "composer install" command.' |
||
400 | ); |
||
401 | |||
402 | if (false !== $requiredPhpVersion) { |
||
403 | $this->addRequirement( |
||
404 | version_compare($installedPhpVersion, $requiredPhpVersion, '>='), |
||
405 | sprintf('PHP version must be at least %s (%s installed)', $requiredPhpVersion, $installedPhpVersion), |
||
406 | sprintf('You are running PHP version "<strong>%s</strong>", but Symfony needs at least PHP "<strong>%s</strong>" to run. |
||
407 | Before using Symfony, upgrade your PHP installation, preferably to the latest version.', |
||
408 | $installedPhpVersion, $requiredPhpVersion), |
||
409 | sprintf('Install PHP %s or newer (installed version is %s)', $requiredPhpVersion, $installedPhpVersion) |
||
410 | ); |
||
411 | } |
||
412 | |||
413 | $this->addRequirement( |
||
414 | version_compare($installedPhpVersion, '5.3.16', '!='), |
||
415 | 'PHP version must not be 5.3.16 as Symfony won\'t work properly with it', |
||
416 | 'Install PHP 5.3.17 or newer (or downgrade to an earlier PHP version)' |
||
417 | ); |
||
418 | |||
419 | $this->addRequirement( |
||
420 | is_dir(__DIR__.'/../vendor/composer'), |
||
421 | 'Vendor libraries must be installed', |
||
422 | 'Vendor libraries are missing. Install composer following instructions from <a href="http://getcomposer.org/">http://getcomposer.org/</a>. '. |
||
423 | 'Then run "<strong>php composer.phar install</strong>" to install them.' |
||
424 | ); |
||
425 | |||
426 | $cacheDir = is_dir(__DIR__.'/../var/cache') ? __DIR__.'/../var/cache' : __DIR__.'/cache'; |
||
427 | |||
428 | $this->addRequirement( |
||
429 | is_writable($cacheDir), |
||
430 | 'app/cache/ or var/cache/ directory must be writable', |
||
431 | 'Change the permissions of either "<strong>app/cache/</strong>" or "<strong>var/cache/</strong>" directory so that the web server can write into it.' |
||
432 | ); |
||
433 | |||
434 | $logsDir = is_dir(__DIR__.'/../var/logs') ? __DIR__.'/../var/logs' : __DIR__.'/logs'; |
||
435 | |||
436 | $this->addRequirement( |
||
437 | is_writable($logsDir), |
||
438 | 'app/logs/ or var/logs/ directory must be writable', |
||
439 | 'Change the permissions of either "<strong>app/logs/</strong>" or "<strong>var/logs/</strong>" directory so that the web server can write into it.' |
||
440 | ); |
||
441 | |||
442 | if (version_compare($installedPhpVersion, '7.0.0', '<')) { |
||
443 | $this->addPhpIniRequirement( |
||
444 | 'date.timezone', true, false, |
||
445 | 'date.timezone setting must be set', |
||
446 | 'Set the "<strong>date.timezone</strong>" setting in php.ini<a href="#phpini">*</a> (like Europe/Paris).' |
||
447 | ); |
||
448 | } |
||
449 | |||
450 | if (false !== $requiredPhpVersion && version_compare($installedPhpVersion, $requiredPhpVersion, '>=')) { |
||
451 | $timezones = array(); |
||
452 | foreach (DateTimeZone::listAbbreviations() as $abbreviations) { |
||
453 | foreach ($abbreviations as $abbreviation) { |
||
454 | $timezones[$abbreviation['timezone_id']] = true; |
||
455 | } |
||
456 | } |
||
457 | |||
458 | $this->addRequirement( |
||
459 | isset($timezones[@date_default_timezone_get()]), |
||
460 | sprintf('Configured default timezone "%s" must be supported by your installation of PHP', @date_default_timezone_get()), |
||
461 | 'Your default timezone is not supported by PHP. Check for typos in your <strong>php.ini</strong> file and have a look at the list of deprecated timezones at <a href="http://php.net/manual/en/timezones.others.php">http://php.net/manual/en/timezones.others.php</a>.' |
||
462 | ); |
||
463 | } |
||
464 | |||
465 | $this->addRequirement( |
||
466 | function_exists('iconv'), |
||
467 | 'iconv() must be available', |
||
468 | 'Install and enable the <strong>iconv</strong> extension.' |
||
469 | ); |
||
470 | |||
471 | $this->addRequirement( |
||
472 | function_exists('json_encode'), |
||
473 | 'json_encode() must be available', |
||
474 | 'Install and enable the <strong>JSON</strong> extension.' |
||
475 | ); |
||
476 | |||
477 | $this->addRequirement( |
||
478 | function_exists('session_start'), |
||
479 | 'session_start() must be available', |
||
480 | 'Install and enable the <strong>session</strong> extension.' |
||
481 | ); |
||
482 | |||
483 | $this->addRequirement( |
||
484 | function_exists('ctype_alpha'), |
||
485 | 'ctype_alpha() must be available', |
||
486 | 'Install and enable the <strong>ctype</strong> extension.' |
||
487 | ); |
||
488 | |||
489 | $this->addRequirement( |
||
490 | function_exists('token_get_all'), |
||
491 | 'token_get_all() must be available', |
||
492 | 'Install and enable the <strong>Tokenizer</strong> extension.' |
||
493 | ); |
||
494 | |||
495 | $this->addRequirement( |
||
496 | function_exists('simplexml_import_dom'), |
||
497 | 'simplexml_import_dom() must be available', |
||
498 | 'Install and enable the <strong>SimpleXML</strong> extension.' |
||
499 | ); |
||
500 | |||
501 | if (function_exists('apc_store') && ini_get('apc.enabled')) { |
||
502 | if (version_compare($installedPhpVersion, '5.4.0', '>=')) { |
||
503 | $this->addRequirement( |
||
504 | version_compare(phpversion('apc'), '3.1.13', '>='), |
||
505 | 'APC version must be at least 3.1.13 when using PHP 5.4', |
||
506 | 'Upgrade your <strong>APC</strong> extension (3.1.13+).' |
||
507 | ); |
||
508 | } else { |
||
509 | $this->addRequirement( |
||
510 | version_compare(phpversion('apc'), '3.0.17', '>='), |
||
511 | 'APC version must be at least 3.0.17', |
||
512 | 'Upgrade your <strong>APC</strong> extension (3.0.17+).' |
||
513 | ); |
||
514 | } |
||
515 | } |
||
516 | |||
517 | $this->addPhpIniRequirement('detect_unicode', false); |
||
518 | |||
519 | if (extension_loaded('suhosin')) { |
||
520 | $this->addPhpIniRequirement( |
||
521 | 'suhosin.executor.include.whitelist', |
||
522 | create_function('$cfgValue', 'return false !== stripos($cfgValue, "phar");'), |
||
523 | false, |
||
524 | 'suhosin.executor.include.whitelist must be configured correctly in php.ini', |
||
525 | 'Add "<strong>phar</strong>" to <strong>suhosin.executor.include.whitelist</strong> in php.ini<a href="#phpini">*</a>.' |
||
526 | ); |
||
527 | } |
||
528 | |||
529 | if (extension_loaded('xdebug')) { |
||
530 | $this->addPhpIniRequirement( |
||
531 | 'xdebug.show_exception_trace', false, true |
||
532 | ); |
||
533 | |||
534 | $this->addPhpIniRequirement( |
||
535 | 'xdebug.scream', false, true |
||
536 | ); |
||
537 | |||
538 | $this->addPhpIniRecommendation( |
||
539 | 'xdebug.max_nesting_level', |
||
540 | create_function('$cfgValue', 'return $cfgValue > 100;'), |
||
541 | true, |
||
542 | 'xdebug.max_nesting_level should be above 100 in php.ini', |
||
543 | 'Set "<strong>xdebug.max_nesting_level</strong>" to e.g. "<strong>250</strong>" in php.ini<a href="#phpini">*</a> to stop Xdebug\'s infinite recursion protection erroneously throwing a fatal error in your project.' |
||
544 | ); |
||
545 | } |
||
546 | |||
547 | $pcreVersion = defined('PCRE_VERSION') ? (float) PCRE_VERSION : null; |
||
548 | |||
549 | $this->addRequirement( |
||
550 | null !== $pcreVersion, |
||
551 | 'PCRE extension must be available', |
||
552 | 'Install the <strong>PCRE</strong> extension (version 8.0+).' |
||
553 | ); |
||
554 | |||
555 | if (extension_loaded('mbstring')) { |
||
556 | $this->addPhpIniRequirement( |
||
557 | 'mbstring.func_overload', |
||
558 | create_function('$cfgValue', 'return (int) $cfgValue === 0;'), |
||
559 | true, |
||
560 | 'string functions should not be overloaded', |
||
561 | 'Set "<strong>mbstring.func_overload</strong>" to <strong>0</strong> in php.ini<a href="#phpini">*</a> to disable function overloading by the mbstring extension.' |
||
562 | ); |
||
563 | } |
||
564 | |||
565 | /* optional recommendations follow */ |
||
566 | |||
567 | if (file_exists(__DIR__.'/../vendor/composer')) { |
||
568 | require_once __DIR__.'/../vendor/autoload.php'; |
||
569 | |||
570 | try { |
||
571 | $r = new ReflectionClass('Sensio\Bundle\DistributionBundle\SensioDistributionBundle'); |
||
572 | |||
573 | $contents = file_get_contents(dirname($r->getFileName()).'/Resources/skeleton/app/SymfonyRequirements.php'); |
||
574 | } catch (ReflectionException $e) { |
||
575 | $contents = ''; |
||
576 | } |
||
577 | $this->addRecommendation( |
||
578 | file_get_contents(__FILE__) === $contents, |
||
579 | 'Requirements file should be up-to-date', |
||
580 | 'Your requirements file is outdated. Run composer install and re-check your configuration.' |
||
581 | ); |
||
582 | } |
||
583 | |||
584 | $this->addRecommendation( |
||
585 | version_compare($installedPhpVersion, '5.3.4', '>='), |
||
586 | 'You should use at least PHP 5.3.4 due to PHP bug #52083 in earlier versions', |
||
587 | 'Your project might malfunction randomly due to PHP bug #52083 ("Notice: Trying to get property of non-object"). Install PHP 5.3.4 or newer.' |
||
588 | ); |
||
589 | |||
590 | $this->addRecommendation( |
||
591 | version_compare($installedPhpVersion, '5.3.8', '>='), |
||
592 | 'When using annotations you should have at least PHP 5.3.8 due to PHP bug #55156', |
||
593 | 'Install PHP 5.3.8 or newer if your project uses annotations.' |
||
594 | ); |
||
595 | |||
596 | $this->addRecommendation( |
||
597 | version_compare($installedPhpVersion, '5.4.0', '!='), |
||
598 | 'You should not use PHP 5.4.0 due to the PHP bug #61453', |
||
599 | 'Your project might not work properly due to the PHP bug #61453 ("Cannot dump definitions which have method calls"). Install PHP 5.4.1 or newer.' |
||
600 | ); |
||
601 | |||
602 | $this->addRecommendation( |
||
603 | version_compare($installedPhpVersion, '5.4.11', '>='), |
||
604 | 'When using the logout handler from the Symfony Security Component, you should have at least PHP 5.4.11 due to PHP bug #63379 (as a workaround, you can also set invalidate_session to false in the security logout handler configuration)', |
||
605 | 'Install PHP 5.4.11 or newer if your project uses the logout handler from the Symfony Security Component.' |
||
606 | ); |
||
607 | |||
608 | $this->addRecommendation( |
||
609 | (version_compare($installedPhpVersion, '5.3.18', '>=') && version_compare($installedPhpVersion, '5.4.0', '<')) |
||
610 | || |
||
611 | version_compare($installedPhpVersion, '5.4.8', '>='), |
||
612 | 'You should use PHP 5.3.18+ or PHP 5.4.8+ to always get nice error messages for fatal errors in the development environment due to PHP bug #61767/#60909', |
||
613 | 'Install PHP 5.3.18+ or PHP 5.4.8+ if you want nice error messages for all fatal errors in the development environment.' |
||
614 | ); |
||
615 | |||
616 | if (null !== $pcreVersion) { |
||
617 | $this->addRecommendation( |
||
618 | $pcreVersion >= 8.0, |
||
619 | sprintf('PCRE extension should be at least version 8.0 (%s installed)', $pcreVersion), |
||
620 | '<strong>PCRE 8.0+</strong> is preconfigured in PHP since 5.3.2 but you are using an outdated version of it. Symfony probably works anyway but it is recommended to upgrade your PCRE extension.' |
||
621 | ); |
||
622 | } |
||
623 | |||
624 | $this->addRecommendation( |
||
625 | class_exists('DomDocument'), |
||
626 | 'PHP-DOM and PHP-XML modules should be installed', |
||
627 | 'Install and enable the <strong>PHP-DOM</strong> and the <strong>PHP-XML</strong> modules.' |
||
628 | ); |
||
629 | |||
630 | $this->addRecommendation( |
||
631 | function_exists('mb_strlen'), |
||
632 | 'mb_strlen() should be available', |
||
633 | 'Install and enable the <strong>mbstring</strong> extension.' |
||
634 | ); |
||
635 | |||
636 | $this->addRecommendation( |
||
637 | function_exists('iconv'), |
||
638 | 'iconv() should be available', |
||
639 | 'Install and enable the <strong>iconv</strong> extension.' |
||
640 | ); |
||
641 | |||
642 | $this->addRecommendation( |
||
643 | function_exists('utf8_decode'), |
||
644 | 'utf8_decode() should be available', |
||
645 | 'Install and enable the <strong>XML</strong> extension.' |
||
646 | ); |
||
647 | |||
648 | $this->addRecommendation( |
||
649 | function_exists('filter_var'), |
||
650 | 'filter_var() should be available', |
||
651 | 'Install and enable the <strong>filter</strong> extension.' |
||
652 | ); |
||
653 | |||
654 | if (!defined('PHP_WINDOWS_VERSION_BUILD')) { |
||
655 | $this->addRecommendation( |
||
656 | function_exists('posix_isatty'), |
||
657 | 'posix_isatty() should be available', |
||
658 | 'Install and enable the <strong>php_posix</strong> extension (used to colorize the CLI output).' |
||
659 | ); |
||
660 | } |
||
661 | |||
662 | $this->addRecommendation( |
||
663 | extension_loaded('intl'), |
||
664 | 'intl extension should be available', |
||
665 | 'Install and enable the <strong>intl</strong> extension (used for validators).' |
||
666 | ); |
||
667 | |||
668 | if (extension_loaded('intl')) { |
||
669 | // in some WAMP server installations, new Collator() returns null |
||
670 | $this->addRecommendation( |
||
671 | null !== new Collator('fr_FR'), |
||
672 | 'intl extension should be correctly configured', |
||
673 | 'The intl extension does not behave properly. This problem is typical on PHP 5.3.X x64 WIN builds.' |
||
674 | ); |
||
675 | |||
676 | // check for compatible ICU versions (only done when you have the intl extension) |
||
677 | if (defined('INTL_ICU_VERSION')) { |
||
678 | $version = INTL_ICU_VERSION; |
||
679 | } else { |
||
680 | $reflector = new ReflectionExtension('intl'); |
||
681 | |||
682 | ob_start(); |
||
683 | $reflector->info(); |
||
684 | $output = strip_tags(ob_get_clean()); |
||
685 | |||
686 | preg_match('/^ICU version +(?:=> )?(.*)$/m', $output, $matches); |
||
687 | $version = $matches[1]; |
||
688 | } |
||
689 | |||
690 | $this->addRecommendation( |
||
691 | version_compare($version, '4.0', '>='), |
||
692 | 'intl ICU version should be at least 4+', |
||
693 | 'Upgrade your <strong>intl</strong> extension with a newer ICU version (4+).' |
||
694 | ); |
||
695 | |||
696 | if (class_exists('Symfony\Component\Intl\Intl')) { |
||
697 | $this->addRecommendation( |
||
698 | \Symfony\Component\Intl\Intl::getIcuDataVersion() <= \Symfony\Component\Intl\Intl::getIcuVersion(), |
||
699 | sprintf('intl ICU version installed on your system is outdated (%s) and does not match the ICU data bundled with Symfony (%s)', \Symfony\Component\Intl\Intl::getIcuVersion(), \Symfony\Component\Intl\Intl::getIcuDataVersion()), |
||
700 | 'To get the latest internationalization data upgrade the ICU system package and the intl PHP extension.' |
||
701 | ); |
||
702 | if (\Symfony\Component\Intl\Intl::getIcuDataVersion() <= \Symfony\Component\Intl\Intl::getIcuVersion()) { |
||
703 | $this->addRecommendation( |
||
704 | \Symfony\Component\Intl\Intl::getIcuDataVersion() === \Symfony\Component\Intl\Intl::getIcuVersion(), |
||
705 | sprintf('intl ICU version installed on your system (%s) does not match the ICU data bundled with Symfony (%s)', \Symfony\Component\Intl\Intl::getIcuVersion(), \Symfony\Component\Intl\Intl::getIcuDataVersion()), |
||
706 | 'To avoid internationalization data inconsistencies upgrade the symfony/intl component.' |
||
707 | ); |
||
708 | } |
||
709 | } |
||
710 | |||
711 | $this->addPhpIniRecommendation( |
||
712 | 'intl.error_level', |
||
713 | create_function('$cfgValue', 'return (int) $cfgValue === 0;'), |
||
714 | true, |
||
715 | 'intl.error_level should be 0 in php.ini', |
||
716 | 'Set "<strong>intl.error_level</strong>" to "<strong>0</strong>" in php.ini<a href="#phpini">*</a> to inhibit the messages when an error occurs in ICU functions.' |
||
717 | ); |
||
718 | } |
||
719 | |||
720 | $accelerator = |
||
721 | (extension_loaded('eaccelerator') && ini_get('eaccelerator.enable')) |
||
722 | || |
||
723 | (extension_loaded('apc') && ini_get('apc.enabled')) |
||
724 | || |
||
725 | (extension_loaded('Zend Optimizer+') && ini_get('zend_optimizerplus.enable')) |
||
726 | || |
||
727 | (extension_loaded('Zend OPcache') && ini_get('opcache.enable')) |
||
728 | || |
||
729 | (extension_loaded('xcache') && ini_get('xcache.cacher')) |
||
730 | || |
||
731 | (extension_loaded('wincache') && ini_get('wincache.ocenabled')) |
||
732 | ; |
||
733 | |||
734 | $this->addRecommendation( |
||
735 | $accelerator, |
||
736 | 'a PHP accelerator should be installed', |
||
737 | 'Install and/or enable a <strong>PHP accelerator</strong> (highly recommended).' |
||
738 | ); |
||
739 | |||
740 | if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { |
||
741 | $this->addRecommendation( |
||
742 | $this->getRealpathCacheSize() >= 5 * 1024 * 1024, |
||
743 | 'realpath_cache_size should be at least 5M in php.ini', |
||
744 | 'Setting "<strong>realpath_cache_size</strong>" to e.g. "<strong>5242880</strong>" or "<strong>5M</strong>" in php.ini<a href="#phpini">*</a> may improve performance on Windows significantly in some cases.' |
||
745 | ); |
||
746 | } |
||
747 | |||
748 | $this->addPhpIniRecommendation('short_open_tag', false); |
||
749 | |||
750 | $this->addPhpIniRecommendation('magic_quotes_gpc', false, true); |
||
751 | |||
752 | $this->addPhpIniRecommendation('register_globals', false, true); |
||
753 | |||
754 | $this->addPhpIniRecommendation('session.auto_start', false); |
||
755 | |||
756 | $this->addRecommendation( |
||
757 | class_exists('PDO'), |
||
758 | 'PDO should be installed', |
||
759 | 'Install <strong>PDO</strong> (mandatory for Doctrine).' |
||
760 | ); |
||
761 | |||
762 | if (class_exists('PDO')) { |
||
763 | $drivers = PDO::getAvailableDrivers(); |
||
764 | $this->addRecommendation( |
||
765 | count($drivers) > 0, |
||
766 | sprintf('PDO should have some drivers installed (currently available: %s)', count($drivers) ? implode(', ', $drivers) : 'none'), |
||
767 | 'Install <strong>PDO drivers</strong> (mandatory for Doctrine).' |
||
768 | ); |
||
769 | } |
||
770 | } |
||
771 | |||
824 |
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.