`:
15 |
16 | .. toctree::
17 | :hidden:
18 |
19 | quick_tour/index
20 |
21 | * :doc:`quick_tour/the_big_picture`
22 | * :doc:`quick_tour/the_view`
23 | * :doc:`quick_tour/the_controller`
24 | * :doc:`quick_tour/the_architecture`
25 |
26 | Primeiros Passos
27 | ----------------
28 |
29 | .. toctree::
30 | :maxdepth: 2
31 |
32 | getting_started/index
33 |
34 | Tópicos
35 | -------
36 |
37 | .. toctree::
38 | :maxdepth: 1
39 |
40 | assetic
41 | bundles
42 | console
43 | doctrine
44 | debug
45 | deployment
46 | email
47 | event_dispatcher
48 | expressions
49 | forms
50 | frontend
51 | http_cache
52 | logging
53 | performance
54 | profiler
55 | request
56 | routing
57 | security
58 | session
59 | setup
60 | serializer
61 | service_container
62 | testing
63 | translation
64 | validation
65 |
66 | Melhores Práticas
67 | -----------------
68 |
69 | .. toctree::
70 | :hidden:
71 |
72 | best_practices/index
73 |
74 | Leia as :doc:`Melhores Práticas Oficiais `.
75 |
76 | Componentes
77 | -----------
78 |
79 | .. toctree::
80 | :hidden:
81 |
82 | components/index
83 |
84 | Leia a documentação sobre os :doc:`Componentes `.
85 |
86 | Documentos de Referência
87 | ------------------------
88 |
89 | Obtenha respostas rapidamente com os documentos de referência:
90 |
91 | .. toctree::
92 | :hidden:
93 |
94 | reference/index
95 |
96 | .. include:: /reference/map.rst.inc
97 |
98 | Contribuindo
99 | ------------
100 |
101 | Contribua com o Symfony:
102 |
103 | .. toctree::
104 | :hidden:
105 |
106 | contributing/index
107 |
108 | .. include:: /contributing/map.rst.inc
109 |
110 | Crie o seu Próprio Framework
111 | ----------------------------
112 |
113 | Quer criar o seu próprio framework com base no Symfony?
114 |
115 | .. toctree::
116 | :hidden:
117 |
118 | create_framework/index
119 |
120 | .. include:: /create_framework/map.rst.inc
121 |
--------------------------------------------------------------------------------
/logging/channels_handlers.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Log
3 |
4 | Como fazer log de Mensagens em Arquivos Diferentes
5 | ==================================================
6 |
7 | .. versionadded:: 2.1
8 | A capacidade de especificar os canais para um manipulador específico foi adicionada ao
9 | MonologBundle para o Symfony 2.1.
10 |
11 | A Edição Standard do Symfony contém vários canais para log: ``doctrine``,
12 | ``event``, ``security`` e ``request``. Cada canal corresponde a um serviço logger
13 | (``monolog.logger.XXX``) no container e, é injetado no
14 | serviço em questão. A finalidade dos canais é de serem capazes de organizar diferentes
15 | tipos de mensagens de log.
16 |
17 | Por padrão, o Symfony2 realiza o log de todas as mensagens em um único arquivo (independentemente do
18 | canal).
19 |
20 | Mudando um canal para um Handler diferente
21 | ------------------------------------------
22 |
23 | Agora, suponha que você queira registrar o canal ``doctrine`` para um arquivo diferente.
24 |
25 | Para isso, basta criar um novo manipulador (handler) e configurá-lo como segue:
26 |
27 | .. configuration-block::
28 |
29 | .. code-block:: yaml
30 |
31 | monolog:
32 | handlers:
33 | main:
34 | type: stream
35 | path: /var/log/symfony.log
36 | channels: !doctrine
37 | doctrine:
38 | type: stream
39 | path: /var/log/doctrine.log
40 | channels: doctrine
41 |
42 | .. code-block:: xml
43 |
44 |
45 |
46 |
47 |
48 | exclusive
49 | doctrine
50 |
51 |
52 |
53 |
54 |
55 | inclusive
56 | doctrine
57 |
58 |
59 |
60 |
61 |
62 | Especificação Yaml
63 | ------------------
64 |
65 | Você pode especificar a configuração de várias formas:
66 |
67 | .. code-block:: yaml
68 |
69 | channels: ~ # Include all the channels
70 |
71 | channels: foo # Include only channel "foo"
72 | channels: !foo # Include all channels, except "foo"
73 |
74 | channels: [foo, bar] # Include only channels "foo" and "bar"
75 | channels: [!foo, !bar] # Include all channels, except "foo" and "bar"
76 |
77 | channels:
78 | type: inclusive # Include only those listed below
79 | elements: [ foo, bar ]
80 | channels:
81 | type: exclusive # Include all, except those listed below
82 | elements: [ foo, bar ]
83 |
84 | Criando o seu próprio Canal
85 | ---------------------------
86 |
87 | Você pode mudar o canal que monolog faz o log para um serviço de cada vez. Isto é feito
88 | adicionando a tag ``monolog.logger`` ao seu serviço e especificando qual canal
89 | o serviço deve fazer o log. Ao fazer isso, o logger que é injetado
90 | naquele serviço é pré-configurado para usar o canal que você especificou.
91 |
92 | Para mais informações - incluindo um exemplo completo - leia ":ref:`dic_tags-monolog`"
93 | na seção de referência das Tags de Injeção de Dependência.
94 |
95 | Aprenda mais no Cookbook
96 | ------------------------
97 |
98 | * :doc:`/cookbook/logging/monolog`
99 |
--------------------------------------------------------------------------------
/profiler.rst:
--------------------------------------------------------------------------------
1 | Profiler
2 | ========
3 |
4 | .. toctree::
5 | :maxdepth: 1
6 | :glob:
7 |
8 | profiler/*
9 |
--------------------------------------------------------------------------------
/profiler/storage.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Profiling; Configuração de Armazenamento
3 |
4 | Alterando o Armazenamento do Profiler
5 | =====================================
6 |
7 | Por padrão o profile armazena os dados coletados em arquivos no diretório ``%kernel.cache_dir%/profiler/``.
8 | Você pode controlar o armazenamento que está sendo usado através das opções ``dsn``, ``username``,
9 | ``password`` e ``lifetime``. Por exemplo, a seguinte configuração
10 | usa o MySQL como armazenamento para o profiler com um tempo de vida de uma hora:
11 |
12 | .. configuration-block::
13 |
14 | .. code-block:: yaml
15 |
16 | # app/config/config.yml
17 | framework:
18 | profiler:
19 | dsn: 'mysql:host=localhost;dbname=%database_name%'
20 | username: '%database_user%'
21 | password: '%database_password%'
22 | lifetime: 3600
23 |
24 | .. code-block:: xml
25 |
26 |
27 |
28 |
36 |
37 |
43 |
44 |
45 |
46 | .. code-block:: php
47 |
48 | // app/config/config.php
49 |
50 | // ...
51 | $container->loadFromExtension('framework', array(
52 | 'profiler' => array(
53 | 'dsn' => 'mysql:host=localhost;dbname=%database_name%',
54 | 'username' => '%database_user',
55 | 'password' => '%database_password%',
56 | 'lifetime' => 3600,
57 | ),
58 | ));
59 |
60 | O :doc:`componente HttpKernel ` atualmente
61 | suporta os seguintes drivers de armazenamento para o profiler:
62 |
63 | * file
64 | * sqlite
65 | * mysql
66 | * mongodb
67 | * memcache
68 | * memcached
69 | * redis
70 |
--------------------------------------------------------------------------------
/quick_tour/index.rst:
--------------------------------------------------------------------------------
1 | Guia de Início Rápido
2 | =====================
3 |
4 | .. toctree::
5 | :maxdepth: 1
6 |
7 | the_big_picture
8 | the_view
9 | the_controller
10 | the_architecture
11 |
--------------------------------------------------------------------------------
/reference/configuration/assetic.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | pair: Assetic; Configuration reference
3 |
4 | Configuração do AsseticBundle ("assetic")
5 | =======================================
6 |
7 | Configuração Completa Padrão
8 | ~~~~~~~~~~~~~~~~~~~~~~~~~~
9 |
10 | .. configuration-block::
11 |
12 | .. code-block:: yaml
13 |
14 | assetic:
15 | debug: "%kernel.debug%"
16 | use_controller:
17 | enabled: "%kernel.debug%"
18 | profiler: false
19 | read_from: "%kernel.root_dir%/../web"
20 | write_to: "%assetic.read_from%"
21 | java: /usr/bin/java
22 | node: /usr/bin/node
23 | ruby: /usr/bin/ruby
24 | sass: /usr/bin/sass
25 | # An key-value pair of any number of named elements
26 | variables:
27 | some_name: []
28 | bundles:
29 |
30 | # Defaults (all currently registered bundles):
31 | - FrameworkBundle
32 | - SecurityBundle
33 | - TwigBundle
34 | - MonologBundle
35 | - SwiftmailerBundle
36 | - DoctrineBundle
37 | - AsseticBundle
38 | - ...
39 | assets:
40 | # An array of named assets (e.g. some_asset, some_other_asset)
41 | some_asset:
42 | inputs: []
43 | filters: []
44 | options:
45 | # A key-value array of options and values
46 | some_option_name: []
47 | filters:
48 |
49 | # An array of named filters (e.g. some_filter, some_other_filter)
50 | some_filter: []
51 | twig:
52 | functions:
53 | # An array of named functions (e.g. some_function, some_other_function)
54 | some_function: []
55 |
56 | .. code-block:: xml
57 |
58 |
67 |
68 | FrameworkBundle
69 | SecurityBundle
70 | TwigBundle
71 | MonologBundle
72 | SwiftmailerBundle
73 | DoctrineBundle
74 | AsseticBundle
75 | ...
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
--------------------------------------------------------------------------------
/reference/configuration/monolog.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | pair: Monolog; Referência de Configuração
3 |
4 | Referência de Configuração
5 | ==========================
6 |
7 | .. configuration-block::
8 |
9 | .. code-block:: yaml
10 |
11 | monolog:
12 | handlers:
13 |
14 | # Examples:
15 | syslog:
16 | type: stream
17 | path: /var/log/symfony.log
18 | level: ERROR
19 | bubble: false
20 | formatter: my_formatter
21 | processors:
22 | - some_callable
23 | main:
24 | type: fingerscrossed
25 | action_level: WARNING
26 | buffer_size: 30
27 | handler: custom
28 | custom:
29 | type: service
30 | id: my_handler
31 |
32 | # Default options and values for some "my_custom_handler"
33 | my_custom_handler:
34 | type: ~ # Required
35 | id: ~
36 | priority: 0
37 | level: DEBUG
38 | bubble: true
39 | path: %kernel.logs_dir%/%kernel.environment%.log
40 | ident: false
41 | facility: user
42 | max_files: 0
43 | action_level: WARNING
44 | activation_strategy: ~
45 | stop_buffering: true
46 | buffer_size: 0
47 | handler: ~
48 | members: []
49 | channels:
50 | type: ~
51 | elements: ~
52 | from_email: ~
53 | to_email: ~
54 | subject: ~
55 | email_prototype:
56 | id: ~ # Required (when the email_prototype is used)
57 | factory-method: ~
58 | channels:
59 | type: ~
60 | elements: []
61 | formatter: ~
62 |
63 | .. code-block:: xml
64 |
65 |
70 |
71 |
72 |
80 |
86 |
91 |
92 |
93 |
94 | .. note::
95 |
96 | Quando o profiler é ativado, um handler é adicionado para armazenar as
97 | mensagens dos logs' no profiler. O Profiler usa o nome "debug", então, ele
98 | é reservado e não pode ser utilizado na configuração.
99 |
--------------------------------------------------------------------------------
/reference/constraints.rst:
--------------------------------------------------------------------------------
1 | Referência das Constraints de Validação
2 | =======================================
3 |
4 | .. toctree::
5 | :maxdepth: 1
6 | :hidden:
7 |
8 | constraints/NotBlank
9 | constraints/Blank
10 | constraints/NotNull
11 | constraints/Null
12 | constraints/True
13 | constraints/False
14 | constraints/Type
15 |
16 | constraints/Email
17 | constraints/MinLength
18 | constraints/MaxLength
19 | constraints/Length
20 | constraints/Url
21 | constraints/Regex
22 | constraints/Ip
23 |
24 | constraints/Max
25 | constraints/Min
26 | constraints/Range
27 |
28 | constraints/Date
29 | constraints/DateTime
30 | constraints/Time
31 |
32 | constraints/Choice
33 | constraints/Collection
34 | constraints/Count
35 | constraints/UniqueEntity
36 | constraints/Language
37 | constraints/Locale
38 | constraints/Country
39 |
40 | constraints/File
41 | constraints/Image
42 |
43 | constraints/Callback
44 | constraints/All
45 | constraints/UserPassword
46 | constraints/Valid
47 |
48 | O Validator é projetado para validar objetos comparando com *constraints*.
49 | Na vida real, uma constraint poderia ser: "O bolo não deve ser queimado". No
50 | Symfony2, as constraints são semelhantes: Elas são afirmações de que uma condição
51 | é verdadeira.
52 |
53 | Constraints Suportadas
54 | ----------------------
55 |
56 | As seguintes constraints estão disponíveis nativamente no Symfony2:
57 |
58 | .. include:: /reference/constraints/map.rst.inc
59 |
--------------------------------------------------------------------------------
/reference/forms/types.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Forms; Types Reference
3 |
4 | Referência para Tipos de Form
5 | =============================
6 |
7 | .. toctree::
8 | :maxdepth: 1
9 | :hidden:
10 |
11 | types/birthday
12 | types/checkbox
13 | types/choice
14 | types/collection
15 | types/country
16 | types/csrf
17 | types/date
18 | types/datetime
19 | types/email
20 | types/entity
21 | types/file
22 | types/field
23 | types/form
24 | types/hidden
25 | types/integer
26 | types/language
27 | types/locale
28 | types/money
29 | types/number
30 | types/password
31 | types/percent
32 | types/radio
33 | types/repeated
34 | types/search
35 | types/text
36 | types/textarea
37 | types/time
38 | types/timezone
39 | types/url
40 |
41 | Um form é composto por *campos*, cada um deles é construido com a ajuda de um campo do *tipo*
42 | (ex: um tipo ``text``, tipo ``choice``, etc). Symfony2 tem por padrão uma vasta lista de tipos de
43 | campos que podem ser usados em sua aplicação.
44 |
45 | Tipos de campos suportados
46 | --------------------------
47 |
48 | Os tipos de campo seguintes estão disponíveis nativamente no Symfony2:
49 |
50 | .. include:: /reference/forms/types/map.rst.inc
51 |
--------------------------------------------------------------------------------
/reference/index.rst:
--------------------------------------------------------------------------------
1 | Documentos de Referência
2 | ========================
3 |
4 | .. toctree::
5 | :hidden:
6 |
7 | configuration/monolog
8 |
9 | forms/types
10 |
11 | constraints
12 | requirements
13 |
14 | .. include:: /reference/map.rst.inc
15 |
--------------------------------------------------------------------------------
/reference/map.rst.inc:
--------------------------------------------------------------------------------
1 | * **Opções de Configuração**:
2 |
3 | Já imaginou quais opções de configuração estão disponíveis para você em arquivos
4 | como o ``app/config/config.yml``? Nesta seção, todas as configurações disponíveis
5 | serão separadas por chaves (ex.: ``framework``) que definem cada seção possível
6 | de sua configuração do Symfony2.
7 |
8 | * :doc:`monolog `
9 |
10 | * *Outras Áreas**
11 |
12 | * :doc:`/reference/requirements`
13 |
--------------------------------------------------------------------------------
/reference/requirements.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Requisitos
3 |
4 | Requisitos para o funcionamento do Symfony
5 | ==========================================
6 |
7 | Para funcionar o Symfony, seu sistema precisa seguir uma lista de requisitos. Você pode
8 | facilmente verificar se o sistema passa por todos os requisitos executando o ``web/config.php``
9 | em sua distribuição Symfony. Uma vez que a CLI geralmente utiliza um arquivo de
10 | configuração ``php.ini`` diferente, também é uma boa idéia verificar as necessidades a partir
11 | da linha de comando via:
12 |
13 | .. code-block:: bash
14 |
15 | php app/check.php
16 |
17 | Abaixo está a lista de requisitos obrigatórios e opcionais.
18 |
19 | Obrigatório
20 | -----------
21 |
22 | * Você precisa ter pelo menos a versão 5.3.3 do PHP
23 | * JSON precisa estar habilitado
24 | * ctype precisa estar habilitado
25 | * Seu PHP.ini precisa ter o date.timezone definido
26 |
27 | Opcional
28 | --------
29 |
30 | * Você precisa ter o módulo PHP-XML instalado
31 | * Você precisa ter pelo menos a versão 2.6.21 da libxml
32 | * PHP tokenizer precisa estar habilitado
33 | * As funções da mbstring precisam estar habilitadas
34 | * iconv precisa estar habilitado
35 | * POSIX precisa estar habilitado (apenas no \*nix)
36 | * Intl precisa estar instalado com ICU 4+
37 | * APC 3.0.17+ (ou outro apcode cache precisa estar instalado)
38 | * Configurações recomendadas no PHP.ini
39 |
40 | * ``short_open_tag = Off``
41 | * ``magic_quotes_gpc = Off``
42 | * ``register_globals = Off``
43 | * ``session.autostart = Off``
44 |
45 | Doctrine
46 | --------
47 |
48 | Se você quer usar o Doctrine, você precisará ter a PDO instalada. Além disso,
49 | você precisa ter o driver PDO para o servidor de banco de dados que você deseja usar.
50 |
--------------------------------------------------------------------------------
/request.rst:
--------------------------------------------------------------------------------
1 | Requisição
2 | ==========
3 |
4 | .. toctree::
5 | :maxdepth: 1
6 | :glob:
7 |
8 | request/*
9 |
--------------------------------------------------------------------------------
/request/mime_type.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Request; Add a request format and mime type
3 |
4 | Como registrar um novo Formato de Requisição e de Mime Type
5 | ===========================================================
6 |
7 | Todo ``Request`` possui um "formato" (e.g. ``html``, ``json``), que é usado
8 | para determinar o tipo de conteúdo a ser retornado pelo ``Response``. Na
9 | verdade, o formato de requisição, acessível pelo método
10 | :method:`Symfony\\Component\\HttpFoundation\\Request::getRequestFormat`,
11 | é usado para definir o MIME type do cabeçalho ``Content-Type`` no objeto
12 | ``Response``. Internamente, Symfony contém um mapa dos formatos mais comuns
13 | (e.g. ``html``, ``json``) e seus MIME types associados (e.g. ``text/html``,
14 | ``application/json``). Naturalmente, formatos adicionais de MIME type de
15 | entrada podem ser facilmente adicionados. Este documento irá mostrar como
16 | você pode adicionar o formato ``jsonp`` e seu MIME type correspondente.
17 |
18 | Criando um ``kernel.request`` Listener
19 | --------------------------------------
20 |
21 | A chave para definir um novo MIME type é criar uma classe que irá "ouvir" o
22 | evento ``kernel.request`` enviado pelo kernel do Symfony. O evento
23 | ``kernel.request`` é enviado no início no processo de manipulação da
24 | requisição Symfony e permite que você modifique o objeto da requisição.
25 |
26 |
27 | Crie a seguinte classe, substituindo o caminho com um caminho para um pacote
28 | em seu projeto::
29 |
30 | // src/Acme/DemoBundle/RequestListener.php
31 | namespace Acme\DemoBundle;
32 |
33 | use Symfony\Component\HttpKernel\HttpKernelInterface;
34 | use Symfony\Component\HttpKernel\Event\GetResponseEvent;
35 |
36 | class RequestListener
37 | {
38 | public function onKernelRequest(GetResponseEvent $event)
39 | {
40 | $event->getRequest()->setFormat('jsonp', 'application/javascript');
41 | }
42 | }
43 |
44 | Registrando seu Listener
45 | ------------------------
46 |
47 | Como para qualquer outro listener, você precisa adicioná-lo em um arquivo de
48 | configuração e registrá-lo como um listerner adicionando a tag
49 | ``kernel.event_listener``:
50 |
51 | .. configuration-block::
52 |
53 | .. code-block:: xml
54 |
55 |
56 |
57 |
58 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 | .. code-block:: yaml
69 |
70 | # app/config/config.yml
71 | services:
72 | acme.demobundle.listener.request:
73 | class: Acme\DemoBundle\RequestListener
74 | tags:
75 | - { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
76 |
77 | .. code-block:: php
78 |
79 | # app/config/config.php
80 | $definition = new Definition('Acme\DemoBundle\RequestListener');
81 | $definition->addTag('kernel.event_listener', array('event' => 'kernel.request', 'method' => 'onKernelRequest'));
82 | $container->setDefinition('acme.demobundle.listener.request', $definition);
83 |
84 | Neste ponto, o serviço ``acme.demobundle.listener.request`` foi configurado e
85 | será notificado quando o Symfony kernel enviar um evento ``kernel.request``.
86 |
87 | .. tip::
88 |
89 | Você também pode registrar o ouvinte em uma classe de extensão de
90 | configuração (see :ref:`service-container-extension-configuration`
91 | para mais informações).
92 |
--------------------------------------------------------------------------------
/routing/extra_information.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Roteamento; Informações Extras
3 |
4 | Como Passar Informação Extra para um Controlador a partir de uma Rota
5 | =====================================================================
6 |
7 | Os parâmetros dentro da coleção ``defaults`` não têm necessariamente que
8 | coincidir com um placeholder na rota ``path``. Na verdade, você pode usar o
9 | array ``defaults`` para especificar parâmetros adicionais que serão então acessíveis como
10 | argumentos no controlador:
11 |
12 | .. configuration-block::
13 |
14 | .. code-block:: yaml
15 |
16 | # app/config/routing.yml
17 | blog:
18 | path: /blog/{page}
19 | defaults:
20 | _controller: AppBundle:Blog:index
21 | page: 1
22 | title: "Hello world!"
23 |
24 | .. code-block:: xml
25 |
26 |
27 |
28 |
32 |
33 |
34 | AppBundle:Blog:index
35 | 1
36 | Hello world!
37 |
38 |
39 |
40 | .. code-block:: php
41 |
42 | // app/config/routing.php
43 | use Symfony\Component\Routing\RouteCollection;
44 | use Symfony\Component\Routing\Route;
45 |
46 | $collection = new RouteCollection();
47 | $collection->add('blog', new Route('/blog/{page}', array(
48 | '_controller' => 'AppBundle:Blog:index',
49 | 'page' => 1,
50 | 'title' => 'Hello world!',
51 | )));
52 |
53 | return $collection;
54 |
55 | Agora, você pode acessar esse parâmetro extra em seu controlador::
56 |
57 | public function indexAction($page, $title)
58 | {
59 | // ...
60 | }
61 |
62 | Como você pode ver, a variável ``$title`` nunca foi definida dentro do path da rota,
63 | mas ainda é possível acessar seu valor dentro de seu controlador.
64 |
--------------------------------------------------------------------------------
/routing/redirect_in_config.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Roteamento; Configurar redirecionamento para outra rota sem um controller personalizado
3 |
4 | Como configurar um redirecionamento para outra rota sem um controlador personalizado
5 | ====================================================================================
6 |
7 | Este guia explica como configurar um redirecionamento de uma rota para outra
8 | sem o uso de um controlador personalizado.
9 |
10 | Suponha que não há nenhum controlador padrão útil para o caminho ``/`` da
11 | sua aplicação e você quer redirecionar os pedidos para ``/app``.
12 |
13 | Sua configuração será parecida com a seguinte:
14 |
15 | .. code-block:: yaml
16 |
17 | AppBundle:
18 | resource: "@App/Controller/"
19 | type: annotation
20 | prefix: /app
21 |
22 | root:
23 | pattern: /
24 | defaults:
25 | _controller: FrameworkBundle:Redirect:urlRedirect
26 | path: /app
27 | permanent: true
28 |
29 | Neste exemplo, você configura uma rota para o caminho ``/`` e deixa o class:`Symfony\\Bundle\\FrameworkBundle\\Controller\\RedirectController`
30 | lidar com ela. Este controlador vem com o Symfony e oferece duas ações
31 | para redirecionar o pedido:
32 |
33 | * ``urlRedirect`` redireciona para outro *caminho*. Você deve fornecer o parâmetro
34 | ``path`` contendo o caminho do recurso para o qual deseja redirecionar.
35 |
36 | * ``redirect`` (não mostrado aqui) redireciona para outra *rota*. Você deve fornecer o parâmetro
37 | ``route`` com o *nome* da rota para a qual você quer redirecionar.
38 |
39 | O ``permanent`` informa ambos os métodos para emitir um código de status HTTP 301
40 | em vez do código de status padrão ``302``.
41 |
--------------------------------------------------------------------------------
/routing/redirect_trailing_slash.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Roteamento; Redirecionar URLs com uma barra no final
3 |
4 | Redirecionar URLs com uma Barra no Final
5 | ========================================
6 |
7 | O objetivo deste cookbook é demonstrar como redirecionar URLs com uma
8 | barra no final para a mesma URL sem a barra no final
9 | (por exemplo, ``/en/blog/`` para ``/en/blog``).
10 |
11 | Crie um controlador que irá corresponder a qualquer URL com uma barra no final, remova
12 | a barra do final (mantendo os parâmetros de consulta, se houver) e redirecione para a
13 | nova URL com um código de status 301 de resposta::
14 |
15 | // src/Acme/DemoBundle/Controller/RedirectingController.php
16 | namespace Acme\DemoBundle\Controller;
17 |
18 | use Symfony\Bundle\FrameworkBundle\Controller\Controller;
19 | use Symfony\Component\HttpFoundation\Request;
20 |
21 | class RedirectingController extends Controller
22 | {
23 | public function removeTrailingSlashAction(Request $request)
24 | {
25 | $pathInfo = $request->getPathInfo();
26 | $requestUri = $request->getRequestUri();
27 |
28 | $url = str_replace($pathInfo, rtrim($pathInfo, ' /'), $requestUri);
29 |
30 | return $this->redirect($url, 301);
31 | }
32 | }
33 |
34 | Depois disso, crie uma rota para este controlador que corresponde sempre que uma URL
35 | com uma barra no final é solicitada. Não se esqueça de colocar esta rota por último
36 | no seu sistema, como explicado a seguir:
37 |
38 | .. configuration-block::
39 |
40 | .. code-block:: yaml
41 |
42 | remove_trailing_slash:
43 | path: /{url}
44 | defaults: { _controller: AcmeDemoBundle:Redirecting:removeTrailingSlash }
45 | requirements:
46 | url: .*/$
47 | _method: GET
48 |
49 |
50 | .. code-block:: xml
51 |
52 |
53 |
54 |
55 | AcmeDemoBundle:Redirecting:removeTrailingSlash
56 | .*/$
57 | GET
58 |
59 |
60 |
61 | .. code-block:: php
62 |
63 | use Symfony\Component\Routing\RouteCollection;
64 | use Symfony\Component\Routing\Route;
65 |
66 | $collection = new RouteCollection();
67 | $collection->add(
68 | 'remove_trailing_slash',
69 | new Route(
70 | '/{url}',
71 | array(
72 | '_controller' => 'AcmeDemoBundle:Redirecting:removeTrailingSlash',
73 | ),
74 | array(
75 | 'url' => '.*/$',
76 | '_method' => 'GET',
77 | )
78 | )
79 | );
80 |
81 | .. note::
82 |
83 | Redirecionar uma solicitação POST não funciona bem em navegadores antigos. Um 302
84 | em uma solicitação POST iria enviar uma solicitação GET após o redirecionamento por motivos
85 | legados. Por essa razão, a rota aqui corresponde apenas solicitações GET.
86 |
87 | .. caution::
88 |
89 | Certifique-se de incluir esta rota em sua configuração de roteamento no
90 | final de sua lista de rotas. Caso contrário, você corre o risco de redirecionar
91 | rotas reais (incluindo as rotas principais do Symfony2) que realmente *têm* uma
92 | barra no final do seu caminho.
93 |
--------------------------------------------------------------------------------
/routing/scheme.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Roteamento; Exigência do Esquema
3 |
4 | Como forçar as rotas a usar sempre HTTPS ou HTTP
5 | ================================================
6 |
7 | Às vezes, você deseja proteger algumas rotas e ter certeza de que elas serão sempre
8 | acessadas através do protocolo HTTPS. O componente de Roteamento permite que você aplique
9 | o esquema URI através da condição ``_scheme``:
10 |
11 | .. configuration-block::
12 |
13 | .. code-block:: yaml
14 |
15 | secure:
16 | pattern: /secure
17 | defaults: { _controller: AcmeDemoBundle:Main:secure }
18 | requirements:
19 | _scheme: https
20 |
21 | .. code-block:: xml
22 |
23 |
24 |
25 |
28 |
29 |
30 | AcmeDemoBundle:Main:secure
31 | https
32 |
33 |
34 |
35 | .. code-block:: php
36 |
37 | use Symfony\Component\Routing\RouteCollection;
38 | use Symfony\Component\Routing\Route;
39 |
40 | $collection = new RouteCollection();
41 | $collection->add('secure', new Route('/secure', array(
42 | '_controller' => 'AcmeDemoBundle:Main:secure',
43 | ), array(
44 | '_scheme' => 'https',
45 | )));
46 |
47 | return $collection;
48 |
49 | A configuração acima força a rota ``secure`` à sempre usar HTTPS.
50 |
51 | Ao gerar a URL ``secure``, e se o schema atual for HTTP, o Symfony
52 | irá gerar automaticamente uma URL absoluta com HTTPS como esquema:
53 |
54 | .. code-block:: text
55 |
56 | # If the current scheme is HTTPS
57 | {{ path('secure') }}
58 | # generates /secure
59 |
60 | # If the current scheme is HTTP
61 | {{ path('secure') }}
62 | # generates https://example.com/secure
63 |
64 | A condição também é aplicada para as solicitações de entrada. Se você tentar acessar
65 | o caminho ``/secure`` com HTTP, você será automaticamente redirecionado para a
66 | mesma URL, mas com o esquema HTTPS.
67 |
68 | O exemplo acima utiliza ``https`` para o ``_scheme``, mas você também pode forçar uma
69 | URL à sempre utilizar ``http``.
70 |
71 | .. note::
72 |
73 | O componente Security fornece outra forma de aplicar HTTP ou HTTPs através
74 | da configuração ``requires_channel``. Este método alternativo é mais adequado
75 | para proteger uma "área" do seu site (todas as URLs sob o ``/admin``) ou quando
76 | você quiser proteger URLs definidas em um bundle de terceiros.
--------------------------------------------------------------------------------
/routing/slash_in_parameter.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Roteamento; Permitir / no parâmetro de rota
3 |
4 | Como permitir um caractere "/" em um parâmetro de rota
5 | ======================================================
6 |
7 | Às vezes, você precisa compor URLs com parâmetros que podem conter uma barra
8 | ``/``. Por exemplo, considere a rota clássica ``/hello/{name}``. Por padrão,
9 | ``/hello/Fabien`` irá corresponder a esta rota, mas ``/hello/Fabien/Kris`` não irá.
10 | Isso ocorre porque o Symfony usa esse caractere como separador entre as partes da rota.
11 |
12 | Este guia aborda como você pode modificar a rota para que ``/hello/Fabien/Kris``
13 | corresponda à rota ``/hello/{name}``, onde ``{name}`` iguala ``Fabien/Kris``.
14 |
15 | Configure a Rota
16 | ----------------
17 |
18 | Por padrão, o componente de roteamento do Symfony requer que os parâmetros correspondam
19 | com o seguinte path de expressão regular: ``[^/]+``. Isso significa que todos os caracteres
20 | são permitidos, exceto ``/``.
21 |
22 | Você deve explicitamente permitir que a ``/`` faça parte de seu parâmetro, especificando
23 | um path regex mais permissivo.
24 |
25 | .. configuration-block::
26 |
27 | .. code-block:: yaml
28 |
29 | _hello:
30 | path: /hello/{name}
31 | defaults: { _controller: AcmeDemoBundle:Demo:hello }
32 | requirements:
33 | name: ".+"
34 |
35 | .. code-block:: xml
36 |
37 |
38 |
39 |
42 |
43 |
44 | AcmeDemoBundle:Demo:hello
45 | .+
46 |
47 |
48 |
49 | .. code-block:: php
50 |
51 | use Symfony\Component\Routing\RouteCollection;
52 | use Symfony\Component\Routing\Route;
53 |
54 | $collection = new RouteCollection();
55 | $collection->add('_hello', new Route('/hello/{name}', array(
56 | '_controller' => 'AcmeDemoBundle:Demo:hello',
57 | ), array(
58 | 'name' => '.+',
59 | )));
60 |
61 | return $collection;
62 |
63 | .. code-block:: php-annotations
64 |
65 | use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
66 |
67 | class DemoController
68 | {
69 | /**
70 | * @Route("/hello/{name}", name="_hello", requirements={"name" = ".+"})
71 | */
72 | public function helloAction($name)
73 | {
74 | // ...
75 | }
76 | }
77 |
78 | É isso! Agora, o parâmetro ``{name}`` pode conter o caractere ``/``.
79 |
--------------------------------------------------------------------------------
/security/_ircmaxwell_password-compat.rst.inc:
--------------------------------------------------------------------------------
1 | .. caution::
2 |
3 | Se você está usando o PHP 5.4 ou anterior, será necessário instalar a biblioteca ``ircmaxell/password-compat``
4 | via Composer para poder usar o encoder ``bcrypt``:
5 |
6 | .. code-block:: json
7 |
8 | {
9 | "require": {
10 | ...
11 | "ircmaxell/password-compat": "~1.0.3"
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/security/_supportsToken.rst.inc:
--------------------------------------------------------------------------------
1 | Após o Symfony chamar ``createToken()``, ele irá então chamar ``supportsToken()``
2 | em sua classe (e em quaisquer outros listeners de autenticação) para descobrir quem deve
3 | lidar com o token. Esta é apenas uma maneira de permitir que vários mecanismos de autenticação
4 | sejam utilizados para o mesmo firewall (dessa forma, você pode, por exemplo, primeiro tentar
5 | autenticar o usuário via um certificado ou uma chave de API e fall back para
6 | um formulário de login).
7 |
8 | Na maioria das vezes, você só precisa ter certeza de que esse método retorna ``true`` para um
9 | token que foi criado por ``createToken()``. Sua lógica provavelmente deve parecer
10 | exatamente como neste exemplo.
11 |
--------------------------------------------------------------------------------
/security/force_https.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Segurança; Forçar HTTPS
3 |
4 | Como forçar HTTPS ou HTTP para URLs Diferentes
5 | ==============================================
6 |
7 | Através da configuração de segurança, você pode forçar que áreas do seu site usem o
8 | protocolo ``HTTPS``. Isso é feito através das regras ``access_control`` usando a opção
9 | ``requires_channel``. Por exemplo, se você quiser forçar que todas as URLs que começam
10 | com ``/secure`` utilizem ``HTTPS`` então você poderia usar a seguinte configuração:
11 |
12 | .. configuration-block::
13 |
14 | .. code-block:: yaml
15 |
16 | access_control:
17 | - path: ^/secure
18 | roles: ROLE_ADMIN
19 | requires_channel: https
20 |
21 | .. code-block:: xml
22 |
23 |
24 |
25 |
26 |
27 | .. code-block:: php
28 |
29 | 'access_control' => array(
30 | array(
31 | 'path' => '^/secure',
32 | 'role' => 'ROLE_ADMIN',
33 | 'requires_channel' => 'https',
34 | ),
35 | ),
36 |
37 | O próprio formulário de login precisa permitir acesso anônimo, caso contrário, os usuários
38 | não seriam capazes de se autenticar. Para forçá-lo a usar ``HTTPS`` você pode ainda usar
39 | regras ``access_control`` com o papel
40 | ``IS_AUTHENTICATED_ANONYMOUSLY``:
41 |
42 | .. configuration-block::
43 |
44 | .. code-block:: yaml
45 |
46 | access_control:
47 | - path: ^/login
48 | roles: IS_AUTHENTICATED_ANONYMOUSLY
49 | requires_channel: https
50 |
51 | .. code-block:: xml
52 |
53 |
54 |
57 |
58 |
59 | .. code-block:: php
60 |
61 | 'access_control' => array(
62 | array(
63 | 'path' => '^/login',
64 | 'role' => 'IS_AUTHENTICATED_ANONYMOUSLY',
65 | 'requires_channel' => 'https',
66 | ),
67 | ),
68 |
69 | Também é possível especificar o uso de ``HTTPS`` na configuração de roteamento.
70 | Veja :doc:`/cookbook/routing/scheme` para mais detalhes.
71 |
--------------------------------------------------------------------------------
/security/host_restriction.rst:
--------------------------------------------------------------------------------
1 | Como Restringir Firewalls para um Host Específico
2 | =================================================
3 |
4 | A partir do Symfony 2.5, foram adicionadas mais possibilidades para restringir firewalls.
5 | Você pode ler tudo sobre todas as possibilidades (incluindo ``host``)
6 | em ":doc:`/cookbook/security/firewall_restriction`".
7 |
--------------------------------------------------------------------------------
/security/named_encoders.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Codificadores Nomeados
3 |
4 | Como Escolher Dinamicamente o Algoritmo Codificador de Senha
5 | ============================================================
6 |
7 | Normalmente, o mesmo codificador de senha é usado para todos os usuários configurando-o
8 | para aplicar a todas as instâncias de uma classe específica:
9 |
10 | .. configuration-block::
11 |
12 | .. code-block:: yaml
13 |
14 | # app/config/security.yml
15 | security:
16 | # ...
17 | encoders:
18 | Symfony\Component\Security\Core\User\User: sha512
19 |
20 | .. code-block:: xml
21 |
22 |
23 |
24 |
30 |
31 |
32 |
35 |
36 |
37 |
38 | .. code-block:: php
39 |
40 | // app/config/security.php
41 | $container->loadFromExtension('security', array(
42 | // ...
43 | 'encoders' => array(
44 | 'Symfony\Component\Security\Core\User\User' => array(
45 | 'algorithm' => 'sha512',
46 | ),
47 | ),
48 | ));
49 |
50 | Outra opção é usar um codificador "nomeado" e então selecionar qual codificador
51 | pretende utilizar de forma dinâmica.
52 |
53 | No exemplo anterior, foi definido o algoritmo ``sha512`` para ``Acme\UserBundle\Entity\User``.
54 | Isso pode ser seguro o suficiente para um usuário comum, mas e se você deseja que seus administradores
55 | tenham um algoritmo mais forte, por exemplo `` bcrypt``. Isso pode ser feito com
56 | codificadores nomeados:
57 |
58 | .. configuration-block::
59 |
60 | .. code-block:: yaml
61 |
62 | # app/config/security.yml
63 | security:
64 | # ...
65 | encoders:
66 | harsh:
67 | algorithm: bcrypt
68 | cost: 15
69 |
70 | .. code-block:: xml
71 |
72 |
73 |
74 |
80 |
81 |
82 |
83 |
86 |
87 |
88 |
89 | .. code-block:: php
90 |
91 | // app/config/security.php
92 | $container->loadFromExtension('security', array(
93 | // ...
94 | 'encoders' => array(
95 | 'harsh' => array(
96 | 'algorithm' => 'bcrypt',
97 | 'cost' => '15'
98 | ),
99 | ),
100 | ));
101 |
102 | Isso cria um codificador nomeado ``harsh``. Para que uma instância ``User``
103 | utilize ele, a classe deve implementar
104 | :class:`Symfony\\Component\\Security\\Core\\Encoder\\EncoderAwareInterface`.
105 | A interface requer um método - ``getEncoderName`` - que deve retornar
106 | o nome do codificador que será utilizado::
107 |
108 | // src/Acme/UserBundle/Entity/User.php
109 | namespace Acme\UserBundle\Entity;
110 |
111 | use Symfony\Component\Security\Core\User\UserInterface;
112 | use Symfony\Component\Security\Core\Encoder\EncoderAwareInterface;
113 |
114 | class User implements UserInterface, EncoderAwareInterface
115 | {
116 | public function getEncoderName()
117 | {
118 | if ($this->isAdmin()) {
119 | return 'harsh';
120 | }
121 |
122 | return null; // use the default encoder
123 | }
124 | }
125 |
--------------------------------------------------------------------------------
/security/pre_authenticated.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Segurança; Provedores Pré-Autenticados
3 |
4 | Usando Firewalls de Segurança Pré-Autenticados
5 | ==============================================
6 |
7 | Muitos módulos de autenticação já são fornecidos por alguns servidores web,
8 | incluindo o Apache. Esses módulos geralmente definem algumas variáveis de ambiente
9 | que podem ser usadas para determinar qual usuário está acessando a sua aplicação. O Symfony
10 | suporta a maioria dos mecanismos de autenticação, prontos para o uso.
11 | Esses pedidos são chamados de pedidos *pré-autenticados* porque o usuário já está
12 | autenticado quando chegar a sua aplicação.
13 |
14 | Autenticação de Certificado de Cliente X.509
15 | --------------------------------------------
16 |
17 | Ao usar certificados de cliente, o seu servidor web estará fazendo todo o processo de
18 | autenticação. Com o Apache, por exemplo, você usaria a
19 | diretiva ``SSLVerifyClient Require``.
20 |
21 | Ative a autenticação x509 para um firewall em particular na configuração de segurança:
22 |
23 | .. configuration-block::
24 |
25 | .. code-block:: yaml
26 |
27 | # app/config/security.yml
28 | security:
29 | firewalls:
30 | secured_area:
31 | pattern: ^/
32 | x509:
33 | provider: your_user_provider
34 |
35 | .. code-block:: xml
36 |
37 |
38 |
39 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 | .. code-block:: php
50 |
51 | // app/config/security.php
52 | $container->loadFromExtension('security', array(
53 | 'firewalls' => array(
54 | 'secured_area' => array(
55 | 'pattern' => '^/'
56 | 'x509' => array(
57 | 'provider' => 'your_user_provider',
58 | ),
59 | ),
60 | ),
61 | ));
62 |
63 | Por padrão, o firewall fornece a variável ``SSL_CLIENT_S_DN_Email`` para
64 | o provedor de usuário, e define a ``SSL_CLIENT_S_DN`` como credenciais na
65 | :class:`Symfony\\Component\\Security\\Core\\Authentication\\Token\\PreAuthenticatedToken`.
66 | Você pode sobrescrever elas definindo as chaves ``user`` e ``credentials``
67 | respectivamente, na configuração do firewall x509.
68 |
69 | .. note::
70 |
71 | Um provedor de autenticação só vai informar o provedor de usuário do username
72 | que fez o pedido. Você terá que criar (ou usar) um "provedor de usuário" que
73 | é referenciado pelo parâmetro de configuração ``provider`` (``your_user_provider``
74 | no exemplo de configuração). Esse provedor transformará o username para um objeto User
75 | de sua escolha. Para mais informações sobre como criar ou configurar um provedor de
76 | usuário, veja:
77 |
78 | * :doc:`/cookbook/security/custom_provider`
79 | * :doc:`/cookbook/security/entity_provider`
80 |
--------------------------------------------------------------------------------
/security/target_path.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Segurança; Target Path de redirecionamento
3 |
4 | Como alterar o comportamento padrão do Target Path
5 | ==================================================
6 |
7 | Por padrão, o componente de Segurança mantém as informações da última URI do pedido
8 | em uma variável de sessão chamada ``_security.main.target_path`` (onde ``main`` é o
9 | nome do firewall, definido em ``security.yml``). Após o login bem-sucedido,
10 | o usuário é redirecionado para esse caminho, para ajudá-lo a continuar a partir da
11 | última página conhecida que ele visitou.
12 |
13 | Em algumas situações, isso não é ideal. Por exemplo, quando a última URI do pedido
14 | for um XMLHttpRequest que retornou uma resposta não-HTML ou uma resposta HTML parcial,
15 | o usuário é redirecionado de volta a uma página que o navegador não pode renderizar.
16 |
17 | Para contornar esse comportamento, você precisa simplesmente estender a classe
18 | ``ExceptionListener`` e sobrescrever o método padrão chamado ``setTargetPath()``.
19 |
20 | Primeiro, sobrescreva o parâmetro ``security.exception_listener.class`` no seu
21 | arquivo de configuração. Isso pode ser feito a partir do seu arquivo de configuração principal (em
22 | ``app/config``) ou a partir de um arquivo de configuração a ser importado de um bundle:
23 |
24 | .. configuration-block::
25 |
26 | .. code-block:: yaml
27 |
28 | # src/Acme/HelloBundle/Resources/config/services.yml
29 | parameters:
30 | # ...
31 | security.exception_listener.class: Acme\HelloBundle\Security\Firewall\ExceptionListener
32 |
33 | .. code-block:: xml
34 |
35 |
36 |
37 |
38 | Acme\HelloBundle\Security\Firewall\ExceptionListener
39 |
40 |
41 | .. code-block:: php
42 |
43 | // src/Acme/HelloBundle/Resources/config/services.php
44 | // ...
45 | $container->setParameter('security.exception_listener.class', 'Acme\HelloBundle\Security\Firewall\ExceptionListener');
46 |
47 | Em seguida, crie o seu próprio ``ExceptionListener``::
48 |
49 | // src/Acme/HelloBundle/Security/Firewall/ExceptionListener.php
50 | namespace Acme\HelloBundle\Security\Firewall;
51 |
52 | use Symfony\Component\HttpFoundation\Request;
53 | use Symfony\Component\Security\Http\Firewall\ExceptionListener as BaseExceptionListener;
54 |
55 | class ExceptionListener extends BaseExceptionListener
56 | {
57 | protected function setTargetPath(Request $request)
58 | {
59 | // Do not save target path for XHR requests
60 | // You can add any more logic here you want
61 | // Note that non-GET requests are already ignored
62 | if ($request->isXmlHttpRequest()) {
63 | return;
64 | }
65 |
66 | parent::setTargetPath($request);
67 | }
68 | }
69 |
70 | Adicione aqui a lógica necessária para o seu cenário!
71 |
--------------------------------------------------------------------------------
/security/voter_interface.rst.inc:
--------------------------------------------------------------------------------
1 | .. code-block:: php
2 |
3 | interface VoterInterface
4 | {
5 | public function supportsAttribute($attribute);
6 | public function supportsClass($class);
7 | public function vote(TokenInterface $token, $object, array $attributes);
8 | }
9 |
10 | O método :method:`Symfony\\Component\\Security\\Core\\Authorization\\Voter\\VoterInterface::supportsAttribute`
11 | é usado para verificar se o voter suporta o atributo de usuário fornecido (ou seja:
12 | um papel - role - como ``ROLE_USER``, um ACL ``EDIT``, etc.).
13 |
14 | O método :method:`Symfony\\Component\\Security\\Core\\Authorization\\Voter\\VoterInterface::supportsClass`
15 | é usado para verificar se o voter suporta a classe do objeto cujo
16 | acesso está sendo verificado.
17 |
18 | O método :method:`Symfony\\Component\\Security\\Core\\Authorization\\Voter\\VoterInterface::vote`
19 | deve implementar a lógica de negócio que verifica se o
20 | usuário tem acesso. Esse método deve retornar um dos seguintes valores:
21 |
22 | * ``VoterInterface::ACCESS_GRANTED``: A autorização será concedida por este voter;
23 | * ``VoterInterface::ACCESS_ABSTAIN``: O voter não pode decidir se a autorização deve ser concedida;
24 | * ``VoterInterface::ACCESS_DENIED``: A autorização será negada por este voter.
25 |
--------------------------------------------------------------------------------
/service_container/shared.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Container de Serviço; Serviços Compartilhados
3 |
4 | Como Definir Serviços não Compartilhados
5 | ========================================
6 |
7 | .. versionadded:: 2.8
8 | A configuração ``shared`` foi introduzida no Symfony 2.8. Antes do Symfony 2.8,
9 | era necessário usar o escopo ``prototype``.
10 |
11 | No container de serviço, todos os serviços são compartilhados por padrão. Isso significa que,
12 | cada vez que você recuperar o serviço, vai obter a *mesma* instância. Esse é
13 | muitas vezes o comportamento que você quer, mas, em alguns casos, você pode querer obter sempre
14 | uma *nova* instância.
15 |
16 | A fim de obter sempre uma nova instância, defina a configuração ``shared`` para ``false``
17 | em sua definição de serviço:
18 |
19 | .. configuration-block::
20 |
21 | .. code-block:: yaml
22 |
23 | # app/config/services.yml
24 | services:
25 | app.some_not_shared_service:
26 | class: ...
27 | shared: false
28 | # ...
29 |
30 | .. code-block:: xml
31 |
32 |
33 |
34 |
35 |
36 |
37 | .. code-block:: php
38 |
39 | // app/config/services.php
40 | use Symfony\Component\DependencyInjection\Definition;
41 |
42 | $definition = new Definition('...');
43 | $definition->setShared(false);
44 |
45 | $container->setDefinition('app.some_not_shared_service', $definition);
46 |
47 | Agora, sempre que você chamar ``$container->get('app.some_not_shared_service')`` ou
48 | injetar esse serviço, você receberá uma nova instância.
49 |
--------------------------------------------------------------------------------
/session.rst:
--------------------------------------------------------------------------------
1 | Sessões
2 | =======
3 |
4 | .. toctree::
5 | :maxdepth: 1
6 | :glob:
7 |
8 | session/*
9 |
--------------------------------------------------------------------------------
/session/avoid_session_start.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Sessões, cookies
3 |
4 | Evite Iniciar Sessões para Usuários Anônimos
5 | ============================================
6 |
7 | As sessões são iniciadas automaticamente quando você lê, escreve ou até mesmo verifica a
8 | existência de dados na sessão. Isso significa que se você precisa evitar a criação de
9 | um cookie de sessão para alguns usuários, pode ser difícil: você deve evitar *completamente*
10 | acessar a sessão.
11 |
12 | Por exemplo, um problema comum nessa situação envolve a verificação de
13 | mensagens flash, que são armazenadas na sessão. O código a seguir garantirá
14 | que uma sessão seja *sempre* iniciada:
15 |
16 | .. code-block:: html+jinja
17 |
18 | {% for flashMessage in app.session.flashbag.get('notice') %}
19 |
20 | {{ flashMessage }}
21 |
22 | {% endfor %}
23 |
24 | Mesmo que o usuário não esteja logado e que você não tenha criado nenhuma mensagem flash,
25 | apenas chamar o método ``get()`` (ou mesmo ``has()``) do `` flashbag`` irá
26 | iniciar uma sessão. Isso pode prejudicar o desempenho do aplicação, porque todos os usuários
27 | irão receber um cookie de sessão. Para evitar esse comportamento, adicione uma verificação antes de tentar
28 | acessar as mensagens flash:
29 |
30 | .. code-block:: html+jinja
31 |
32 | {% if app.request.hasPreviousSession %}
33 | {% for flashMessage in app.session.flashbag.get('notice') %}
34 |
35 | {{ flashMessage }}
36 |
37 | {% endfor %}
38 | {% endif %}
39 |
--------------------------------------------------------------------------------
/session/limit_metadata_writes.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Limite a Escrita dos Metadados; Sessão
3 |
4 | Limite a Escrita dos Metadados de Sessão
5 | ========================================
6 |
7 | O comportamento padrão da sessão PHP é persistir a sessão independentemente
8 | se os dados da sessão foram alterados ou não. No Symfony, cada vez que a sessão
9 | é acessada, os metadados são gravados (sessão criada/utilizada pela última vez) que pode ser usado
10 | para determinar a idade da sessão e o tempo ocioso.
11 |
12 | Se, por razões de desempenho, você deseja limitar a frequência com que a sessão
13 | é persistida, esse recurso pode ajustar a granularidade das atualizações de metadados e
14 | persistir a sessão com menos frequência, enquanto mantêm os metadados relativamente
15 | precisos. Se outros dados de sessão forem alterados, a sessão irá sempre persistir.
16 |
17 | Você pode dizer ao Symfony para não atualizar o metadado de tempo da "última atualização da sessão"
18 | até que uma certa quantidade de tempo tenha passado, por definição
19 | ``framework.session.metadata_update_threshold`` para um valor em segundos maior
20 | que zero:
21 |
22 | .. configuration-block::
23 |
24 | .. code-block:: yaml
25 |
26 | framework:
27 | session:
28 | metadata_update_threshold: 120
29 |
30 | .. code-block:: xml
31 |
32 |
33 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 | .. code-block:: php
46 |
47 | $container->loadFromExtension('framework', array(
48 | 'session' => array(
49 | 'metadata_update_threshold' => 120,
50 | ),
51 | ));
52 |
53 | .. note::
54 |
55 | O comportamento padrão do PHP é salvar a sessão tanto se ela foi alterada ou
56 | não. Ao usar ``framework.session.metadata_update_threshold`` o Symfony
57 | envolverá o manipulador de sessão (configurado em
58 | ``framework.session.handler_id``) no WriteCheckSessionHandler. Isso
59 | impedirá que qualquer sessão grave se a sessão não foi modificada.
60 |
61 | .. caution::
62 |
63 | Esteja ciente de que, se a sessão não é escrita em cada requisição, ela pode ser
64 | coletada pelo coletor de lixo (garbage collector), mais cedo do que o habitual. Isso significa que seus
65 | usuários podem ser deslogados mais cedo do que o esperado.
66 |
--------------------------------------------------------------------------------
/session/php_bridge.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Sessões
3 |
4 | Ponte para uma Aplicação legada com Sessões Symfony
5 | ===================================================
6 |
7 | .. versionadded:: 2.3
8 | A capacidade de integrar com uma sessão legada PHP foi introduzida no Symfony 2.3.
9 |
10 | Se você está integrando o Framework Symfony full-stack em uma aplicação legada
11 | que inicia a sessão com ``session_start()``, você ainda pode ser capaz de
12 | usar o gerenciamento de sessão do Symfony usando uma ponte com sessão PHP.
13 |
14 | Se a aplicação tiver definido seu próprio manipulador de armazenamento PHP, você pode
15 | especificar null para ``handler_id``:
16 |
17 | .. configuration-block::
18 |
19 | .. code-block:: yaml
20 |
21 | framework:
22 | session:
23 | storage_id: session.storage.php_bridge
24 | handler_id: ~
25 |
26 | .. code-block:: xml
27 |
28 |
29 |
31 |
32 |
33 |
36 |
37 |
38 |
39 | .. code-block:: php
40 |
41 | $container->loadFromExtension('framework', array(
42 | 'session' => array(
43 | 'storage_id' => 'session.storage.php_bridge',
44 | 'handler_id' => null,
45 | ));
46 |
47 | Caso contrário, se o problema é simplesmente que você não pode evitar que a aplicação
48 | inicie a sessão com ``session_start()``, você ainda pode fazer uso de um manipulador de
49 | armazenamento de sessão com base no Symfony especificando o manipulador de armazenamento
50 | como no exemplo a seguir:
51 |
52 | .. configuration-block::
53 |
54 | .. code-block:: yaml
55 |
56 | framework:
57 | session:
58 | storage_id: session.storage.php_bridge
59 | handler_id: session.handler.native_file
60 |
61 | .. code-block:: xml
62 |
63 |
64 |
66 |
67 |
68 |
71 |
72 |
73 |
74 | .. code-block:: php
75 |
76 | $container->loadFromExtension('framework', array(
77 | 'session' => array(
78 | 'storage_id' => 'session.storage.php_bridge',
79 | 'handler_id' => 'session.storage.native_file',
80 | ));
81 |
82 | .. note::
83 |
84 | Se a aplicação legada requer seu próprio manipulador de armazenamento de sessão, não
85 | sobrescreva ele. Em vez disso defina ``handler_id: ~``. Note que o manipulador de armazenamento
86 | não pode ser alterado uma vez que a sessão foi iniciada. Se a aplicação
87 | inicia a sessão antes do Symfony ser inicializado, o manipulador de armazenamento já
88 | terá sido definido. Nesse caso, será necessário ``handler_id: ~``.
89 | Apenas sobrescreva o manipulador de armazenamento se você tem certeza que a aplicação legada
90 | pode usar o manipulador de armazenamento do Symfony sem efeitos colaterais e que a sessão
91 | não foi iniciada antes do Symfony ser inicializado.
92 |
93 | Para mais detalhes, consulte :doc:`/components/http_foundation/session_php_bridge`.
94 |
--------------------------------------------------------------------------------
/session/proxy_examples.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Sessões, Proxy de Sessão, Proxy
3 |
4 | Exemplos de Proxy de Sessão
5 | ===========================
6 |
7 | O mecanismo de proxy de sessão possui uma variedade de usos e este exemplo demonstra
8 | dois usos comuns. Ao invés de injetar o manipulador de sessão como habitualmente, um manipulador
9 | é injetado no proxy e registrado com o driver de armazenamento de sessão::
10 |
11 | use Symfony\Component\HttpFoundation\Session\Session;
12 | use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
13 | use Symfony\Component\HttpFoundation\Session\Storage\Handler\PdoSessionHandler;
14 |
15 | $proxy = new YourProxy(new PdoSessionHandler());
16 | $session = new Session(new NativeSessionStorage(array(), $proxy));
17 |
18 | Abaixo, você vai aprender dois exemplos reais que podem ser utilizados para ``YourProxy``:
19 | criptografia de dados de sessão e sessões somente leitura para visitantes.
20 |
21 | Criptografia de Dados da Sessão
22 | -------------------------------
23 |
24 | Se quiser criptografar os dados da sessão, você pode usar o proxy para criptografar
25 | e descriptografar a sessão conforme necessário::
26 |
27 | use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy;
28 |
29 | class EncryptedSessionProxy extends SessionHandlerProxy
30 | {
31 | private $key;
32 |
33 | public function __construct(\SessionHandlerInterface $handler, $key)
34 | {
35 | $this->key = $key;
36 |
37 | parent::__construct($handler);
38 | }
39 |
40 | public function read($id)
41 | {
42 | $data = parent::read($id);
43 |
44 | return mcrypt_decrypt(\MCRYPT_3DES, $this->key, $data);
45 | }
46 |
47 | public function write($id, $data)
48 | {
49 | $data = mcrypt_encrypt(\MCRYPT_3DES, $this->key, $data);
50 |
51 | return parent::write($id, $data);
52 | }
53 | }
54 |
55 | Sessões Somente Leitura para Visitantes
56 | ---------------------------------------
57 |
58 | Existem algumas aplicações onde uma sessão é necessária para usuários visitantes, mas
59 | não existe necessidade particular para persistir a sessão. Nesse caso você
60 | pode interceptar a sessão antes dela ser gravada::
61 |
62 | use Foo\User;
63 | use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy;
64 |
65 | class ReadOnlyGuestSessionProxy extends SessionHandlerProxy
66 | {
67 | private $user;
68 |
69 | public function __construct(\SessionHandlerInterface $handler, User $user)
70 | {
71 | $this->user = $user;
72 |
73 | parent::__construct($handler);
74 | }
75 |
76 | public function write($id, $data)
77 | {
78 | if ($this->user->isGuest()) {
79 | return;
80 | }
81 |
82 | return parent::write($id, $data);
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/setup/_update_all_packages.rst.inc:
--------------------------------------------------------------------------------
1 | Atualizando outros Pacotes
2 | ~~~~~~~~~~~~~~~~~~~~~~~~~~
3 |
4 | Você também pode desejar atualizar as suas bibliotecas restantes. Caso você tenha feito um
5 | bom trabalho com suas `restrições de versão`_ no ``composer.json``, você pode fazer
6 | isso com segurança executando:
7 |
8 | .. code-block:: bash
9 |
10 | $ composer update
11 |
12 | .. caution::
13 |
14 | Cuidado, se você possui `restrições de versão`_ inespecíficas em seu
15 | ``composer.json`` (ex. ``dev-master``), isso pode atualizar algumas
16 | bibliotecas não-Symfony para novas versões que contêm alterações que quebram a
17 | compatibilidade com versões anteriores.
18 |
19 | .. _`restrições de versão`: https://getcomposer.org/doc/01-basic-usage.md#package-versions
20 |
--------------------------------------------------------------------------------
/setup/_update_dep_errors.rst.inc:
--------------------------------------------------------------------------------
1 | Erros de Dependência
2 | ~~~~~~~~~~~~~~~~~~~~
3 |
4 | Se você receber um erro de dependência, pode significar somente que você precisa atualizar
5 | também outras dependências Symfony. Nesse caso, tente o seguinte comando:
6 |
7 | .. code-block:: bash
8 |
9 | $ composer update symfony/symfony --with-dependencies
10 |
11 | Isso atualiza ``symfony/symfony`` e *todos* os pacotes dos quais ele depende, o que irá
12 | incluir vários outros pacotes. Usando restrições de versão limitadas no
13 | ``composer.json``, você pode controlar para quais versões cada biblioteca atualiza.
14 |
15 | Se isso ainda não funcionar, o seu arquivo ``composer.json`` pode especificar uma versão
16 | para uma biblioteca que não é compatível com a versão mais recente Symfony. Nesse
17 | caso, a atualização da biblioteca para uma versão mais recente no ``composer.json`` pode resolver
18 | o problema.
19 |
20 | Ou, você pode ter problemas mais profundos, onde diferentes bibliotecas dependem de versões conflitantes
21 | de outras bibliotecas. Verifique a sua mensagem de erro para depuração.
22 |
--------------------------------------------------------------------------------
/setup/_vendor_deps.rst.inc:
--------------------------------------------------------------------------------
1 | Gerenciando Bibliotecas Vendor com o ``composer.json``
2 | ------------------------------------------------------
3 |
4 | Como funciona?
5 | ~~~~~~~~~~~~~~
6 |
7 | Cada projeto Symfony utiliza um grupo de bibliotecas "vendor" de terceiros. De
8 | qualquer forma, o objetivo é fazer o download desses arquivos em seu diretório
9 | ``vendor/`` e, idealmente, fornecer alguma forma sã para gerenciar a versão exata
10 | que você precisa para cada um.
11 |
12 | Por padrão, essas bibliotecas são baixadas executando um binário "downloader"
13 | ``composer install``. Esse arquivo ``composer`` é de uma biblioteca chamada `Composer`_
14 | e você pode ler mais sobre como instalá-la no capítulo
15 | :ref:`Instalação `.
16 |
17 | O comando ``composer`` lê a partir do arquivo ``composer.json`` no raiz
18 | do seu projeto. Ele é um arquivo formatado em JSON, que contém uma lista de cada
19 | um dos pacotes externos que você precisa, a versão a ser baixada e muito mais.
20 | O ``composer`` também lê a partir de um arquivo ``composer.lock``, que lhe permite
21 | fixar cada biblioteca para uma versão **exata**. Na verdade, se um arquivo ``composer.lock``
22 | existe, as versões dentro dele substituirão aquelas em ``composer.json``.
23 | Para atualizar suas bibliotecas para novas versões, execute ``composer update``.
24 |
25 | .. tip::
26 |
27 | Se você quiser adicionar um novo pacote na sua aplicação, execute o comando composer
28 | ``require``:
29 |
30 | .. code-block:: bash
31 |
32 | $ composer require doctrine/doctrine-fixtures-bundle
33 |
34 | Para saber mais sobre o Composer, veja `GetComposer.org`_:
35 |
36 | É importante perceber que essas bibliotecas vendor *não* são realmente parte
37 | do *seu* repositório. Em vez disso, elas são simplesmente arquivos não monitorados que são baixados
38 | para o diretório ``vendor/``. Mas, uma vez que todas as informações necessárias para baixar esses
39 | arquivos são guardadas em ``composer.json`` e ``composer.lock`` (que *são* armazenados
40 | no repositório), qualquer outro desenvolvedor pode usar o projeto, executando ``composer install``,
41 | e baixando exatamente o mesmo conjunto de bibliotecas vendor. Isso significa que você está
42 | controlando exatamente como cada biblioteca vendor parece, sem a necessidade de
43 | realmente fazer o commit delas para *seu* repositório.
44 |
45 | Assim, sempre que um desenvolvedor usa o seu projeto, deve executar o secript ``composer install``
46 | para assegurar que todas as bibliotecas vendor necessários são baixadas.
47 |
48 | .. sidebar:: Atualizando o Symfony
49 |
50 | Uma vez que o Symfony é apenas um grupo de bibliotecas de terceiros e que essas
51 | bibliotecas são inteiramente controladas através de ``composer.json`` e ``composer.lock``,
52 | a atualização do Symfony significa simplesmente atualizar cada um desses arquivos para coincidir
53 | seu estado com a última Edição Standard do Symfony.
54 |
55 | Claro, se você adicionou novas entradas no ``composer.json``, certifique-se
56 | de substituir apenas as partes originais (ou seja, cuidado para não excluir também qualquer uma
57 | de suas entradas personalizadas).
58 |
59 | .. _Composer: https://getcomposer.org/
60 | .. _GetComposer.org: https://getcomposer.org/
61 |
--------------------------------------------------------------------------------
/setup/composer.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | double: Composer; Instalação
3 |
4 | Instalando o Composer
5 | =====================
6 |
7 | `Composer`_ é o gerenciador de dependências usado por aplicações PHP modernas. Use o Composer
8 | para gerenciar dependências em suas aplicações Symfony e para instalar componentes Symfony
9 | em seus projetos PHP.
10 |
11 | É recomendado instalar o Composer globalmente em seu sistema como explicado nas
12 | seções seguintes.
13 |
14 | Instalar o Composer no Linux e no Mac OS X
15 | ------------------------------------------
16 |
17 | Para instalar o Composer no Linux ou Mac OS X, execute os seguintes comandos:
18 |
19 | .. code-block:: bash
20 |
21 | $ curl -sS https://getcomposer.org/installer | php
22 | $ sudo mv composer.phar /usr/local/bin/composer
23 |
24 | .. note::
25 |
26 | Se você não tem o ``curl`` instalado, você também pode simplesmente baixar o
27 | arquivo ``installer`` manualmente em https://getcomposer.org/installer e
28 | em seguida, executar:
29 |
30 | .. code-block:: bash
31 |
32 | $ php installer
33 | $ sudo mv composer.phar /usr/local/bin/composer
34 |
35 | Instalar o Composer no Windows
36 | ------------------------------
37 |
38 | Faça o download do instalador em `getcomposer.org/download`_, execute ele e siga
39 | as instruções.
40 |
41 | Saiba mais
42 | ----------
43 |
44 | Leia a `documentação do Composer`_ para saber mais sobre a sua utilização e características.
45 |
46 | .. _`Composer`: https://getcomposer.org/
47 | .. _`getcomposer.org/download`: https://getcomposer.org/download
48 | .. _`documentação do Composer`: https://getcomposer.org/doc/00-intro.md
49 |
--------------------------------------------------------------------------------
/setup/upgrade_minor.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Atualização; Versão Menor
3 |
4 | Atualizando uma Versão Menor (ex., 2.5.3 para 2.6.1)
5 | ====================================================
6 |
7 | Se você estiver atualizando uma versão menor (onde o número do meio muda), então
8 | você *não* deve encontrar mudanças significativas de compatibilidade com versões anteriores. Para
9 | detalhes, consulte a :doc:`promessa Symfony de compatibilidade com versões anteriores `.
10 |
11 | No entanto, algumas quebras de compatibilidade com versões anteriores *são* possíveis e você vai aprender em
12 | um segundo como se preparar para elas.
13 |
14 | Há duas etapas para atualizar uma versão menor:
15 |
16 | #. :ref:`Atualizar a biblioteca Symfony via Composer `;
17 | #. :ref:`Atualizar seu código para funcionar com a nova versão `.
18 |
19 | .. _`upgrade-minor-symfony-composer`:
20 |
21 | 1) Atualizar a Biblioteca Symfony via Composer
22 | ----------------------------------------------
23 |
24 | Primeiro, você precisa atualizar o Symfony, modificando seu arquivo ``composer.json``
25 | para usar a nova versão:
26 |
27 | .. code-block:: json
28 |
29 | {
30 | "...": "...",
31 |
32 | "require": {
33 | "symfony/symfony": "2.6.*",
34 | },
35 | "...": "...",
36 | }
37 |
38 | Em seguida, use o Composer para fazer o download de novas versões das bibliotecas:
39 |
40 | .. code-block:: bash
41 |
42 | $ composer update symfony/symfony
43 |
44 | .. include:: /cookbook/upgrade/_update_dep_errors.rst.inc
45 |
46 | .. include:: /cookbook/upgrade/_update_all_packages.rst.inc
47 |
48 | .. _`upgrade-minor-symfony-code`:
49 |
50 | 2) Atualizando seu Código para Funcionar com a nova Versão
51 | ----------------------------------------------------------
52 |
53 | Em teoria, deve estar tudo pronto! No entanto, você *pode* precisar fazer algumas mudanças
54 | em seu código para tudo funcionar. Além disso, alguns recursos que você está
55 | usando podem ainda funcionar, porém podem agora estar obsoletos. Enquanto está tudo bem,
56 | se você sabe sobre esses recursos obsoletos, você pode começar a corrigí-los ao longo do tempo.
57 |
58 | Cada versão do Symfony vem com um arquivo de atualização (por exemplo, `UPGRADE-2.7.md`_)
59 | incluído no diretório Symfony que descreve essas mudanças. Se você seguir
60 | as instruções no documento e atualizar o seu código de forma adequada, deve ser
61 | seguro atualizar no futuro.
62 |
63 | Esses documentos também podem ser encontrados no `Repositório Symfony`_.
64 |
65 | .. _`Repositório Symfony`: https://github.com/symfony/symfony
66 | .. _`UPGRADE-2.7.md`: https://github.com/symfony/symfony/blob/2.7/UPGRADE-2.7.md
67 |
--------------------------------------------------------------------------------
/setup/upgrade_patch.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Atualização; Versão de Correção (Patch)
3 |
4 | Atualizando uma Versão de Correção (Patch) (ex., 2.6.0 para 2.6.1)
5 | ==================================================================
6 |
7 | Quando uma nova versão de correção é lançada (apenas o último número alterado), é um
8 | lançamento que contém apenas correções de bugs. Isso significa que a atualização para uma nova
9 | versão de correção é *realmente* fácil:
10 |
11 | .. code-block:: bash
12 |
13 | $ composer update symfony/symfony
14 |
15 | É isso! Você não deve encontrar quaisquer quebras de compatibilidade com versões anteriores
16 | ou precisar alterar algo em seu código. Isso porque quando você começou
17 | seu projeto, o seu ``composer.json`` incluiu o Symfony usando uma restrição
18 | como ``2.6.*``, onde apenas o *último* número da versão mudará quando você
19 | atualizar.
20 |
21 | .. tip::
22 |
23 | Recomenda-se atualizar para uma nova versão de correção o mais rápido possível, pois
24 | erros importantes e vazamentos de segurança podem ser corrigidos nesses novos lançamentos.
25 |
26 | .. include:: /cookbook/upgrade/_update_all_packages.rst.inc
27 |
--------------------------------------------------------------------------------
/templating/global_variables.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Templating; Global variables
3 |
4 | Utilizando variáveis em todas templates (Variáveis globais)
5 | ===========================================================
6 |
7 | Algumas vezes você quer que uma variável esteja disponível em todas as templates que utiliza.
8 | Isto é possível configurando o twig dentro do arquivo ``app/config/config.yml`` :
9 |
10 | .. code-block:: yaml
11 |
12 | # app/config/config.yml
13 | twig:
14 | # ...
15 | globals:
16 | ga_tracking: UA-xxxxx-x
17 |
18 | Agora a variável ``ga_tracking`` está disponível em todas templates Twig e pode ser acessada
19 | da seguinte forma.
20 |
21 | .. code-block:: html+jinja
22 |
23 | Our google tracking code is: {{ ga_tracking }}
24 |
25 | É fácil! Você também pode utilizar do sistema de parâmetros (:ref:`book-service-container-parameters`),
26 | que permite você isolar e reutilizar o valor como a seguir.
27 |
28 | .. code-block:: ini
29 |
30 | ; app/config/parameters.yml
31 | [parameters]
32 | ga_tracking: UA-xxxxx-x
33 |
34 | .. code-block:: yaml
35 |
36 | # app/config/config.yml
37 | twig:
38 | globals:
39 | ga_tracking: %ga_tracking%
40 |
41 | A mesma variável está disponível exatamente como antes.
42 |
43 | Variáveis globais mais complexas
44 | --------------------------------
45 |
46 | Se a variável global que deseja definir é mais complexa, como um objeto por exemplo,
47 | então você não poderá utilizar o método acima. Ao invés disso, precisa criar uma
48 | extensão Twig (:ref:`Twig Extension`) e retornar
49 | a variável global como uma das entradas no método ``getGlobals``.
50 |
--------------------------------------------------------------------------------
/templating/twig_extension.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Extensões Twig
3 |
4 | Como Escrever uma Extensão Twig Personalizada
5 | =============================================
6 |
7 | A principal motivação para escrever uma extensão é mover código usado frequentemente
8 | em uma classe reutilizável como adicionar suporte para internacionalização.
9 | Uma extensão pode definir tags, filtros, testes, operadores, variáveis globais,
10 | funções e node visitors.
11 |
12 | Criar uma extensão também contribui para uma melhor separação do código que é
13 | executado em tempo de compilação e código necessário em tempo de execução. Assim, ela torna
14 | o seu código mais rápido.
15 |
16 | .. tip::
17 |
18 | Antes de escrever suas próprias extensões, verifique o
19 | `repositório de extensão oficial do Twig`_.
20 |
21 | Criar a Classe de Extensão
22 | --------------------------
23 |
24 | .. note::
25 |
26 | Este cookbook descreve como escrever uma extensão Twig personalizada a partir do
27 | Twig 1.12. Se você estiver usando uma versão mais antiga, por favor leia a
28 | `documentação das extensões Twig legada`_.
29 |
30 | Para obter a sua funcionalidade personalizada, primeiro você deve criar uma classe de extensão Twig.
31 | Como exemplo, você vai criar um filtro de preço para formatar um determinado número em preço::
32 |
33 | // src/AppBundle/Twig/AppExtension.php
34 | namespace AppBundle\Twig;
35 |
36 | class AppExtension extends \Twig_Extension
37 | {
38 | public function getFilters()
39 | {
40 | return array(
41 | new \Twig_SimpleFilter('price', array($this, 'priceFilter')),
42 | );
43 | }
44 |
45 | public function priceFilter($number, $decimals = 0, $decPoint = '.', $thousandsSep = ',')
46 | {
47 | $price = number_format($number, $decimals, $decPoint, $thousandsSep);
48 | $price = '$'.$price;
49 |
50 | return $price;
51 | }
52 |
53 | public function getName()
54 | {
55 | return 'app_extension';
56 | }
57 | }
58 |
59 | .. tip::
60 |
61 | Junto com os filtros personalizados, você também pode adicionar `funções` personalizadas e registrar
62 | `variáveis globais`.
63 |
64 | Registrar uma Extensão como um Serviço
65 | --------------------------------------
66 |
67 | Agora você deve deixar o Container de Serviço saber sobre a sua extensão Twig recém-criada:
68 |
69 | .. configuration-block::
70 |
71 | .. code-block:: yaml
72 |
73 | # app/config/services.yml
74 | services:
75 | app.twig_extension:
76 | class: AppBundle\Twig\AppExtension
77 | public: false
78 | tags:
79 | - { name: twig.extension }
80 |
81 | .. code-block:: xml
82 |
83 |
84 |
85 |
88 |
89 |
90 |
91 |
92 | .. code-block:: php
93 |
94 | // app/config/services.php
95 | use Symfony\Component\DependencyInjection\Definition;
96 |
97 | $container
98 | ->register('app.twig_extension', '\AppBundle\Twig\AppExtension')
99 | ->setPublic(false)
100 | ->addTag('twig.extension');
101 |
102 | Usar a Extensão Personalizada
103 | -----------------------------
104 |
105 | Usar sua extensão Twig recém-criada não é diferente de qualquer outra:
106 |
107 | .. code-block:: twig
108 |
109 | {# outputs $5,500.00 #}
110 | {{ '5500'|price }}
111 |
112 | Passando outros argumentos para o seu filtro:
113 |
114 | .. code-block:: twig
115 |
116 | {# outputs $5500,2516 #}
117 | {{ '5500.25155'|price(4, ',', '') }}
118 |
119 | Aprender mais
120 | -------------
121 |
122 | Para aprofundar mais sobre Extensões Twig, por favor verifique a
123 | `documentação de extensões Twig`_.
124 |
125 | .. _`repositório de extensão oficial do Twig`: https://github.com/twigphp/Twig-extensions
126 | .. _`documentação de extensões Twig`: http://twig.sensiolabs.org/doc/advanced.html#creating-an-extension
127 | .. _`variáveis globais`: http://twig.sensiolabs.org/doc/advanced.html#id1
128 | .. _`funções`: http://twig.sensiolabs.org/doc/advanced.html#id2
129 | .. _`documentação das extensões Twig legada`: http://twig.sensiolabs.org/doc/advanced_legacy.html#creating-an-extension
130 |
--------------------------------------------------------------------------------
/testing/bootstrap.rst:
--------------------------------------------------------------------------------
1 | Como customizar o processo de Bootstrap antes de rodar os testes
2 | ================================================================
3 |
4 | Algumas vezes quando testes são rodados, você precisa fazer trabalho adicional
5 | de inicialização antes de rodá-los. Por exemplo, se você esta rodando um teste funcional
6 | e foi introduzido um novo recurso de tradução, então você vai precisar limpar seu cache
7 | antes de rodar os testes. Este cookbook aborda como fazer isso.
8 |
9 | Primeiramente, adicione o seguinte arquivo::
10 |
11 | // app/tests.bootstrap.php
12 | if (isset($_ENV['BOOTSTRAP_CLEAR_CACHE_ENV'])) {
13 | passthru(sprintf(
14 | 'php "%s/console" cache:clear --env=%s --no-warmup',
15 | __DIR__,
16 | $_ENV['BOOTSTRAP_CLEAR_CACHE_ENV']
17 | ));
18 | }
19 |
20 | require __DIR__.'/bootstrap.php.cache';
21 |
22 | Substitua o arquivo boostrap de teste ``bootstrap.php.cache`` em ``app/phpunit.xml.dist``
23 | com ``tests.bootstrap.php``:
24 |
25 | .. code-block:: xml
26 |
27 |
28 |
29 |
30 |
34 |
35 | Agora, você pode definir em seu arquivo ``phpunit.xml.dist`` de qual ambiente você quer
36 | que seja limpado o cache:
37 |
38 | .. code-block:: xml
39 |
40 |
41 |
42 |
43 |
44 |
45 | Isto torna-se agora uma variável de ambiente (i.e. ``$_ENV``) que está disponpivel
46 | no arquivo bootstrap personalizado (``tests.bootstrap.php``).
47 |
--------------------------------------------------------------------------------