什么是新的Symfony 3目录结构?

我用一个常规的composer php命令创build了一个新的Symfony 2.5项目:

php composer.phar create-project symfony/framework-standard-edition path/ 2.5.0 

terminal问我:

你想使用Symfony 3目录结构吗?

Symfony 3目录结构是什么? 我从来没有见过… 2.5是新的吗?

使用它有什么好处?

有什么办法来复制这个目录结构?

我想用新的Symfony 3目录结构,但是我没有看到这个问题?

这个问题Would you like to use Symfony 3 directory structure? 在创build新项目时由于混乱而被删除。 您可以使用以下命令强制使用目录结构:

如果你喜欢新的结构,你可以像这样将环境variablesSENSIOLABS_ENABLE_NEW_DIRECTORY_STRUCTURE添加到你的.bashrc.bash_profile

使所有未来的项目都要求新的结构

 # .bash_profile # ALL new composer installs will ask `Would you like to use the new Symfony3 strucure?` export SENSIOLABS_ENABLE_NEW_DIRECTORY_STRUCTURE=true 

只做这个项目问如果我们想要使用新的结构。

如果你只想要一个特定的项目(一个closures),你可以使用:

 SENSIOLABS_ENABLE_NEW_DIRECTORY_STRUCTURE=true composer create-project symfony/framework-standard-edition path/ "2.5.*" 

如果设置了环境variablesSENSIOLABS_ENABLE_NEW_DIRECTORY_STRUCTURE并设置为true ,则composer将询问您是否要使用新的目录结构。

继续阅读下面的Symfony2Symfony3目录结构之间的所有变化。


什么是新的Symfony 3目录结构?

(以及它如何影响我和我的工作stream程)

我通过创build2个项目来研究这个项目,其中一个使用symfony-2.5.0目录结构,另一个使用symfony-3 (仅限目录结构更改)。

做一个项目:

 # say `N` to `Would you like to use Symfony 3 directory structure?` $ composer create-project symfony/framework-standard-edition symfony-2.5.0/ 2.5.0 # say `Y` to `Would you like to use Symfony 3 directory structure?` $ composer create-project symfony/framework-standard-edition symfony-3/ 2.5.0 

所以现在我们有两个不同的目录我们要比较。


finddiff

您可以使用以下两个目录进行diff

 $ diff -rq symfony-2.5.0/ symfony-3/ /** (Returned from the diff) Files symfony-2.5.0/.gitignore and symfony-3/.gitignore differ Files symfony-2.5.0/.travis.yml and symfony-3/.travis.yml differ Only in symfony-2.5.0/app: bootstrap.php.cache Only in symfony-2.5.0/app: cache Only in symfony-2.5.0/app: console Only in symfony-2.5.0/app: logs Only in symfony-2.5.0/app: phpunit.xml.dist Only in symfony-3/bin: console Only in symfony-3/bin: symfony_requirements Files symfony-2.5.0/composer.json and symfony-3/composer.json differ Only in symfony-3/: phpunit.xml.dist Only in symfony-3/: var Files symfony-2.5.0/vendor/autoload.php and symfony-3/vendor/autoload.php differ Files symfony-2.5.0/vendor/composer/autoload_real.php and symfony-3/vendor/composer/autoload_real.php differ Files symfony-2.5.0/web/app.php and symfony-3/web/app.php differ Files symfony-2.5.0/web/app_dev.php and symfony-3/web/app_dev.php differ */ 

这显示了两个版本中的文件不同。


diff细分

以下是差异中的所有内容。

 # These files still exist in both versions (with different content) .gitignore .travis.yml composer.json vendor/autoload.php vendor/composer/autoload_real.php web/app.php web/app_dev.php # The following files have been removed from 2.5.0 # {RemovedFile2.5} | {ReplacedWith3.0} app/cache | var/cache app/logs | var/log app/bootstrap.php.cache | var/bootstrap.php.cache app/console | bin/console app/phpunit.xml.dist | phpunit.xml.dist # The following files are new in 3.0 bin/symfony_requirements # run via CLI 

Symfony 3目录结构的好处

新的目录结构有许多好处,所有这些都是微不足道的,可能需要对工作stream程进行微小的更改。

PHPUnit的

phpunit可以从项目根目录运行而不必显式指定configuration文件的path。

 # Symfony2 phpunit -c app/phpunit.xml # Symfony3 (no need to specify the configuration file location) phpunit 

二进制可执行文件

所有的二进制可执行文件现在都位于一个单一的位置 – bin目录(类似于类Unix的os)

 # you can update your `PATH` to include the `bin` directory PATH="./bin:$PATH" # From your project root you can now run executables like so: console symfony_requirements doctrine # else with no `PATH` update bin/console bin/symfony_requirements bin/doctrine 

新的/var目录

新的/var目录包含系统在其操作过程中将数据写入的文件(类似于类似于unix的操作系统)

这也使得添加权限变得更加容易,整个/var目录应该可以被你的web服务器写入。 您可以按照Symfony2指南来设置权限 (用var代替app/cache && app/logs ),任何其他想要在本地写入的文件也可以在这里find。

 # default symfony3 `var` directory var/bootstrap.php.cache var/cache var/logs 

Symfony要求检查

运行symfony_requirements将输出强制性和可选的环境configuration。
例如:

 ******************************** * 'Symfony requirements check' * ******************************** * Configuration file used by PHP: /usr/local/php5/lib/php.ini /** ATTENTION ** * The PHP CLI can use a different php.ini file * than the one used with your web server. * To be on the safe side, please also launch the requirements check * from your web server using the web/config.php script. */ ** Mandatory requirements ** ' OK PHP version must be at least 5.3.3 (5.5.11 installed) OK PHP version must not be 5.3.16 as Symfony wont work properly with it OK Vendor libraries must be installed OK var/cache/ directory must be writable OK var/logs/ directory must be writable OK date.timezone setting must be set OK Configured default timezone "Europe/London" must be supported by your installation of PHP OK json_encode() must be available OK session_start() must be available OK ctype_alpha() must be available OK token_get_all() must be available OK simplexml_import_dom() must be available OK APC version must be at least 3.1.13 when using PHP 5.4 OK detect_unicode must be disabled in php.ini OK xdebug.show_exception_trace must be disabled in php.ini OK xdebug.scream must be disabled in php.ini OK PCRE extension must be available ' ** Optional recommendations ** ' OK xdebug.max_nesting_level should be above 100 in php.ini OK Requirements file should be up-to-date OK You should use at least PHP 5.3.4 due to PHP bug #52083 in earlier versions OK When using annotations you should have at least PHP 5.3.8 due to PHP bug #55156 OK You should not use PHP 5.4.0 due to the PHP bug #61453 OK 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) OK 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 OK PCRE extension should be at least version 8.0 (8.34 installed) OK PHP-XML module should be installed OK mb_strlen() should be available OK iconv() should be available OK utf8_decode() should be available OK posix_isatty() should be available OK intl extension should be available OK intl extension should be correctly configured OK intl ICU version should be at least 4+ OK a PHP accelerator should be installed OK short_open_tag should be disabled in php.ini OK magic_quotes_gpc should be disabled in php.ini OK register_globals should be disabled in php.ini OK session.auto_start should be disabled in php.ini OK PDO should be installed OK PDO should have some drivers installed (currently available: mysql, sqlite, dblib, pgsql) ' 

结论

看起来像Sensio Labs的一个很好的整理,以上所有的变化都是非常有意义的,当从2.5升级到3.x时,它们应该很容易实现,这些可能是你的问题中最less的!

阅读文档

Symfony 2.x => 3.0升级文档在这里
Symfony 3.0架构

Symfony 3发布date

它看起来很遥远的发布过程(值得一读)

http://symfony.com/doc/current/contributing/community/releases.html

更新了Symfony发行过程

这里是旧的和新的目录结构之间的变化列表:

  • 引入了一个新的var文件夹
  • app/console被移动到bin/console
  • app/check.php被移动/重命名为bin/symfony_requirements
  • app/phpunit.xml.dist被移动到根文件夹
  • app/SymfonyRequirements.php被移动到var/SymfonyRequirements.php
  • app/cacheapp/logs文件夹分别被移动到了var/cachevar/logs

(目前并不是所有的旧文件都被删除了,所以在将所有文件提交到版本控制之前,你可能需要手动这样做。

那么有什么好处?

这些变化有几个好处。 首先,所有应该可以写入Symfony的文件和文件夹现在都在var文件夹中。 这应该使configuration权限变得更容易:只需确保对var文件夹的写入权限,就完成了。 这是在这篇博文中提出的 – 我还没有尝试过这个。

其次,所有的可执行文件,包括console ,现在都在bin文件夹中。 这允许Bash用户将它添加到.profile文件中:

 # set PATH so it includes current bin folder PATH="./bin:$PATH" 

现在你甚至不需要inputbin/console了,只要console就足够了(注意我必须重新启动才能工作)。

还有一些其他的改进。 app/check.php现在是一个可执行文件,所以你可以使用bin/symfony_requirements来代替php app/check.php 。 (使用前面描述的.profile技巧,只需symfony_requirements就足够了)

最后但并非最不重要的是,运行PHPUnit时不再需要指定configuration文件的位置。 所以,而不是phpunit -c app你可以简单地执行phpunit

我可以将现有的项目升级到这个新的结构吗?

默认情况下,只有在创build一个新项目(使用composer create-project symfony/framework-standard-edition path/ "2.5.*" )时才会得到'你想使用新的目录结构'的问题。

但是,升级现有的Symfony应用程序是可能的,但这是一个有点冒险的解决scheme。 我现在已经成功地应用了许多应用程序,您可以阅读本要点中的步骤。 但是,因为它不是为此devise的,所以我不能保证它会起作用。

更新

事实certificate,当通过Composer创build新的Symfony应用程序时,Symfony不再询问您是否要使用新的目录结构。 但是,通过使用环境variables,仍然可以使用新的目录结构创buildSymfony项目。 有关更多信息,请参阅如何使用新的目录结构创build新的Symfony项目?