Quais as principais diferenças entre o Symfony2 e Symfony1 ?

11, agosto 2011   •   (Não há comentários)   •   Autor: servicos

Estou de volta com um post direcionado à área técnica. O objetivo deste post é apresentar as principais diferenças da nova versão do Framework Symfony, com relação a versão anterior. O post se fez necessário, houve algumas mudanças bem relevantes.

Pra quem não conhece o Symfony1, ele tem uma abordagem muito parecida com o Zend Framework, com sua essência na arquitetura MVC. Um detalhe interessante é a abertura na camada de Model, permitindo o vínculo com outros Frameworks conhecidos por ORM`s, como: Propel e Droctrine.

Abaixo tenho um demonstrativo da relação dos principais itens técnicos sobre as duas versões:

symfony 1,4 Symfony 2,0
Estabilidade Estável Estável
Data de lançamento 11/2009 07/2011
Últimas 1.4.13 2.0.0
Apoio 3 anos n / a
PHP versão > = 5.2.4 > = 5.3.2
Versões ORM Propel: 1.4 
Doutrina: 1.2
Doutrina: 2.1
Fim da manutenção 11/2012 n / a
Documentação Documentação Documentação
Instalação Instruções detalhadas Instruções detalhadas
Repositório principal http://svn.symfony-project.com/branches/1.4 http://github.com/symfony/symfony.git

 

O salto da versão do Symfony não é por acaso, tanto sua estrutura quanto seu conceito foram afetados, e com certeza a forma de criação dos projetos. Então vamos lá.

Symfony2 vs Symfony1.

Ressalto que todas habilidades aplicadas para dominar um projeto no Symfony1 continuam a ser muito relevante no desenvolvimento em Symfony2.

Estrutura de Diretórios

Com uma pequena analise em uma projeto com Symfony2, percebemos que houve várias alterações em sua estrutura de diretórios. Suas mudança aplicam-se:

/app

No Symfony1, o projeto contém uma ou mais aplicações, e todos dentro do diretório/app. Por padrão no Symfony2, encontraremos apenas uma aplicação no projeto. Nesse diretório teremos configurações específicas para cache, logs e diretórios de templates, bem como uma classe Kernel (AppKernel), que será responsável por definir quais bundles serão utilizados na aplicação.

/src

Esse diretório é bem parecido com o diretório /plugins do Symfony1. Seu propósito foi de centralizar todos o códigos de uma determinada aplicação em um só lugar. No Symfony1, tínhamos vários apps, onde poderíamos compartilhar vários plugins e outros códigos PHP. Porém ficavam em diretórios separados. No Symfony2, a vida é muito mais simples porque todo o código deve estar em um pacote.

/vendor

O /vendor é equivalente ao diretório /lib/vendor do Symfony1, abrangendo todas as bibliotecas vendor e bundles. Por padrão, encontraremos nesse diretório os arquivos da biblioteca Symfony2, juntamente com várias outras bibliotecas dependentes, como Doctrine2, Twig e SwiftMailer.

/web

Quase não houve alterações nesse diretório. A diferença mais notável é a ausência dos diretórios /css, /js, /images. Isso é intencional. Como todos os códigos PHP devem ficar juntos, os ativos também devem estar dentro do mesmo pacote.
Com a ajuda de um comando de console, os arquivos do diretório Resources/public/ de cada pacote é copiado ou simbolicamente ligado ao diretório /web/bundles/.
Isto permite-lhe manter os ativos organizados dentro do seu pacote, mas ainda torná-los disponíveis ao público.

Autoloading

Autoloading mudou no Symfony2, agora é mais universal, mais rápido, e independente da necessidade de limpar o cache.
No Symfony1, autoloading foi feito através de pesquisas em todo o projeto para buscar os arquivos de classe PHP e incluía em cache estas informações em uma matriz gigante.
Quem lida com esse processo no Symfony2 é uma nova classe chamada : UniversalClassLoader. A idéia por trás do autoloader é simples: o nome da classe (incluindo o namespace) deve coincidir com o caminho para o arquivo que contém essa classe. Veja o exemplo:

namespace Sensio\Bundle\FrameworkExtraBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
// ...
class SensioFrameworkExtraBundle extends Bundle
{
// ...

Usando o Console

Com o Symfony1, o console está no diretório raiz do seu projeto e é chamado symfony:
php symfony

No Symfony2, o console é agora no sub-diretório app:
php app/console

Aplicações

Em um projeto Symfony1, é comum ter várias aplicações: uma para o frontend e outra para o backend, por exemplo. No Symfony2, só precisamos criar uma aplicação (uma aplicação de blog, um aplicativo de intranet, …). Na maioria das vezes, se quisermos criar uma segunda aplicação, podemos em vez disso criar outro projeto e compartilhar alguns pacotes entre eles.

Caso precisarmos separar a interface e os recursos de backend de alguns pacotes, criaremos sub-diretórios para os controladores, sub-diretórios para modelos, configurações de semântica, configurações de roteamento, e assim por diante.

Claro, não há nada de errado em ter várias aplicações em um projeto. A segunda aplicação significaria um novo diretório, por exemplo, /my_app, com a mesma configuração básica do diretório /app.

Bundles and Plugins

Um plugin no Symfony1 pode conter arquivos de configuração, módulos, bibliotecas PHP, ativos e qualquer outra coisa relacionada ao seu projeto. Em Symfony2, a idéia é que um plugin seja substituído por  ”pacote” (bundle). Um conjunto ainda mais poderoso do que um plugin.

Um plugin deve ser ativada dentro da classe ProjectConfiguration, isso quando utilizamos o Symfony1:

// config/ProjectConfiguration.class.php
public function setup()
{
$this->enableAllPluginsExcept(array(/* some plugins here */));
}

No Symfony2, os bundles são ativadas dentro do AppKernel:

// app/AppKernel.php
public function registerBundles()
{
$bundles = array(
new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
new Symfony\Bundle\TwigBundle\TwigBundle(),
// ...
new Acme\DemoBundle\AcmeDemoBundle(),
);
return $bundles;
}

Routing (routing.yml) e Configuração (config.yml)

No Symfony1, os arquivos de configuração routing.yml e app.yml foram carregados automaticamente dentro de qualquer plugin. O processo muda um pouco no Symfony2, roteamento e configuração da aplicação fica dentro de um pacote que devem ser incluídos manualmente. Por exemplo, para incluir um recurso de roteamento de um pacote chamado AcmeDemoBundle, faremos o seguinte:

# app/config/routing.yml
_hello:
resource: "@AcmeDemoBundle/Resources/config/routing.yml"

Isso irá carregar as rotas encontradas no Resources/config/routing.yml do AcmeDemoBundle. O especial @AcmeDemoBundle é uma sintaxe de atalho que, internamente, resolve para o caminho completo para esse pacote.
Podemos usar esta mesma estratégia para trazer na configuração de um pacote:

# app/config/config.yml
imports:
- { resource: "@AcmeDemoBundle/Resources/config/config.yml" }

 

Essas são as principais modificações, porém não acabamos por ai. Recomendo, caso queria inciar a criação de projetos utilizando Symfony2, não deixe de ler a documentação, isso é essencial.

Fico por aqui.

Fontes:
http://symfony.com/doc/current/cookbook/symfony1.html