Qual é a nova estrutura de diretório do Symfony 3?

90

Acabei de criar um novo projeto Symfony 2.5 com um comando composer regular:

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

O Terminal me pergunta:

Você gostaria de usar a estrutura de diretório do Symfony 3?

O que é essa estrutura de diretório do Symfony 3? Eu nunca tinha visto isso antes ... É novo desde 2.5?

Quais são os benefícios de usá-lo?

Existe alguma maneira de replicar essa estrutura de diretório?

Ousmane
fonte
3
Observe que, entretanto, esta questão foi removida do instalador porque estava causando um certo grau de confusão entre os usuários. Mais informações: github.com/symfony/symfony-standard/issues/674
Corneliu
@Corneliu é verdade. No entanto, ainda é possível disparar a questão, definindo uma variável de ambiente antes de executar o Composer. Veja esta pergunta e resposta que postei: stackoverflow.com/q/24956881/1001110
Nic Wortel

Respostas:

176

Eu quero usar a nova estrutura de diretório do Symfony 3, mas não vejo a pergunta?

A pergunta Would you like to use Symfony 3 directory structure?foi removida ao criar um novo projeto devido à confusão que causou. Você pode forçar o uso da estrutura de diretório usando o seguinte:

Se você preferir a nova estrutura, pode adicionar a variável de ambiente SENSIOLABS_ENABLE_NEW_DIRECTORY_STRUCTUREao seu .bashrcou .bash_profileassim:

Faça com que todos os projetos futuros peçam a nova estrutura

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

Faça APENAS ESTE projeto perguntar se queremos usar a nova estrutura.

Se você quiser apenas para um determinado projeto (um único), você pode usar:

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

Se a variável de ambiente SENSIOLABS_ENABLE_NEW_DIRECTORY_STRUCTUREfor definida e definida como true, composero perguntará se você deseja usar a nova estrutura de diretório.

Continue lendo abaixo para todas as mudanças entre a estrutura de diretório Symfony2e Symfony3.


Qual é a nova estrutura de diretório do Symfony 3?

(e como isso afeta a mim e meu fluxo de trabalho)

Eu pesquisei isso criando 2 projetos, um com symfony-2.5.0estrutura de diretório e outro com symfony-3(apenas alteração na estrutura de diretório).

Faça um de cada projeto:

# 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

Portanto, agora temos os 2 diretórios diferentes que queremos comparar.


Encontre o differência

Você pode diffescolher entre os 2 diretórios usando:

$ 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
*/

Isso mostra os arquivos que diferem nas 2 versões.


Repartição de diff

Aqui está uma análise de tudo no 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

Benefícios da estrutura de diretório do Symfony 3

A nova estrutura de diretório tem vários benefícios, todos secundários e podem exigir mudanças mínimas em seu fluxo de trabalho.

PHPUnit

phpunit pode ser executado a partir da raiz do projeto sem a necessidade de especificar explicitamente o caminho do arquivo de configuração.

# Symfony2
phpunit -c app/phpunit.xml

# Symfony3 (no need to specify the configuration file location)
phpunit

Executáveis ​​Binários

Todos os arquivos binários executáveis ​​agora estão localizados em um único local - o bindiretório (semelhante a um sistema operacional unix-like) .

# 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

O novo /vardiretório

O novo /vardiretório contém os arquivos nos quais o sistema grava dados durante o curso de sua operação (semelhante a um sistema operacional unix-like) .

Isso também torna mais fácil adicionar permissões, todo o /vardiretório deve ser gravável pelo seu servidor web. Você pode seguir o guia do Symfony2 para definir permissões (substituindo app/cache&& app/logspor var), quaisquer outros arquivos que você deseja escrever localmente também podem estar localizados aqui.

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

Verificação de requisitos Symfony

A execução symfony_requirementsproduzirá configurações de ambiente obrigatórias e opcionais.
por exemplo:

********************************
* '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)
'

Conclusão

Parece uma boa arrumação da Sensio Labs, todas as alterações acima fazem todo o sentido, devem ser fáceis de implementar durante a atualização de 2.5para 3.x, estes serão provavelmente o menor dos seus problemas!

Leia a documentação

Symfony 2.x => 3.0 Documentos de atualização aqui
Symfony 3.0 A arquitetura

Data de lançamento para Symfony 3

Parece muito distante de olhar para o processo de liberação (vale a pena ler) :

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

Processo de lançamento do Symfony atualizado
(fonte: symfony.com )

Anil
fonte
Obrigado pela ajuda, sim, espero que a migração do 2. * para o 3.0 seja possível e fácil.
Ousmane
Agora acho que é por isso que o comando não está funcionando porque o composer mudou do aplicativo para o bin.
Parixit
1
Até ontem, removemos a questão da estrutura de diretórios "3.0" porque confundia as pessoas e ainda não havia nenhum benefício real em usar essa estrutura. O 3.0 ainda está muito longe, mas quando chegarmos lá, certamente haverá detalhes sobre como fazer o upgrade :).
weaverryan
1
@MarcelBurkhard Eu atualizei minha resposta para mostrar como forçar a nova estrutura de diretório, você simplesmente adiciona a variável de ambiente SENSIOLABS_ENABLE_NEW_DIRECTORY_STRUCTURE=true(veja o topo da minha resposta para detalhes completos)
Anil
1
Você deve atualizar a resposta e observar que eles removeram essa opção do instalador.
Pinoniq de
38

Aqui está uma lista de mudanças entre a estrutura de diretório antiga e nova:

  • Uma nova varpasta é introduzida
  • app/console é movido para bin/console
  • app/check.php foi movido / renomeado para bin/symfony_requirements
  • app/phpunit.xml.dist é movido para a pasta raiz
  • app/SymfonyRequirements.php é movido para var/SymfonyRequirements.php
  • as pastas app/cachee app/logsforam movidas para var/cachee var/logs, respectivamente

(Atualmente, nem todos os arquivos antigos parecem ter sido removidos, então você pode querer fazer isso manualmente antes de enviar todos os arquivos para o controle de versão. Veja este problema )

Qual é o benefício?

Essas alterações trazem alguns benefícios. Em primeiro lugar, todos os arquivos e pastas que devem ser graváveis ​​para o Symfony agora estão na varpasta. Isso deve tornar a configuração das permissões muito mais fácil: basta garantir o acesso de gravação à varpasta e pronto. Isso é sugerido nesta postagem do blog - eu não tentei fazer isso sozinho, ainda.

Em segundo lugar, todos os executáveis, inclusive console, estão agora na binpasta. Isso permite que usuários do Bash, por exemplo, adicionem isso a seus .profilearquivos:

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

Agora você não precisa nem digitar bin/consolemais, simplesmente consolebasta (note que eu tive que reiniciar para que isso funcione).

Existem algumas outras melhorias também. app/check.phpagora é um executável, portanto, você pode chamá-lo usando em bin/symfony_requirementsvez de php app/check.php. (Usando o .profiletruque que descrevi anteriormente, simplesmente symfony_requirementsserá suficiente também)

E, por último, mas não menos importante, você não precisa mais especificar a localização do arquivo de configuração ao executar o PHPUnit. Então, em vez de phpunit -c appvocê simplesmente executar phpunit.

Posso atualizar projetos existentes para esta nova estrutura também?

Por padrão, você obterá apenas a pergunta 'Deseja usar a nova estrutura de diretório' ao criar um novo projeto (usando composer create-project symfony/framework-standard-edition path/ "2.5.*").

No entanto, é possível atualizar um aplicativo Symfony existente, mas é uma solução um tanto hacky. Eu consegui fazer isso com vários aplicativos agora, e você pode ler as etapas nesta essência . Porém, como não foi projetado para isso, não posso garantir que funcionará sempre.

Atualizar

Acontece que o Symfony não pergunta mais se você deseja usar a nova estrutura de diretório, ao criar um novo aplicativo Symfony através do Composer. Entretanto, ainda é possível criar projetos Symfony com a nova estrutura de diretório, usando uma variável de ambiente. Para obter mais informações, consulte Como posso criar um novo projeto Symfony com a nova estrutura de diretório?

Nic Wortel
fonte
6
Você não precisa reiniciar depois de alterar o seu .profile, você pode apenas recriar o arquivo em seu shell atual ou sair e iniciar um novo shell. A execução . ~/.profileirá recriar o arquivo (observe o espaço de ponto inicial).
Drarok de