Estou ciente de perguntas como essa , nas quais as pessoas tendem a discutir o conceito geral de pacote Symfony 2.
O problema é que, em um aplicativo específico, como, por exemplo, um aplicativo semelhante ao twitter, tudo deveria estar dentro de um pacote genérico, como dizem os documentos oficiais ?
A razão pela qual estou perguntando isso é porque, quando desenvolvemos aplicativos, em geral, não queremos associar altamente nosso código a uma estrutura de cola de pilha completa.
Se eu desenvolver um aplicativo baseado no Symfony 2 e, em algum momento, eu decidir que o Symfony 2 não é realmente a melhor opção para manter o desenvolvimento , isso será um problema para mim?
Portanto, a questão geral é: por que tudo é um pacote bom?
EDIT # 1
Há quase um ano, desde que fiz essa pergunta, escrevi um artigo para compartilhar meu conhecimento sobre esse tópico.
fonte
Respostas:
Eu escrevi uma postagem de blog mais completa e atualizada sobre este tópico: http://elnur.pro/symfony-without-bundles/
Não, nem tudo precisa estar em um pacote. Você poderia ter uma estrutura como esta:
src/Vendor/Model
- para modelos,src/Vendor/Controller
- para controladores,src/Vendor/Service
- por serviços,src/Vendor/Bundle
- para pacotes, comosrc/Vendor/Bundle/AppBundle
,Dessa forma, você colocaria
AppBundle
apenas as coisas que são realmente específicas do Symfony2. Se você decidir mudar para outra estrutura mais tarde, você se livrará doBundle
espaço para nome e o substituirá pelo material escolhido.Observe que o que estou sugerindo aqui é para código específico do aplicativo . Para pacotes reutilizáveis, ainda sugiro usar as práticas recomendadas .
Mantendo entidades fora de pacotes configuráveis
Para manter entidades
src/Vendor/Model
fora de qualquer pacote, alterei adoctrine
seçãoconfig.yml
depara
Os nomes das entidades - para acessar dos repositórios do Doctrine - começam com
Model
neste caso, por exemploModel:User
,.Você pode usar subespaços de nome para agrupar entidades relacionadas, por exemplo
src/Vendor/User/Group.php
,. Nesse caso, o nome da entidade éModel:User\Group
.Manter os controladores fora dos pacotes configuráveis
Primeiro, você precisa informar ao JMSDiExtraBundle para verificar a
src
pasta em busca de serviços adicionando isso aconfig.yml
:Em seguida, defina controladores como serviços e coloque-os no
Controller
espaço para nome:Observe que estou usando meu ElnurAbstractControllerBundle para simplificar a definição de controladores como serviços.
A última coisa que resta é dizer ao Symfony para procurar modelos sem pacotes. Eu faço isso substituindo o serviço de adivinhador de modelos, mas como a abordagem é diferente entre o Symfony 2.0 e 2.1, estou fornecendo versões para os dois.
Substituindo o adivinho de modelo do Symfony 2.1+
Eu criei um pacote que faz isso para você.
Substituindo o ouvinte de modelo do Symfony 2.0
Primeiro, defina a classe:
E então diga ao Symfony para usá-lo adicionando isto a
config.yml
:Usando modelos sem pacotes configuráveis
Agora, você pode usar modelos fora dos pacotes configuráveis. Mantenha-os na
app/Resources/views
pasta. Por exemplo, os modelos para essas duas ações do controlador de exemplo acima estão localizados em:app/Resources/views/User/add.html.twig
app/Resources/views/User/profile.html.twig
Ao se referir a um modelo, apenas omita a parte do pacote configurável:
fonte
generate:doctrine:crud
por exemplo, espera que a entidade (= modelo no caso de elnur) esteja dentro de um pacote para funcionar.Claro que você pode desacoplar seu aplicativo. Apenas desenvolva-o como uma biblioteca e integre-o à
vendor/
pasta symfony (usando odeps
oucomposer.json
, dependendo de como você usa o Symfony2.0 ou o Symfony2.1). No entanto, você precisa de pelo menos um pacote, que atua como o "frontend" da sua biblioteca, onde o Symfony2 encontra o controlador (e tal).fonte
symfony-2.0
, presumo que você use a versão 2.0 atual. Nesse caso, crie um repositório git onde você quiser e coloque tudo nele, o que você deseja desenvolver independentemente do symfony. Em seu projeto symfony, atualize seudeps
arquivo como mencionado aqui symfony.com/doc/current/cookbook/workflow/… Em seguida, crie um (ou mais) pacote (s) de aplicativos (php app/console generate:bundle
) para as coisas específicas do symfony.Uma distribuição symfony usual pode funcionar sem nenhum pacote extra (aplicativo), dependendo de quantas funcionalidades você deseja usar da estrutura de pilha completa.
Por exemplo, seus controladores podem ser chamados e podem ser colocados em qualquer lugar da estrutura do projeto, assim que forem carregados automaticamente.
Em um arquivo de definição de roteamento, você pode usar:
Pode ser qualquer objeto php antigo simples, apenas vinculado à estrutura pelo fato de ter que retornar um
Symfony\Component\HttpFoundation\Response
objeto.Seus modelos de galho (ou outros) podem ser colocados como
app/Resources/views/template.html.twig
e podem ser renderizados usando o::template.html.twig
nome lógico.Todos os serviços de DI podem ser definidos em app / config / config.yml (ou importados de,
app/config/services.yml
por exemplo, e todas as classes de serviço também podem ser quaisquer objetos php antigos simples. Não estão vinculados à estrutura.Tudo isso é fornecido por padrão pela estrutura do symfony full stack.
O problema é quando você deseja usar arquivos de tradução (como xliff), porque eles são descobertos apenas por meio de pacotes configuráveis .
A distribuição symfony-light visa resolver esse tipo de problema, descobrindo tudo o que normalmente seria descoberto apenas por meio de pacotes.
fonte
Você pode usar o KnpRadBundle , que tenta simplificar a estrutura do projeto.
Outra abordagem é usar,
src/Company/Bundle/FrontendBundle
por exemplo, para os pacotes configuráveis esrc/Company/Stuff/Class.php
as classes que são independentes do symfony e que podem ser reutilizadas fora do frameworkfonte
Bundle
ir diretamente para o compartilhamento público. Quando escrevo algum aplicativo, não quero compartilhar meu código, exceto aquelas partes que eu intencionalmente construí como módulos orientados pela comunidade. Estou errado?Como já se passaram 5 anos, aqui estão mais alguns artigos sobre os Pacotes Symfony.
TLDR:
TLDR:
fonte
O framework Symfony é muito bom para iniciar rapidamente uma prova de conceito e todo o código pode ser inserido no aplicativo de pacote padrão no src /
Neste pacote, você pode estruturar seu código como desejar.
Depois, se você quiser usar outra tecnologia para desenvolver seu POC, poderá traduzi-lo facilmente porque não estrutura todo o seu código na concepção de pacote.
Para todo o conceito, você não extremista isso. O pacote é bom, mas inclui tudo e todos os dias não é bom.
Talvez você possa usar um Silex (micro framework Symfony) para desenvolver sua Prova de Conceito e reduzir o impacto de terceiros do pacote.
fonte