symfony Q&A

Perguntas e respostas sobre o framework symfony.

Tópicos

  1. Como obter os parâmetros do request (valores enviados via post ou get)?
  2. Porque as datas retornadas do banco de dados não aparecem com a informação do horário?
  3. Como transformar uma URI interna em uma URL externa?
  4. Como disponibilizar uma classe para toda minha aplicação (autoload)
  5. Por que é necessário limpar o cache do symfony toda vez que adiciono uma classe ao modelo?
  6. Quando devo utilizar um helper ao invés de um partial?
  7. Quais são os front controllers de uma aplicação desenvolvida com o symfony e onde eles ficam localizados?
  8. Qual é a diferença entre ambiente de produção e ambiente de desenvolvimento?
  9. Qual é o melhor local para definir minhas
    constantes?
  10. Como proceder para esconder o nome do front controller na minha URL?
  11. 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&param2=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.

[Voltar aos tópicos]


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).

[Voltar aos tópicos]


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

[Voltar aos tópicos]


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]

5 comentários em “symfony Q&A

  1. Parabéns,

    O blog está muito legal e tem muitas informações legais sobre symfony.

    Abraço.

  2. battisti disse:

    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.

  3. Michael Tim disse:

    I love your site! 🙂

    _____________________
    Experiencing a slow PC recently? Fix it now!

  4. Frank disse:

    É 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. 🙂

Deixe um comentário