Perguntas e respostas sobre o framework symfony.
Tópicos
- Como obter os parâmetros do request (valores enviados via post ou get)?
- Porque as datas retornadas do banco de dados não aparecem com a informação do horário?
- Como transformar uma URI interna em uma URL externa?
- Como disponibilizar uma classe para toda minha aplicação (autoload)
- Por que é necessário limpar o cache do symfony toda vez que adiciono uma classe ao modelo?
- Quando devo utilizar um helper ao invés de um partial?
- Quais são os front controllers de uma aplicação desenvolvida com o symfony e onde eles ficam localizados?
- Qual é a diferença entre ambiente de produção e ambiente de desenvolvimento?
- Qual é o melhor local para definir minhas
constantes? - Como proceder para esconder o nome do front controller na minha URL?
- Como alterar automaticamente a cultura utilizando a linguagem de preferência que o usuário setou em seu navegador?
Como obter os parâmetros do request (valores enviados via post ou get)?
(versão 1.0)
Ex: obtendo o valor do parâmetro ‘tag’:
View: $sf_params->get(‘tag’)
Controller (action): $tag = $this->getRequestParameter(‘tag’);
[Voltar aos tópicos]
Porque as datas retornadas do banco de dados não aparecem com a informação do horário?
(versão 1.0)
O tipo do seu campo data, informado no schema.yml (ou schema.xml), deve ser TIMESTAMP. Se o mesmo estiver informado com o tipo DATE, somente a data (sem informação de horário) será gravada.
Ex:
<table name="PESSOA">
<column name="DATA_NASCIMENTO" type="DATE" />
<column name="HORA_NASCIMENTO" type="TIME" />
<column name="UPDATED_AT" type="TIMESTAMP" />
</table>
$obj->getDataNascimento() => 03/05/1985
$obj->getHoraNascimento() => 03:50:58 PM
$obj->getUpdatedAt() => 2008-01-23 18:32:01
Mais sobre os tipos de colunas do Propel
[Voltar aos tópicos]
Como transformar uma URI interna em uma URL externa?
(versão 1.0)
View: Utilize o helper url_for()
Path relativo:
<?php echo url_for('article/read?id=123') ?>
=> /article/read/id/123
Path absoluto:
<?php echo url_for('article/read?id=123', true) ?>
=> 'http://www.domain.com/article/read/id/123'
Controller: Utilize o método genURL() do objeto sfController
Ex:
$uri = "sfGuardAuth/recoverpassword?param1=8¶m2=0fa13c1fda8a0754796";
Path relativo:
$this->getController()->genUrl($uri);
=> sfGuardAuth/recoverpassword/param1/8/param2/0fa13c1fda8a0754796
Path absoluto:
$this->getController()->genUrl($uri, true);
=> http://www.domain.com/sfGuardAuth/recoverpassword/param1/8/param2/0fa13c1fda8a0754796
[Voltar aos tópicos]
Como disponibilizar uma classe para toda minha aplicação (autoload)
(versão 1.0)
Basta adicionar sua classe em qualquer diretório /lib
e o symfony automaticamente fará o autoload, não sendo necessário utilizar os construtores de linguagem include
e require
em sua aplicação.
[Voltar aos tópicos]
Por que é necessário limpar o cache do symfony toda vez que adiciono uma classe ao modelo?
Por questão de performance, o mecanismo de autoload do symfony faz uma busca em uma lista de diretórios (definidos em um arquivo de configuração interno) no primeiro request.
As classes que estes diretórios contém, são registradas então em um arquivo PHP na forma de um array associativo (classe/arquivo), logo, não será necessário varrer novamente estes diretórios para pedidos futuros.
Por este motivo, toda vez que adicionar uma classe ao modelo, assim como para várias outras classes do symfony (que são autoload), é necessário limpar o cache para que o mecanismo de autoload do symfony reconheça ela.
Quando devo utilizar um helper ao invés de um partial?
Utilize um helper quando a função (ou pedaço de código a ser reutilizado) conter mais código PHP do que HTML.
[Voltar aos tópicos]
Quais são os front controllers de uma aplicação desenvolvida com o symfony e onde eles ficam localizados?
Os front controllers são scripts PHP responsáveis pelo processamento de todas as requisições.
O symfony possui dois front controllers para cada aplicação. Um deles,
chamado index.php para a primeira aplicação criada ou <nome_da_aplicacao>.php para as demais, é para o ambiente de produção. O outro, chamado <nome_da_aplicacao>_dev.php, é para o ambiente de desenvolvimento.
Eles ficam localizados no diretório web, dentro do root do projeto (meuprojeto/web).
Qual é a diferença entre ambiente de produção e ambiente de desenvolvimento?
Ambiente de desenvolvimento (front controller: <nome_da_aplicacao>_dev.php):
Ex: http://www.domain.com/frontend_dev.php/
O objetivo deste ambiente é disponibilizar ferramentas para auxiliar o processo de desenvolvimento da aplicação.
- é realizado parse de toda configuração para cada request
- o cache HTML é desativado
- as ferramentas de debug estão todas disponíveis
Ambiente de produção (front controller: index.php para a primeira aplicação ou <nome_da_aplicacao>.php para as demais):
Ex: http://www.domain.com/index.php/ ou http://www.domain.com/, http://www.domain.com/backend.php/
Ambiente ajustado para obter a melhor performance possível para a aplicação.
- configuração é “compilada”
- as ferramentas de debug são desativadas
Quando for transferir seu projeto para um servidor de produção, o(s) front controller(s) de desenvolvimento não deve(m) ser transferido(s), por questão de segurança. Isto já é realizado automaticamente se você optou pela transferência utilizando o rsync através do comando sync do symfony (symfony sync <nome_do_ambiente>
)
[Voltar aos tópicos]
Qual é o melhor local para definir minhas constantes?
O melhor local é em seus arquivos de configuração. Por exemplo, as constantes relativas à sua aplicação devem ser definidas no arquivo app.yml (que está localizado no diretório myproject/apps/myapp/config/)
Ex:
Definindo constantes de e-mails no app.yml:
all:
outgoing_emails:
sender: aplicacao@dominio.com.br
from: aplicacao@dominio.com.br
Pegando os valores das constantes em sua action:
$mailSender = sfConfig::get('app_outgoing_emails_sender');
$mailFrom = sfConfig::get('app_outgoing_emails_from');
Como proceder para esconder o nome do front controller na minha URL?
(versão 1.0)
Basta modificar a configuração no_script_name
para on
no arquivo de configuração settings.yml
(que está no diretório myproject/apps/myapp
) de sua aplicação:
prod:
.settings
no_script_name: on
Esta configuração já está setada para on
, por default, no ambiente de produção. Nos outros ambientes, ela é setada para off
.
Ex:
URL com no_script_name setado para off:
http://www.dominio.com/index.php/posts
URL com no_script_name setado para on:
http://www.dominio.com/posts
[Voltar aos tópicos]
Como alterar automaticamente a cultura utilizando a linguagem de preferência que o usuário setou em seu navegador?
(versão 1.0)
É possível buscar a lista de linguagens de preferência do usuário, em uma action, com o método getLanguages()
do request, que automaticamente converte os headers HTTP do formato string para um array.
Ex – Buscando a linguagem de preferência do usuário, acessando o índice 0
do array $linguagens
:
// buscando as linguagens de preferência do usuário
$linguagens = $this->getRequest()->getLanguages();
// setando a cultura para a linguagem que o usuário definiu em seu navegador
$this->getUser()->setCulture($linguagens[0]);
A lista de linguagens aceitas, que o usuário definiu em seu navegador, são enviadas para o servidor, a cada requisição, através do header HTTP
Accept-Language
.
[Voltar aos tópicos]
[…] symfony Q&A […]
Parabéns,
O blog está muito legal e tem muitas informações legais sobre symfony.
Abraço.
Realmente muito boas suas dicas.
Estava com problemas com o Criteria um colega meu indicou o seu site e aqui obtive as respostas que precisava muito obrigado.
I love your site! 🙂
_____________________
Experiencing a slow PC recently? Fix it now!
É interessante chamar a atenção, na dica sobre o no_script_name, que o módulo mod_rewrite do Apache tem que estar ativado para funcionar. Gastei várias horas antes de encontrar a solução. 🙂