├── _images
├── form
│ ├── simple-form.png
│ ├── simple-form-2.png
│ └── data-transformer-types.png
├── http
│ ├── xkcd-full.png
│ ├── request-flow.png
│ └── xkcd-request.png
├── release-process.jpg
├── quick_tour
│ ├── welcome.png
│ ├── profiler.png
│ └── web_debug_toolbar.png
├── translation
│ ├── debug_1.png
│ ├── debug_2.png
│ ├── debug_3.png
│ └── debug_4.png
├── security
│ ├── anonymous_wdt.png
│ ├── http_basic_popup.png
│ └── symfony_loggedin_wdt.png
├── components
│ ├── console
│ │ ├── table.png
│ │ ├── progress.png
│ │ ├── progressbar.gif
│ │ ├── debug_formatter.png
│ │ ├── process-helper-debug.png
│ │ ├── process-helper-verbose.png
│ │ └── process-helper-error-debug.png
│ ├── form
│ │ ├── general_flow.png
│ │ ├── set_data_flow.png
│ │ └── submission_flow.png
│ ├── var_dumper
│ │ ├── 09-cut.png
│ │ ├── 01-simple.png
│ │ ├── 03-object.png
│ │ ├── 05-soft-ref.png
│ │ ├── 07-hard-ref.png
│ │ ├── 06-constants.png
│ │ ├── 02-multi-line-str.png
│ │ ├── 04-dynamic-property.png
│ │ └── 08-virtual-property.png
│ ├── phpunit_bridge
│ │ └── report.png
│ ├── http_kernel
│ │ ├── 01-workflow.png
│ │ ├── sub-request.png
│ │ ├── 10-kernel-view.png
│ │ ├── 02-kernel-request.png
│ │ ├── 08-call-controller.png
│ │ ├── 06-kernel-controller.png
│ │ ├── 11-kernel-exception.png
│ │ ├── 04-resolve-controller.png
│ │ ├── 07-controller-arguments.png
│ │ ├── request-response-flow.png
│ │ ├── 03-kernel-request-response.png
│ │ └── 09-controller-returns-response.png
│ └── serializer
│ │ └── serializer_workflow.png
├── doctrine
│ ├── mapping_relations.png
│ ├── web_debug_toolbar.png
│ ├── mapping_single_entity.png
│ └── mapping_relations_proxy.png
├── contributing
│ ├── release-process.jpg
│ ├── docs-github-create-pr.png
│ ├── docs-github-edit-page.png
│ ├── docs-pull-request-platformsh.png
│ └── docs-pull-request-change-base.png
├── docs-pull-request-change-base.png
├── reference
│ └── form
│ │ ├── choice-example1.png
│ │ ├── choice-example2.png
│ │ ├── choice-example3.png
│ │ ├── choice-example4.png
│ │ └── choice-example5.png
├── deployment
│ └── azure-website
│ │ ├── step-01.png
│ │ ├── step-02.png
│ │ ├── step-03.png
│ │ ├── step-04.png
│ │ ├── step-05.png
│ │ ├── step-06.png
│ │ ├── step-07.png
│ │ ├── step-08.png
│ │ ├── step-09.png
│ │ ├── step-10.png
│ │ ├── step-11.png
│ │ ├── step-12.png
│ │ ├── step-13.png
│ │ ├── step-14.png
│ │ ├── step-15.png
│ │ ├── step-16.png
│ │ ├── step-17.png
│ │ └── step-18.png
├── install
│ └── deprecations-in-profiler.png
└── controller
│ └── error_pages
│ ├── errors-in-prod-environment.png
│ └── exceptions-in-dev-environment.png
├── debug.rst
├── session.rst
├── components
├── console
│ └── index.rst
├── config
│ ├── index.rst
│ ├── introduction.rst
│ ├── caching.rst
│ └── resources.rst
└── dependency_injection
│ └── _imports-parameters-note.rst.inc
├── profiler.rst
├── request.rst
├── contributing
├── documentation
│ └── index.rst
├── community
│ ├── index.rst
│ └── other.rst
├── code
│ ├── index.rst
│ ├── bugs.rst
│ └── standards.rst
├── index.rst
└── map.rst.inc
├── assetic.rst
├── assetic
├── index.rst
└── _standard_edition_warning.inc
├── quick_tour
└── index.rst
├── getting_started
└── index.rst
├── bundles
├── index.rst
├── installation.rst
└── remove.rst
├── _includes
├── _rewrite_rule_tip.rst.inc
└── service_container
│ └── _my_mailer.rst.inc
├── reference
├── index.rst
├── map.rst.inc
├── forms
│ └── types.rst
├── constraints.rst
├── requirements.rst
└── configuration
│ ├── assetic.rst
│ └── monolog.rst
├── security
├── host_restriction.rst
├── _ircmaxwell_password-compat.rst.inc
├── _supportsToken.rst.inc
├── voter_interface.rst.inc
├── force_https.rst
├── target_path.rst
├── pre_authenticated.rst
└── named_encoders.rst
├── best_practices
├── index.rst
├── map.rst.inc
├── i18n.rst
├── web-assets.rst
└── tests.rst
├── create_framework
├── index.rst
└── map.rst.inc
├── setup
├── _update_all_packages.rst.inc
├── _update_dep_errors.rst.inc
├── upgrade_patch.rst
├── composer.rst
├── upgrade_minor.rst
└── _vendor_deps.rst.inc
├── session
├── avoid_session_start.rst
├── limit_metadata_writes.rst
├── proxy_examples.rst
└── php_bridge.rst
├── testing
└── bootstrap.rst
├── doctrine
├── console.rst
├── common_extensions.rst
├── custom_dql_functions.rst
└── multiple_entity_managers.rst
├── templating
├── global_variables.rst
└── twig_extension.rst
├── routing
├── redirect_in_config.rst
├── extra_information.rst
├── scheme.rst
├── slash_in_parameter.rst
└── redirect_trailing_slash.rst
├── service_container
└── shared.rst
├── email
├── gmail.rst
├── testing.rst
└── spool.rst
├── event_dispatcher
├── method_behavior.rst
└── class_extension.rst
├── http_cache
├── form_csrf_caching.rst
└── varnish.rst
├── index.rst
├── console
├── usage.rst
├── generating_urls.rst
└── command_in_controller.rst
├── profiler
└── storage.rst
├── debug
└── debugging.rst
├── controller
└── service.rst
├── form
├── use_empty_data.rst
└── direct_submit.rst
├── logging
└── channels_handlers.rst
├── request
└── mime_type.rst
└── configuration
└── override_dir_structure.rst
/_images/form/simple-form.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/form/simple-form.png
--------------------------------------------------------------------------------
/_images/http/xkcd-full.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/http/xkcd-full.png
--------------------------------------------------------------------------------
/_images/release-process.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/release-process.jpg
--------------------------------------------------------------------------------
/debug.rst:
--------------------------------------------------------------------------------
1 | Depuração
2 | =========
3 |
4 | .. toctree::
5 | :maxdepth: 1
6 | :glob:
7 |
8 | debug/*
9 |
--------------------------------------------------------------------------------
/session.rst:
--------------------------------------------------------------------------------
1 | Sessões
2 | =======
3 |
4 | .. toctree::
5 | :maxdepth: 1
6 | :glob:
7 |
8 | session/*
9 |
--------------------------------------------------------------------------------
/_images/form/simple-form-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/form/simple-form-2.png
--------------------------------------------------------------------------------
/_images/http/request-flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/http/request-flow.png
--------------------------------------------------------------------------------
/_images/http/xkcd-request.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/http/xkcd-request.png
--------------------------------------------------------------------------------
/_images/quick_tour/welcome.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/quick_tour/welcome.png
--------------------------------------------------------------------------------
/components/console/index.rst:
--------------------------------------------------------------------------------
1 | Console
2 | =======
3 |
4 | .. toctree::
5 | :maxdepth: 2
6 |
7 | introduction
8 |
--------------------------------------------------------------------------------
/profiler.rst:
--------------------------------------------------------------------------------
1 | Profiler
2 | ========
3 |
4 | .. toctree::
5 | :maxdepth: 1
6 | :glob:
7 |
8 | profiler/*
9 |
--------------------------------------------------------------------------------
/request.rst:
--------------------------------------------------------------------------------
1 | Requisição
2 | ==========
3 |
4 | .. toctree::
5 | :maxdepth: 1
6 | :glob:
7 |
8 | request/*
9 |
--------------------------------------------------------------------------------
/_images/quick_tour/profiler.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/quick_tour/profiler.png
--------------------------------------------------------------------------------
/_images/translation/debug_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/translation/debug_1.png
--------------------------------------------------------------------------------
/_images/translation/debug_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/translation/debug_2.png
--------------------------------------------------------------------------------
/_images/translation/debug_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/translation/debug_3.png
--------------------------------------------------------------------------------
/_images/translation/debug_4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/translation/debug_4.png
--------------------------------------------------------------------------------
/_images/security/anonymous_wdt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/security/anonymous_wdt.png
--------------------------------------------------------------------------------
/_images/components/console/table.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/console/table.png
--------------------------------------------------------------------------------
/_images/doctrine/mapping_relations.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/doctrine/mapping_relations.png
--------------------------------------------------------------------------------
/_images/doctrine/web_debug_toolbar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/doctrine/web_debug_toolbar.png
--------------------------------------------------------------------------------
/_images/security/http_basic_popup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/security/http_basic_popup.png
--------------------------------------------------------------------------------
/contributing/documentation/index.rst:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/contributing/documentation/index.rst
--------------------------------------------------------------------------------
/_images/components/console/progress.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/console/progress.png
--------------------------------------------------------------------------------
/_images/components/form/general_flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/form/general_flow.png
--------------------------------------------------------------------------------
/_images/components/var_dumper/09-cut.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/var_dumper/09-cut.png
--------------------------------------------------------------------------------
/_images/contributing/release-process.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/contributing/release-process.jpg
--------------------------------------------------------------------------------
/_images/form/data-transformer-types.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/form/data-transformer-types.png
--------------------------------------------------------------------------------
/_images/quick_tour/web_debug_toolbar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/quick_tour/web_debug_toolbar.png
--------------------------------------------------------------------------------
/_images/components/console/progressbar.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/console/progressbar.gif
--------------------------------------------------------------------------------
/_images/components/form/set_data_flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/form/set_data_flow.png
--------------------------------------------------------------------------------
/_images/components/form/submission_flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/form/submission_flow.png
--------------------------------------------------------------------------------
/_images/components/var_dumper/01-simple.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/var_dumper/01-simple.png
--------------------------------------------------------------------------------
/_images/components/var_dumper/03-object.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/var_dumper/03-object.png
--------------------------------------------------------------------------------
/_images/docs-pull-request-change-base.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/docs-pull-request-change-base.png
--------------------------------------------------------------------------------
/_images/doctrine/mapping_single_entity.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/doctrine/mapping_single_entity.png
--------------------------------------------------------------------------------
/_images/reference/form/choice-example1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/reference/form/choice-example1.png
--------------------------------------------------------------------------------
/_images/reference/form/choice-example2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/reference/form/choice-example2.png
--------------------------------------------------------------------------------
/_images/reference/form/choice-example3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/reference/form/choice-example3.png
--------------------------------------------------------------------------------
/_images/reference/form/choice-example4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/reference/form/choice-example4.png
--------------------------------------------------------------------------------
/_images/reference/form/choice-example5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/reference/form/choice-example5.png
--------------------------------------------------------------------------------
/_images/security/symfony_loggedin_wdt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/security/symfony_loggedin_wdt.png
--------------------------------------------------------------------------------
/_images/components/phpunit_bridge/report.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/phpunit_bridge/report.png
--------------------------------------------------------------------------------
/_images/components/var_dumper/05-soft-ref.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/var_dumper/05-soft-ref.png
--------------------------------------------------------------------------------
/_images/components/var_dumper/07-hard-ref.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/var_dumper/07-hard-ref.png
--------------------------------------------------------------------------------
/_images/deployment/azure-website/step-01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/deployment/azure-website/step-01.png
--------------------------------------------------------------------------------
/_images/deployment/azure-website/step-02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/deployment/azure-website/step-02.png
--------------------------------------------------------------------------------
/_images/deployment/azure-website/step-03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/deployment/azure-website/step-03.png
--------------------------------------------------------------------------------
/_images/deployment/azure-website/step-04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/deployment/azure-website/step-04.png
--------------------------------------------------------------------------------
/_images/deployment/azure-website/step-05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/deployment/azure-website/step-05.png
--------------------------------------------------------------------------------
/_images/deployment/azure-website/step-06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/deployment/azure-website/step-06.png
--------------------------------------------------------------------------------
/_images/deployment/azure-website/step-07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/deployment/azure-website/step-07.png
--------------------------------------------------------------------------------
/_images/deployment/azure-website/step-08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/deployment/azure-website/step-08.png
--------------------------------------------------------------------------------
/_images/deployment/azure-website/step-09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/deployment/azure-website/step-09.png
--------------------------------------------------------------------------------
/_images/deployment/azure-website/step-10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/deployment/azure-website/step-10.png
--------------------------------------------------------------------------------
/_images/deployment/azure-website/step-11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/deployment/azure-website/step-11.png
--------------------------------------------------------------------------------
/_images/deployment/azure-website/step-12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/deployment/azure-website/step-12.png
--------------------------------------------------------------------------------
/_images/deployment/azure-website/step-13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/deployment/azure-website/step-13.png
--------------------------------------------------------------------------------
/_images/deployment/azure-website/step-14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/deployment/azure-website/step-14.png
--------------------------------------------------------------------------------
/_images/deployment/azure-website/step-15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/deployment/azure-website/step-15.png
--------------------------------------------------------------------------------
/_images/deployment/azure-website/step-16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/deployment/azure-website/step-16.png
--------------------------------------------------------------------------------
/_images/deployment/azure-website/step-17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/deployment/azure-website/step-17.png
--------------------------------------------------------------------------------
/_images/deployment/azure-website/step-18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/deployment/azure-website/step-18.png
--------------------------------------------------------------------------------
/_images/doctrine/mapping_relations_proxy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/doctrine/mapping_relations_proxy.png
--------------------------------------------------------------------------------
/_images/install/deprecations-in-profiler.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/install/deprecations-in-profiler.png
--------------------------------------------------------------------------------
/_images/components/console/debug_formatter.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/console/debug_formatter.png
--------------------------------------------------------------------------------
/_images/components/http_kernel/01-workflow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/http_kernel/01-workflow.png
--------------------------------------------------------------------------------
/_images/components/http_kernel/sub-request.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/http_kernel/sub-request.png
--------------------------------------------------------------------------------
/_images/components/var_dumper/06-constants.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/var_dumper/06-constants.png
--------------------------------------------------------------------------------
/_images/contributing/docs-github-create-pr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/contributing/docs-github-create-pr.png
--------------------------------------------------------------------------------
/_images/contributing/docs-github-edit-page.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/contributing/docs-github-edit-page.png
--------------------------------------------------------------------------------
/_images/components/http_kernel/10-kernel-view.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/http_kernel/10-kernel-view.png
--------------------------------------------------------------------------------
/contributing/community/index.rst:
--------------------------------------------------------------------------------
1 | Contribuindo com a Comunidade
2 | =============================
3 |
4 | .. toctree::
5 | :maxdepth: 2
6 |
7 | other
8 |
--------------------------------------------------------------------------------
/_images/components/console/process-helper-debug.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/console/process-helper-debug.png
--------------------------------------------------------------------------------
/_images/components/console/process-helper-verbose.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/console/process-helper-verbose.png
--------------------------------------------------------------------------------
/_images/components/http_kernel/02-kernel-request.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/http_kernel/02-kernel-request.png
--------------------------------------------------------------------------------
/_images/components/http_kernel/08-call-controller.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/http_kernel/08-call-controller.png
--------------------------------------------------------------------------------
/_images/components/serializer/serializer_workflow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/serializer/serializer_workflow.png
--------------------------------------------------------------------------------
/_images/components/var_dumper/02-multi-line-str.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/var_dumper/02-multi-line-str.png
--------------------------------------------------------------------------------
/_images/components/var_dumper/04-dynamic-property.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/var_dumper/04-dynamic-property.png
--------------------------------------------------------------------------------
/_images/components/var_dumper/08-virtual-property.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/var_dumper/08-virtual-property.png
--------------------------------------------------------------------------------
/_images/contributing/docs-pull-request-platformsh.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/contributing/docs-pull-request-platformsh.png
--------------------------------------------------------------------------------
/contributing/code/index.rst:
--------------------------------------------------------------------------------
1 | Contribuindo com o Código
2 | =========================
3 |
4 | .. toctree::
5 | :maxdepth: 2
6 |
7 | bugs
8 | standards
9 |
--------------------------------------------------------------------------------
/_images/components/http_kernel/06-kernel-controller.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/http_kernel/06-kernel-controller.png
--------------------------------------------------------------------------------
/_images/components/http_kernel/11-kernel-exception.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/http_kernel/11-kernel-exception.png
--------------------------------------------------------------------------------
/_images/contributing/docs-pull-request-change-base.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/contributing/docs-pull-request-change-base.png
--------------------------------------------------------------------------------
/_images/components/console/process-helper-error-debug.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/console/process-helper-error-debug.png
--------------------------------------------------------------------------------
/_images/components/http_kernel/04-resolve-controller.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/http_kernel/04-resolve-controller.png
--------------------------------------------------------------------------------
/_images/components/http_kernel/07-controller-arguments.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/http_kernel/07-controller-arguments.png
--------------------------------------------------------------------------------
/_images/components/http_kernel/request-response-flow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/http_kernel/request-response-flow.png
--------------------------------------------------------------------------------
/_images/components/http_kernel/03-kernel-request-response.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/http_kernel/03-kernel-request-response.png
--------------------------------------------------------------------------------
/_images/controller/error_pages/errors-in-prod-environment.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/controller/error_pages/errors-in-prod-environment.png
--------------------------------------------------------------------------------
/components/config/index.rst:
--------------------------------------------------------------------------------
1 | Configuração
2 | ======
3 |
4 | .. toctree::
5 | :maxdepth: 2
6 |
7 | introduction
8 | resources
9 | caching
10 | definition
11 |
--------------------------------------------------------------------------------
/_images/components/http_kernel/09-controller-returns-response.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/components/http_kernel/09-controller-returns-response.png
--------------------------------------------------------------------------------
/_images/controller/error_pages/exceptions-in-dev-environment.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/andreia/symfony-docs-pt-BR/HEAD/_images/controller/error_pages/exceptions-in-dev-environment.png
--------------------------------------------------------------------------------
/assetic.rst:
--------------------------------------------------------------------------------
1 | Assetic
2 | =======
3 |
4 | .. include:: /assetic/_standard_edition_warning.rst.inc
5 |
6 | .. toctree::
7 | :maxdepth: 1
8 | :glob:
9 |
10 | assetic/*
11 |
--------------------------------------------------------------------------------
/assetic/index.rst:
--------------------------------------------------------------------------------
1 | Assetic
2 | =======
3 |
4 | .. toctree::
5 | :maxdepth: 2
6 |
7 | asset_management
8 | yuicompressor
9 | jpeg_optimize
10 | apply_to_option
11 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/contributing/index.rst:
--------------------------------------------------------------------------------
1 | Contributing
2 | ============
3 |
4 | .. toctree::
5 | :hidden:
6 |
7 | code/index
8 | documentation/index
9 | community/index
10 |
11 | .. include:: /contributing/map.rst.inc
12 |
--------------------------------------------------------------------------------
/getting_started/index.rst:
--------------------------------------------------------------------------------
1 | Primeiros Passos
2 | ----------------
3 |
4 | .. toctree::
5 | :maxdepth: 1
6 |
7 | ../setup
8 | ../page_creation
9 | ../routing
10 | ../controller
11 | ../templating
12 | ../configuration
13 |
--------------------------------------------------------------------------------
/bundles/index.rst:
--------------------------------------------------------------------------------
1 | Bundles
2 | =======
3 |
4 | .. toctree::
5 | :maxdepth: 2
6 |
7 | installation
8 | best_practices
9 | inheritance
10 | override
11 | remove
12 | extension
13 | configuration
14 | prepend_extension
15 |
--------------------------------------------------------------------------------
/_includes/_rewrite_rule_tip.rst.inc:
--------------------------------------------------------------------------------
1 | .. tip::
2 |
3 | Ao usar rewrite rules em sua
4 | :doc:`configuração do servidor web `,
5 | o ``index.php`` não será necessário e você terá URLs belas e limpas
6 | (ex. ``/show``).
7 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/assetic/_standard_edition_warning.inc:
--------------------------------------------------------------------------------
1 | .. caution::
2 |
3 | A partir do Symfony 2.8, o Assetic já não está mais incluído por padrão na
4 | Edição Standard do Symfony. Consulte :doc:`este artigo `
5 | para aprender a instalar e ativar o Assetic em sua aplicação Symfony.
6 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/best_practices/index.rst:
--------------------------------------------------------------------------------
1 | Melhores Práticas Oficiais do Symfony
2 | =====================================
3 |
4 | .. toctree::
5 | :hidden:
6 |
7 | introduction
8 | creating-the-project
9 | configuration
10 | business-logic
11 | controllers
12 | templates
13 | forms
14 | i18n
15 | security
16 | web-assets
17 | tests
18 |
19 | .. include:: /best_practices/map.rst.inc
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/best_practices/map.rst.inc:
--------------------------------------------------------------------------------
1 | * :doc:`/best_practices/introduction`
2 | * :doc:`/best_practices/creating-the-project`
3 | * :doc:`/best_practices/configuration`
4 | * :doc:`/best_practices/business-logic`
5 | * :doc:`/best_practices/controllers`
6 | * :doc:`/best_practices/templates`
7 | * :doc:`/best_practices/forms`
8 | * :doc:`/best_practices/i18n`
9 | * :doc:`/best_practices/security`
10 | * :doc:`/best_practices/web-assets`
11 | * :doc:`/best_practices/tests`
12 |
--------------------------------------------------------------------------------
/create_framework/index.rst:
--------------------------------------------------------------------------------
1 | Crie o seu próprio Framework PHP
2 | ================================
3 |
4 |
5 | .. toctree::
6 |
7 | introduction
8 | http_foundation
9 | front_controller
10 | routing
11 | templating
12 | http_kernel_controller_resolver
13 | separation_of_concerns
14 | unit_testing
15 | event_dispatcher
16 | http_kernel_httpkernelinterface
17 | http_kernel_httpkernel_class
18 | dependency_injection
19 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/contributing/community/other.rst:
--------------------------------------------------------------------------------
1 | Outros Recursos
2 | ===============
3 |
4 | Para acompanhar o que está acontecendo na comunidade você pode achar úteis
5 | estes recursos adicionais:
6 |
7 | * Lista dos `pull requests`_ abertos
8 | * Lista dos `commits`_ recentes
9 | * Lista das `melhorias e bugs`_ abertos
10 | * Lista dos `bundles`_ open source
11 |
12 | .. _pull requests: https://github.com/symfony/symfony/pulls
13 | .. _commits: https://github.com/symfony/symfony/commits/master
14 | .. _melhorias e bugs: https://github.com/symfony/symfony/issues
15 | .. _bundles: http://knpbundles.com/
16 |
--------------------------------------------------------------------------------
/create_framework/map.rst.inc:
--------------------------------------------------------------------------------
1 | * :doc:`/create_framework/introduction`
2 | * :doc:`/create_framework/http_foundation`
3 | * :doc:`/create_framework/front_controller`
4 | * :doc:`/create_framework/routing`
5 | * :doc:`/create_framework/templating`
6 | * :doc:`/create_framework/http_kernel_controller_resolver`
7 | * :doc:`/create_framework/separation_of_concerns`
8 | * :doc:`/create_framework/unit_testing`
9 | * :doc:`/create_framework/event_dispatcher`
10 | * :doc:`/create_framework/http_kernel_httpkernelinterface`
11 | * :doc:`/create_framework/http_kernel_httpkernel_class`
12 | * :doc:`/create_framework/dependency_injection`
13 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/components/config/introduction.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Config
3 | single: Components; Config
4 |
5 | O Componente Config
6 | ====================
7 |
8 | Introdução
9 | ------------
10 |
11 | O Componente Config fornece diversas classes para lhe ajudar a buscar, carregar,
12 | combinar, autopreencher e validar valores de configuração de qualquer tipo, não
13 | importando qual o tipo de fonte (arquivos Yaml, XML, INI, ou por exemplo, um banco de dados).
14 |
15 | Instalação
16 | ------------
17 |
18 | Você pode instalar o componente de 2 formas diferentes:
19 |
20 | * Utilizando o repositório Git oficial (https://github.com/symfony/Config);
21 | * :doc:`Instale via Composer ` (``symfony/config`` on `Packagist`_).
22 |
23 | Seções
24 | --------
25 |
26 | * :doc:`/components/config/resources`
27 | * :doc:`/components/config/caching`
28 | * :doc:`/components/config/definition`
29 |
30 | .. _Packagist: https://packagist.org/packages/symfony/config
31 |
--------------------------------------------------------------------------------
/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/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 |
--------------------------------------------------------------------------------
/contributing/map.rst.inc:
--------------------------------------------------------------------------------
1 | * **Code**
2 |
3 | * :doc:`Bugs `
4 | * :doc:`Patches `
5 | * :doc:`Reviewing Issues and Patches `
6 | * :doc:`Maintenance `
7 | * :doc:`The Core Team `
8 | * :doc:`Security `
9 | * :doc:`Tests `
10 | * :doc:`Backwards Compatibility `
11 | * :doc:`Coding Standards`
12 | * :doc:`Code Conventions`
13 | * :doc:`Git`
14 | * :doc:`License `
15 |
16 | * **Documentation**
17 |
18 | * :doc:`Overview `
19 | * :doc:`Format `
20 | * :doc:`Documentation Standards `
21 | * :doc:`License `
22 |
23 | * **Community**
24 |
25 | * :doc:`Release Process `
26 | * :doc:`Community Reviews `
27 | * :doc:`Other Resources `
28 |
--------------------------------------------------------------------------------
/_includes/service_container/_my_mailer.rst.inc:
--------------------------------------------------------------------------------
1 | .. configuration-block::
2 |
3 | .. code-block:: yaml
4 |
5 | # app/config/services.yml
6 | services:
7 | app.mailer:
8 | class: AppBundle\Mailer
9 | arguments: [sendmail]
10 |
11 | .. code-block:: xml
12 |
13 |
14 |
15 |
19 |
20 |
21 |
22 | sendmail
23 |
24 |
25 |
26 |
27 | .. code-block:: php
28 |
29 | // app/config/services.php
30 | use Symfony\Component\DependencyInjection\Definition;
31 |
32 | $container->setDefinition('app.mailer', new Definition(
33 | 'AppBundle\Mailer',
34 | array('sendmail')
35 | ));
36 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/components/dependency_injection/_imports-parameters-note.rst.inc:
--------------------------------------------------------------------------------
1 | .. note::
2 |
3 | Devido à maneira na qual os parâmetros são resolvidos, você não pode usá-los
4 | para construir caminhos em importações dinamicamente. Isso significa que
5 | algo como o seguinte não funciona:
6 |
7 | .. configuration-block::
8 |
9 | .. code-block:: yaml
10 |
11 | # app/config/config.yml
12 | imports:
13 | - { resource: '%kernel.root_dir%/parameters.yml' }
14 |
15 | .. code-block:: xml
16 |
17 |
18 |
19 |
23 |
24 |
25 |
26 |
27 |
28 |
29 | .. code-block:: php
30 |
31 | // app/config/config.php
32 | $loader->import('%kernel.root_dir%/parameters.yml');
33 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/contributing/code/bugs.rst:
--------------------------------------------------------------------------------
1 | Reportando um Bug
2 | =================
3 |
4 | Sempre que você encontrar um bug no Symfony2, pedimos gentilmente para reportá-lo.
5 | Isso ajuda-nos a tornar o Symfony2 melhor.
6 |
7 | .. caution::
8 |
9 | Se você acredita ter encontrado um problema de segurança, por favor, use o
10 | :doc:`procedimento ` especial em seu lugar.
11 |
12 | Antes de submeter um bug:
13 |
14 | * Verifique a `documentação`_ oficial para certificar-se de que não está
15 | fazendo mau uso do framework;
16 |
17 | * Peça ajuda na `lista de discussão dos usuários`_, no `fórum`_, ou no `canal IRC`_
18 | do #symfony se você não tiver certeza se o problema é realmente um bug.
19 |
20 | Se o seu problema definitivamente parece um bug, relate-o usando o `tracker`_ oficial
21 | de bug e siga algumas regras básicas:
22 |
23 | * Use o campo de título para descrever claramente o problema;
24 |
25 | * Descreva os passos necessários para reproduzir o bug com exemplos curtos de código
26 | (fornecer um teste unitário que ilustra o bug é melhor);
27 |
28 | * Forneça o máximo de detalhes possível sobre o seu ambiente (SO, versão do PHP, versão do
29 | Symfony, extensões habilitadas, ...);
30 |
31 | * *(opcional)* Anexe um :doc:`patch `.
32 |
33 | .. _documentação: http://symfony.com/doc/2.0/
34 | .. _lista de discussão de usuários: http://groups.google.com/group/symfony-users
35 | .. _forum: http://forum.symfony-project.org/
36 | .. _canal IRC: irc://irc.freenode.net/symfony
37 | .. _tracker: https://github.com/symfony/symfony/issues
38 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/doctrine/console.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Doctrine; Comandos de console ORM
3 | single: CLI; ORM Doctrine
4 |
5 | Comandos de Console
6 | -------------------
7 |
8 | A integração com o ORM Doctrine2 oferece vários comandos do console sob o
9 | namespace ``doctrine``. Para ver a lista de comandos você pode usar o comando
10 | ``list``:
11 |
12 | .. code-block:: bash
13 |
14 | $ php app/console list doctrine
15 |
16 | Uma lista dos comandos disponíveis será impressa. Você pode descobrir mais informações
17 | sobre qualquer um desses comandos (ou qualquer comando Symfony), executando o comando
18 | ``help``. Por exemplo, para obter detalhes sobre a tarefa ``doctrine:database:create``
19 | , execute:
20 |
21 | .. code-block:: bash
22 |
23 | $ php app/console help doctrine:database:create
24 |
25 | Algumas tarefas notáveis ou interessantes incluem:
26 |
27 | * ``doctrine:ensure-production-settings`` - verifica se o ambiente
28 | atual está configurado de forma eficiente para produção. Deve sempre
29 | ser executado no ambiente ``prod``:
30 |
31 | .. code-block:: bash
32 |
33 | $ php app/console doctrine:ensure-production-settings --env=prod
34 |
35 | * ``doctrine:mapping:import`` - permite ao Doctrine a introspecção de um banco de dados
36 | existente e criar as informações de mapeamento. Para obter mais informações, consulte
37 | :doc:`/cookbook/doctrine/reverse_engineering`.
38 |
39 | * ``doctrine:mapping:info`` - exibe todas as entidades que o Doctrine
40 | está ciente e se há ou não algum erro básico com o mapeamento.
41 |
42 | * ``doctrine:query:dql`` e ``doctrine:query:sql`` - permitem executar
43 | consultas DQL ou SQL diretamente na linha de comando.
44 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/email/gmail.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: E-mails; Gmail
3 |
4 | Como usar o Gmail para enviar E-mails
5 | =====================================
6 |
7 | Durante o desenvolvimento, em vez de usar um servidor SMTP regular para enviar e-mails, você
8 | pode descobrir que usar o Gmail é mais fácil e prático. O bundle Swiftmailer torna esta tarefa
9 | realmente fácil.
10 |
11 | .. tip::
12 |
13 | Em vez de usar a sua conta do Gmail normal, é, com certeza, recomendado
14 | que você crie uma conta especial para este propósito.
15 |
16 | No arquivo de configuração de desenvolvimento, altere a definição ``transport`` para
17 | ``gmail`` e defina o ``username`` e ``password`` com as credenciais do Google:
18 |
19 | .. configuration-block::
20 |
21 | .. code-block:: yaml
22 |
23 | # app/config/config_dev.yml
24 | swiftmailer:
25 | transport: gmail
26 | username: your_gmail_username
27 | password: your_gmail_password
28 |
29 | .. code-block:: xml
30 |
31 |
32 |
33 |
37 |
38 |
42 |
43 | .. code-block:: php
44 |
45 | // app/config/config_dev.php
46 | $container->loadFromExtension('swiftmailer', array(
47 | 'transport' => "gmail",
48 | 'username' => "your_gmail_username",
49 | 'password' => "your_gmail_password",
50 | ));
51 |
52 | Está pronto!
53 |
54 | .. note::
55 |
56 | O transporte ``gmail`` é simplesmente um atalho que usa o transporte ``smtp``
57 | e seta as definições ``encryption``, ``auth_mode`` e ``host`` para funcionar com o Gmail.
58 |
--------------------------------------------------------------------------------
/doctrine/common_extensions.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Doctrine; Extensões comuns
3 |
4 | Como usar as extensões do Doctrine: Timestampable, Sluggable, Translatable, etc.
5 | ================================================================================
6 |
7 | O Doctrine2 é muito flexível e a comunidade já criou um série de extensões do
8 | Doctrine úteis para ajudar você com tarefas comuns relacionadas a entidades.
9 |
10 | Uma biblioteca em particular - a biblioteca `DoctrineExtensions`_ - fornece
11 | funcionalidade de integração para os comportamentos `Sluggable`_, `Translatable`_,
12 | `Timestampable`_, `Loggable`_, `Tree`_ e `Sortable`_.
13 |
14 | O uso de cada uma destas extensões é explicado no repositório.
15 |
16 | No entanto, para instalar/ativar cada extensão você deve se registrar e ativar um
17 | :doc:`Listener de Evento`.
18 | Para fazer isso, você tem duas opções:
19 |
20 | #. Usar o `StofDoctrineExtensionsBundle`_, que integra a biblioteca acima.
21 |
22 | #. Implementar este serviço diretamente seguindo a documentação para a integração
23 | com o Symfony2: `Instalando extensões Gedmo Doctrine2 no Symfony2`_
24 |
25 | .. _`DoctrineExtensions`: https://github.com/l3pp4rd/DoctrineExtensions
26 | .. _`StofDoctrineExtensionsBundle`: https://github.com/stof/StofDoctrineExtensionsBundle
27 | .. _`Sluggable`: https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/sluggable.md
28 | .. _`Translatable`: https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/translatable.md
29 | .. _`Timestampable`: https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/timestampable.md
30 | .. _`Loggable`: https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/loggable.md
31 | .. _`Tree`: https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/tree.md
32 | .. _`Sortable`: https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/sortable.md
33 | .. _`Instalando extensões Gedmo Doctrine2 no Symfony2`: https://github.com/l3pp4rd/DoctrineExtensions/blob/master/doc/symfony2.md
34 |
--------------------------------------------------------------------------------
/event_dispatcher/method_behavior.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Dispatcher de Evento
3 |
4 | Como personalizar o Comportamento do Método sem o uso de Herança
5 | ================================================================
6 |
7 | Realizar algo antes ou após a Chamada de um Método
8 | --------------------------------------------------
9 |
10 | Se você deseja realizar algo logo antes ou após um método ser chamado, você
11 | pode despachar um evento, respectivamente, no início ou no fim do
12 | método::
13 |
14 | class Foo
15 | {
16 | // ...
17 |
18 | public function send($foo, $bar)
19 | {
20 | // do something before the method
21 | $event = new FilterBeforeSendEvent($foo, $bar);
22 | $this->dispatcher->dispatch('foo.pre_send', $event);
23 |
24 | // get $foo and $bar from the event, they may have been modified
25 | $foo = $event->getFoo();
26 | $bar = $event->getBar();
27 |
28 | // the real method implementation is here
29 | $ret = ...;
30 |
31 | // do something after the method
32 | $event = new FilterSendReturnValue($ret);
33 | $this->dispatcher->dispatch('foo.post_send', $event);
34 |
35 | return $event->getReturnValue();
36 | }
37 | }
38 |
39 | Neste exemplo, dois eventos são lançados: ``foo.pre_send``, antes do método ser
40 | executado, e ``foo.post_send`` após o método ser executado. Cada um usa uma
41 | classe ``Event`` personalizada para comunicar informações para os ouvintes dos dois
42 | eventos. Essas classes de evento teriam que ser criadas por você e, devem permitir,
43 | neste exemplo, que as variáveis ``$foo``, ``$bar`` e ``$ret`` sejam recuperadas
44 | e definidas pelos ouvintes.
45 |
46 | Por exemplo, supondo que o ``FilterSendReturnValue`` tem um método ``setReturnValue``,
47 | um ouvinte pode ter o seguinte aspecto:
48 |
49 | .. code-block:: php
50 |
51 | public function onFooPostSend(FilterSendReturnValue $event)
52 | {
53 | $ret = $event->getReturnValue();
54 | // modify the original ``$ret`` value
55 |
56 | $event->setReturnValue($ret);
57 | }
58 |
--------------------------------------------------------------------------------
/http_cache/form_csrf_caching.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Cache; CSRF; Formulários
3 |
4 | Armazenamento em Cache de Páginas que contêm Formulários Protegidos com CSRF
5 | ============================================================================
6 |
7 | Tokens CSRF são destinados a serem diferentes para cada usuário. Esse é o motivo porque você
8 | precisa ser cauteloso ao tentar fazer cache de páginas que incluem formulários.
9 |
10 | Para obter mais informações sobre como a proteção CSRF funciona no Symfony, por favor
11 | verifique :ref:`Proteção CSRF`.
12 |
13 | Por que o Cache de Páginas com um Token CSRF é Problemático
14 | -----------------------------------------------------------
15 |
16 | Tipicamente, para cada usuário é atribuído um token CSRF único, que é armazenado em
17 | sessão para validação. Isso significa que se você *fazer* cache de uma página com
18 | um formulário contendo um token CSRF, você vai armazenar em cache o token CSRF do *primeiro*
19 | usuário somente. Quando um usuário submete o formulário, o token não corresponde ao token
20 | armazenado na sessão e, para todos os usuários (exceto o primeiro), irá falhar a validação CSRF
21 | ao enviar o formulário.
22 |
23 | De fato, muitos proxies reversos (como o Varnish) vão recusar a colocar em cache uma página
24 | com um token CSRF. Isso porque um cookie é enviado, a fim de preservar
25 | a sessão PHP aberta e o comportamento padrão do Varnish e não armazenar em cache solicitações
26 | HTTP com cookies.
27 |
28 | Como fazer Cache da Maior Parte da Página e ainda poder Usar a Proteção CSRF
29 | ----------------------------------------------------------------------------
30 |
31 | Para armazenar em cache uma página que contém um token CSRF, você pode usar técnicas de cache mais avançadas
32 | como :ref:`fragmentos ESI `, onde você armazena em cache
33 | a página inteira e incorpora o formulário dentro de uma tag ESI sem cache.
34 |
35 | Outra opção seria carregar o formulário através de uma solicitação AJAX sem cache, mas
36 | fazer o cache do resto da resposta HTML.
37 |
38 | Ou, você ainda pode carregar apenas o token CSRF com uma requisição AJAX e substituir o
39 | valor do campo do formulário com ele.
40 |
41 | .. _`Cross-site request forgery`: http://en.wikipedia.org/wiki/Cross-site_request_forgery
42 | .. _`Security CSRF Component`: https://github.com/symfony/security-csrf
43 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/index.rst:
--------------------------------------------------------------------------------
1 | .. _symfony2-documentation:
2 |
3 | Documentação do Symfony
4 | =======================
5 |
6 | .. toctree::
7 | :hidden:
8 |
9 | changelog
10 |
11 | Guia de Início Rápido
12 | ---------------------
13 |
14 | Inicie rapidamente no Symfony com o :doc:`Guia de Início Rápido `:
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 |
--------------------------------------------------------------------------------
/console/usage.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Console; Uso
3 |
4 | Como usar o Console
5 | ===================
6 |
7 | A página :doc:`/components/console/usage` da documentação dos componentes aborda
8 | sobre as opções globais do console. Quando você usar o console como parte do
9 | framework full stack, algumas opções globais adicionais também estão disponíveis.
10 |
11 | Por padrão, os comandos de console executam no ambiente ``dev`` e você pode desejar
12 | alterar isso para alguns comandos. Por exemplo, se você deseja executar alguns comandos
13 | no ambiente ``prod`` por motivos de desempenho. Além disso, o resultado de alguns comandos
14 | será diferente, dependendo do ambiente. Por exemplo, o comando ``cache:clear``
15 | irá limpar e fazer o warm do cache apenas para o ambiente especificado. Para
16 | limpar e realizar o warm do cache de ``prod`` você precisa executar:
17 |
18 | .. code-block:: bash
19 |
20 | $ php app/console cache:clear --env=prod
21 |
22 | ou o equivalente:
23 |
24 | .. code-block:: bash
25 |
26 | $ php app/console cache:clear -e=prod
27 |
28 | Além de alterar o ambiente, você pode optar também por desativar o modo de depuração.
29 | Isto pode ser útil quando deseja-se executar comandos no ambiente ``dev``
30 | mas evitar o impacto no desempenho devido a coleta de dados de depuração:
31 |
32 | .. code-block:: bash
33 |
34 | $ php app/console list --no-debug
35 |
36 | Há um shell interativo que permite à você digitar os comandos sem ter que
37 | especificar ``php app/console`` toda vez, o que é útil se você precisa executar
38 | vários comandos. Para entrar no shell execute:
39 |
40 | .. code-block:: bash
41 |
42 | $ php app/console --shell
43 | $ php app/console -s
44 |
45 | Agora você pode simplesmente executar comandos com o nome do comando:
46 |
47 | .. code-block:: bash
48 |
49 | Symfony > list
50 |
51 | Ao usar o shell você pode escolher em executar cada comando em um processo separado:
52 |
53 | .. code-block:: bash
54 |
55 | $ php app/console --shell --process-isolation
56 | $ php app/console -s --process-isolation
57 |
58 | Quando fizer isso, a saída não será colorida e a interatividade não é suportada,
59 | então, você vai precisar passar todos os parâmetros de comando explicitamente.
60 |
61 | .. note::
62 |
63 | A menos que você estiver usando processos isolados, limpar o cache no shell
64 | não terá efeito sobre os comandos subsequentes que você executar. Isto é porque
65 | os arquivos originais em cache ainda estão sendo usados.
66 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/debug/debugging.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Depuração
3 |
4 | Como otimizar seu ambiente de desenvolvimento para a depuraração
5 | ================================================================
6 |
7 | Ao trabalhar em um projeto Symfony na sua máquina local, você deve usar o
8 | ambiente ``dev`` (front controller ``app_dev.php``). Esta configuração de
9 | ambiente é otimizada para dois principais propósitos:
10 |
11 | * Fornecer ao desenvolvedor um feedback preciso sempre que algo der errado (barra
12 | de ferramentas de depuração web, páginas de exceção agradáveis, profiler, ...);
13 |
14 | * Ser o mais semelhante possível do ambiente de produção para evitar problemas
15 | ao implantar o projeto.
16 |
17 | .. _cookbook-debugging-disable-bootstrap:
18 |
19 | Desabilitando o Arquivo de Bootstrap e o Cache de Classe
20 | --------------------------------------------------------
21 |
22 | E para tornar o ambiente de produção o mais rápido possível, o Symfony cria
23 | grandes arquivos PHP em seu cache que contém a agregação das classes PHP que o
24 | projeto precisa para cada solicitação. No entanto, este comportamento pode confundir a sua IDE
25 | ou seu depurador. Esta receita mostra como você pode ajustar este mecanismo de
26 | cache para torná-lo mais amigável quando você precisar depurar código que envolve
27 | classes do Symfony.
28 |
29 | O front controller ``app_dev.php``, por padrão, é o seguinte::
30 |
31 | // ...
32 |
33 | require_once __DIR__.'/../app/bootstrap.php.cache';
34 | require_once __DIR__.'/../app/AppKernel.php';
35 |
36 | use Symfony\Component\HttpFoundation\Request;
37 |
38 | $kernel = new AppKernel('dev', true);
39 | $kernel->loadClassCache();
40 | $kernel->handle(Request::createFromGlobals())->send();
41 |
42 | Para deixar o seu depurador ainda mais feliz, desabilite todos os caches de classe PHP,
43 | removendo a chamada para ``loadClassCache()`` e substituindo as declarações require como
44 | abaixo::
45 |
46 | // ...
47 |
48 | // require_once __DIR__.'/../app/bootstrap.php.cache';
49 | require_once __DIR__.'/../app/autoload.php';
50 | require_once __DIR__.'/../app/AppKernel.php';
51 |
52 | use Symfony\Component\HttpFoundation\Request;
53 |
54 | $kernel = new AppKernel('dev', true);
55 | // $kernel->loadClassCache();
56 | $kernel->handle(Request::createFromGlobals())->send();
57 |
58 | .. tip::
59 |
60 | Se você desativar os caches PHP, não se esqueça de voltar depois da sua sessão de
61 | depuração.
62 |
63 | Algumas IDEs não gostam do fato de que algumas classes são armazenadas em locais diferentes.
64 | Para evitar problemas, você pode dizer a sua IDE para ignorar os arquivos de cache PHP
65 | , ou você pode mudar a extensão usada pelo Symfony para esses arquivos::
66 |
67 | $kernel->loadClassCache('classes', '.php.cache');
68 |
--------------------------------------------------------------------------------
/email/testing.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: E-mails; Testando
3 |
4 | Como testar se um email foi enviado em um teste funcional
5 | =========================================================
6 |
7 | O envio de e-mails com Symfony é bastante simples graças ao
8 | SwiftmailerBundle, que aproveita o poder da `biblioteca `Swift Mailer`_.
9 |
10 | Para testar funcionalmente se um e-mail foi enviado, e até mesmo o assert do assunto do email,
11 | conteúdo ou quaisquer outros cabeçalhos, você pode usar o :ref:`o Profiler do Symfony `.
12 |
13 | Comece com uma ação do controlador fácil que envia um e-mail::
14 |
15 | public function sendEmailAction($name)
16 | {
17 | $message = \Swift_Message::newInstance()
18 | ->setSubject('Hello Email')
19 | ->setFrom('send@example.com')
20 | ->setTo('recipient@example.com')
21 | ->setBody('You should see me from the profiler!')
22 | ;
23 |
24 | $this->get('mailer')->send($message);
25 |
26 | return $this->render(...);
27 | }
28 |
29 | .. note::
30 |
31 | Não se esqueça de habilitar o profiler como explicado em :doc:`/cookbook/testing/profiling`.
32 |
33 | Em seu teste funcional, utilize o collector do ``swiftmailer`` no profiler
34 | para obter informações sobre as mensagens enviadas no pedido anterior::
35 |
36 | // src/AppBundle/Tests/Controller/MailControllerTest.php
37 | use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
38 |
39 | class MailControllerTest extends WebTestCase
40 | {
41 | public function testMailIsSentAndContentIsOk()
42 | {
43 | $client = static::createClient();
44 |
45 | // Enable the profiler for the next request (it does nothing if the profiler is not available)
46 | $client->enableProfiler();
47 |
48 | $crawler = $client->request('POST', '/path/to/above/action');
49 |
50 | $mailCollector = $client->getProfile()->getCollector('swiftmailer');
51 |
52 | // Check that an e-mail was sent
53 | $this->assertEquals(1, $mailCollector->getMessageCount());
54 |
55 | $collectedMessages = $mailCollector->getMessages();
56 | $message = $collectedMessages[0];
57 |
58 | // Asserting e-mail data
59 | $this->assertInstanceOf('Swift_Message', $message);
60 | $this->assertEquals('Hello Email', $message->getSubject());
61 | $this->assertEquals('send@example.com', key($message->getFrom()));
62 | $this->assertEquals('recipient@example.com', key($message->getTo()));
63 | $this->assertEquals(
64 | 'You should see me from the profiler!',
65 | $message->getBody()
66 | );
67 | }
68 | }
69 |
70 | .. _`Swift Mailer`: http://swiftmailer.org/
71 |
--------------------------------------------------------------------------------
/components/config/caching.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Config; Caching baseado em recursos
3 |
4 | Caching baseado em recursos
5 | ==========================
6 |
7 | Quando todos os recursos de configuração são carregados, você poderá processar a configuração de valores e combiná-los em um único arquivo. Esse arquivo funciona
8 | como um cache. Seu conteúdo não precisa ser recriados cada vez que o aplicativo é
9 | executado – apenas quando os meios de configuração são modificadas.
10 |
11 | Por exemplo, o componente de roteamento de Symfony permite que você carregue todas as
12 | rotas, e, em seguida, despeje um combinador de URL ou um gerador de URL com base nessas
13 | rotas. Neste caso, quando um dos recursos é modificado (e você estiver trabalhando em um
14 | ambiente de desenvolvimento), o arquivo gerado deve ser invalidado e recuperado.
15 | This can be accomplished by making use of the :class:`Symfony\\Component\\Config\\ConfigCache`
16 | class.
17 |
18 | O exemplo abaixo mostra como coletar recursos, em seguida, gerar um código com base nos
19 | recursos que foram carregados, e escrever este código para o cache. O cache também
20 | recebe o conjunto de recursos que foram utilizados para gerar o código. Olhando para a
21 | data e hora da "última modificação" desses recursos, o cache pode informar se o conteúdo
22 | ainda está válido ou se deve ser atualizado::
23 |
24 | use Symfony\Component\Config\ConfigCache;
25 | use Symfony\Component\Config\Resource\FileResource;
26 |
27 | $cachePath = __DIR__.'/cache/appUserMatcher.php';
28 |
29 | // o segundo argumento indica se você deseja ou não usar o modo de depuração
30 | $userMatcherCache = new ConfigCache($cachePath, true);
31 |
32 | if (!$userMatcherCache->isFresh()) {
33 | // preencha essa variável com um array de path de arquivos 'users.yml'
34 | $yamlUserFiles = ...;
35 |
36 | $resources = array();
37 |
38 | foreach ($yamlUserFiles as $yamlUserFile) {
39 | // Veja o artigo anterior "Loading resources" para
40 | // ver de onde $delegatingLoader vem
41 | $delegatingLoader->load($yamlUserFile);
42 | $resources[] = new FileResource($yamlUserFile);
43 | }
44 |
45 | // o código para o UserMatcher é gerado em outro em outro lugar
46 | $code = ...;
47 |
48 | $userMatcherCache->write($code, $resources);
49 | }
50 |
51 | // Você pode incluir o código de cache:
52 | require $cachePath;
53 |
54 | No modo de depuração, um ``.meta`` arquivo será criado no mesmo diretório que o arquivo
55 | de cache. Esse ``.meta`` arquivo contém recursos serializado,
56 | que são utilizados para determinar se o cache ainda está recente. Quando não estiver em
57 | modo de depuração, o cache é considerado como "recente" conforme exista,
58 | e portanto, não será gerado o ``.meta`` arquivo.
59 |
--------------------------------------------------------------------------------
/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.
--------------------------------------------------------------------------------
/controller/service.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Controlador; Como Serviços
3 |
4 | Como definir Controladores como Serviços
5 | ========================================
6 |
7 | No livro, você aprendeu como um controlador pode ser facilmente usado quando ele
8 | estende a classe base
9 | :class:`Symfony\\Bundle\\FrameworkBundle\\Controller\\Controller`. Mesmo
10 | isso funcionando bem, os controladores também podem ser especificados como serviços.
11 |
12 | Para referir-se a um controlador que é definido como um serviço, utilize a notação de um único dois pontos (:)
13 | . Por exemplo, supondo que você definiu um serviço chamado
14 | ``my_controller`` e que deseja encaminhar para um método chamado ``indexAction()``
15 | dentro do serviço::
16 |
17 | $this->forward('my_controller:indexAction', array('foo' => $bar));
18 |
19 | Você precisa usar a mesma notação ao definir o valor da rota
20 | ``_controller``:
21 |
22 | .. code-block:: yaml
23 |
24 | my_controller:
25 | pattern: /
26 | defaults: { _controller: my_controller:indexAction }
27 |
28 | Para utilizar um controlador desta forma, ele deve estar definido na configuração do
29 | container de serviço. Para mais informações, consulte o capítulo :doc:`Service Container
30 | `
31 |
32 | Ao usar um controlador definido como um serviço, ele provavelmente não estenderá
33 | a classe base ``Controller``. Em vez de contar com seus métodos de atalho,
34 | você vai interagir diretamente com os serviços que você precisa. Felizmente, isto é
35 | normalmente muito fácil e a classe base ``Controller`` em si é uma grande fonte
36 | sobre a forma de realizar muitas das tarefas comuns.
37 |
38 | .. note::
39 |
40 | Especificar um controlador como um serviço leva um pouco mais de trabalho. A
41 | principal vantagem é que todo o controlador ou quaisquer serviços passados para
42 | o controlador podem ser modificados através da configuração do container de serviço.
43 | Isto é especialmente útil no desenvolvimento de um bundle open-source ou qualquer
44 | bundle que será utilizado em vários projetos diferentes. Assim, mesmo se você não
45 | especificar os seus controladores como serviços, provavelmente verá isto feito em alguns
46 | bundles open-source do Symfony2.
47 |
48 | Usando Anotação no Roteamento
49 | -----------------------------
50 |
51 | Ao usar anotações para configurar as rotas em um controlador definido como um
52 | serviço, é necessário especificar o serviço da seguinte forma::
53 |
54 | /**
55 | * @Route("/blog", service="my_bundle.annot_controller")
56 | * @Cache(expires="tomorrow")
57 | */
58 | class AnnotController extends Controller
59 | {
60 | }
61 |
62 | Neste exemplo, ``my_bundle.annot_controller`` deve ser o id da
63 | instância ``AnnotController`` definida no container de serviço. Isto está
64 | documentado no capítulo :doc:`/bundles/SensioFrameworkExtraBundle/annotations/routing`
65 | .
66 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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/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 |
--------------------------------------------------------------------------------
/console/generating_urls.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Console; Geração de URLs
3 |
4 | Como gerar URLs com um Host personalizado em Comandos de Console
5 | ================================================================
6 |
7 | Infelizmente, o contexto de linha de comando não sabe sobre o seu VirtualHost
8 | ou nome de domínio. Isto significa que se você gerar URLs absolutas em um
9 | comando de Console, você provavelmente vai acabar com algo como ``http://localhost/foo/bar``
10 | o que não é muito útil.
11 |
12 | Para corrigir isso, você precisa configurar o "contexto do pedido", que é uma
13 | maneira elegante de dizer que você precisa configurar o seu ambiente para que ele saiba
14 | qual URL ele deve usar ao gerar as URLs.
15 |
16 | Há duas maneiras de configurar o contexto do pedido: a nível da aplicação
17 | e por Comando.
18 |
19 | Configurando o Contexto do Pedido globalmente
20 | ---------------------------------------------
21 |
22 | Para configurar o Contexto do Pedido - que é usado pelo Gerador de URL - você pode
23 | redefinir os parâmetros que ele usa como valores padrão para alterar o host padrão
24 | (localhost) e o esquema (http). Note que isso não impacta nas URLs geradas
25 | através de solicitações normais da web, uma vez que substituirá os padrões.
26 |
27 | .. configuration-block::
28 |
29 | .. code-block:: yaml
30 |
31 | # app/config/parameters.yml
32 | parameters:
33 | router.request_context.host: example.org
34 | router.request_context.scheme: https
35 |
36 | .. code-block:: xml
37 |
38 |
39 |
40 |
41 |
43 |
44 |
45 | example.org
46 | https
47 |
48 |
49 |
50 | .. code-block:: php
51 |
52 | // app/config/config_test.php
53 | $container->setParameter('router.request_context.host', 'example.org');
54 | $container->setParameter('router.request_context.scheme', 'https');
55 |
56 | Configurando o Contexto do Pedido por Comando
57 | ---------------------------------------------
58 |
59 | Para alterá-lo em apenas um comando, você pode simplesmente chamar o serviço do Contexto de Pedido
60 | e sobrescrever as suas configurações::
61 |
62 | // src/Acme/DemoBundle/Command/DemoCommand.php
63 |
64 | // ...
65 | class DemoCommand extends ContainerAwareCommand
66 | {
67 | protected function execute(InputInterface $input, OutputInterface $output)
68 | {
69 | $context = $this->getContainer()->get('router')->getContext();
70 | $context->setHost('example.com');
71 | $context->setScheme('https');
72 |
73 | // ... your code here
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/form/use_empty_data.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Formulário; Dados Vazios
3 |
4 | Como configurar Dados Vazios para uma Classe de Formulário
5 | ==========================================================
6 |
7 | A opção ``empty_data`` permite que você especifique um conjunto de dados vazios para a sua
8 | classe de formulário. Este conjunto de dados vazios será usado se você fez o bind do seu
9 | formulário, mas não chamou o ``setData()`` nele ou não passou dados quando criou
10 | ele. Por exemplo::
11 |
12 | public function indexAction()
13 | {
14 | $blog = // ...
15 |
16 | // $blog is passed in as the data, so the empty_data option is not needed
17 | $form = $this->createForm(new BlogType(), $blog);
18 |
19 | // no data is passed in, so empty_data is used to get the "starting data"
20 | $form = $this->createForm(new BlogType());
21 | }
22 |
23 | Por padrão, o ``empty_data`` é setado como ``null``. Ou, se você especificou
24 | a opção ``data_class`` para a sua classe de formulário, ele será, por padrão, uma nova instância
25 | dessa classe. Essa instância será criada chamando o construtor
26 | sem argumentos.
27 |
28 | Se você quiser sobrescrever esse comportamento padrão, existem duas formas de fazer isso.
29 |
30 | Opção 1: Instanciar uma nova Classe
31 | -----------------------------------
32 |
33 | Uma razão para usar esta opção é se você quer usar um construtor
34 | que possui argumentos. Lembre-se, a opção ``data_class`` padrão chama
35 | o construtor sem argumentos::
36 |
37 | // src/Acme/DemoBundle/Form/Type/BlogType.php
38 | // ...
39 |
40 | use Symfony\Component\Form\AbstractType;
41 | use Acme\DemoBundle\Entity\Blog;
42 | use Symfony\Component\OptionsResolver\OptionsResolverInterface;
43 |
44 | class BlogType extends AbstractType
45 | {
46 | private $someDependency;
47 |
48 | public function __construct($someDependency)
49 | {
50 | $this->someDependency = $someDependency;
51 | }
52 | // ...
53 |
54 | public function setDefaultOptions(OptionsResolverInterface $resolver)
55 | {
56 | $resolver->setDefaults(array(
57 | 'empty_data' => new Blog($this->someDependency),
58 | ));
59 | }
60 | }
61 |
62 | Você pode instanciar sua classe como desejar. Neste exemplo, nós passamos
63 | algumas dependências para o ``BlogType`` ao instanciá-lo, então, use isso
64 | para instanciar o objeto ``Blog``. O ponto é, você pode setar o ``empty_data``
65 | para o objeto "novo" que você deseja usar.
66 |
67 | Opção 2: Fornecer uma Closure
68 | -----------------------------
69 |
70 | Usar uma closure é o método preferido, uma vez que irá criar o objeto
71 | apenas se for necessário.
72 |
73 | A closure deve aceitar uma instância ``FormInterface`` como seu primeiro argumento::
74 |
75 | use Symfony\Component\OptionsResolver\OptionsResolverInterface;
76 | use Symfony\Component\Form\FormInterface;
77 | // ...
78 |
79 | public function setDefaultOptions(OptionsResolverInterface $resolver)
80 | {
81 | $resolver->setDefaults(array(
82 | 'empty_data' => function (FormInterface $form) {
83 | return new Blog($form->get('title')->getData());
84 | },
85 | ));
86 | }
87 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/components/config/resources.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Config; Carregando recursos
3 |
4 | Carregando recursos
5 | =================
6 |
7 | Localizando recursos
8 | ------------------
9 |
10 | O carregamento da configuração normalmente se inicia com a busca por recursos -
11 | na maioria dos casos: arquivos. Isso pode ser feito com o :class:`Symfony\\Component\\Config\\FileLocator`::
12 |
13 | use Symfony\Component\Config\FileLocator;
14 |
15 | $configDirectories = array(__DIR__.'/app/config');
16 |
17 | $locator = new FileLocator($configDirectories);
18 | $yamlUserFiles = $locator->locate('users.yml', null, false);
19 |
20 | O locator recebe uma coleção de locais onde ele deve buscar por arquivos.
21 | O primeiro argumento do ``locate()`` é o nome do arquivo para se buscar. O segundo
22 | argumento pode ser o caminho atual, e quando fornecido, o locator buscará nesse
23 | diretório primeiro. O terceiro argumento indica quando ou não o locator deverá
24 | retornar o primeiro arquivo encontrado, ou um array contendo todas as correspondências.
25 |
26 |
27 | Loaders de recursos
28 | ----------------
29 |
30 | Para cada tipo de recurso (Yaml, XML, annotation, etc.) um loader deve ser definido.
31 | Cada loader deve implementar :class:`Symfony\\Component\\Config\\Loader\\LoaderInterface`
32 | ou extender a classe abstrata :class:`Symfony\\Component\\Config\\Loader\\FileLoader`
33 | que permite a importação recursiva de outros recursos::
34 |
35 | use Symfony\Component\Config\Loader\FileLoader;
36 | use Symfony\Component\Yaml\Yaml;
37 |
38 | class YamlUserLoader extends FileLoader
39 | {
40 | public function load($resource, $type = null)
41 | {
42 | $configValues = Yaml::parse($resource);
43 |
44 | // ... handle the config values
45 |
46 | // maybe import some other resource:
47 |
48 | // $this->import('extra_users.yml');
49 | }
50 |
51 | public function supports($resource, $type = null)
52 | {
53 | return is_string($resource) && 'yml' === pathinfo(
54 | $resource,
55 | PATHINFO_EXTENSION
56 | );
57 | }
58 | }
59 |
60 | Encontrando o loader correto
61 | ------------------------
62 |
63 | O :class:`Symfony\\Component\\Config\\Loader\\LoaderResolver` recebe como
64 | seu primeiro argumento construtor uma coleção de loaders. Quando um
65 | recurso (por exemplo, um arquivo XML) deve ser carregado, ele faz um loop
66 | nessa coleção de loaders e retorna o loader que suporta este tipo
67 | particular de recurso.
68 |
69 | O :class:`Symfony\\Component\\Config\\Loader\\DelegatingLoader` faz o uso
70 | do :class:`Symfony\\Component\\Config\\Loader\\LoaderResolver`. Quando ele
71 | ele é solicitado a carregar um recurso, ele delega esta questão ao
72 | :class:`Symfony\\Component\\Config\\Loader\\LoaderResolver`. No caso do
73 | resolver ter encontrado um loader adequado, este loader será questionado
74 | a carregar o recurso::
75 |
76 | use Symfony\Component\Config\Loader\LoaderResolver;
77 | use Symfony\Component\Config\Loader\DelegatingLoader;
78 |
79 | $loaderResolver = new LoaderResolver(array(new YamlUserLoader($locator)));
80 | $delegatingLoader = new DelegatingLoader($loaderResolver);
81 |
82 | $delegatingLoader->load(__DIR__.'/users.yml');
83 | /*
84 | O YamlUserLoader será utilizado para carregar este recurso,
85 | já que ele suporta arquivos com a extensão "yml"
86 | */
87 |
--------------------------------------------------------------------------------
/http_cache/varnish.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Cache; Varnish
3 |
4 | Como usar Varnish para aumentar a velocidade do meu Website
5 | ===========================================================
6 |
7 | Pelo cache do Symfony2 usar os cache headers padrões do HTTP, o
8 | :ref:`symfony-gateway-cache` pode facilmente se substituido por qualquer por qualquer outro
9 | proxy reverso. Varnish é um poderoso, open-source, HTTP accelerator capaz de servir
10 | conteúdo em cache de forma rápida em incluindo suporte à :ref:`Edge Side
11 | Includes` (ESI).
12 |
13 | .. index::
14 | single: Varnish; configuration
15 |
16 | Configuração
17 | ------------
18 |
19 | Como visto anteriormente, Symfony2 é esperto o bastente para detectar se fala com um
20 | proxy reverso que compreende ESI ou não. Ele trabalha fora da caixa quando você
21 | usa o proxy reverso do Symfony2, mas você precisa de um configuração especial para poder
22 | trabalhar com Varnish. Felizmente, Symfony2 depende ainda de outro padrão
23 | escrito por Akamaï (`Edge Architecture`_), então as dicas de configuração desde
24 | capítulo podem ser úteis mesmo se você não usar Symfony2.
25 |
26 | .. note::
27 |
28 | Varnish suporta apenas o atributo ``src`` para tags ESI (atributos ``onerror`` e
29 | ``alt`` são ignorados).
30 |
31 | Primeiro, configure o Varnish para que ele informe o suporte à ESI adicionando um
32 | ``Surrogate-Capability`` ao cabeçalho nas requisições enviadas ao servidor de
33 | aplicação:
34 |
35 | .. code-block:: text
36 |
37 | sub vcl_recv {
38 | set req.http.Surrogate-Capability = "abc=ESI/1.0";
39 | }
40 |
41 | Após isso, otimize o Varnish para que ele apenas analise o conteúdo da resposta quando
42 | existir ao menos uma tag ESI, verificando o cabeçalho ``Surrogate-Control`` que
43 | é adicionado automaticamente pelo Symfony2.
44 |
45 | .. code-block:: text
46 |
47 | sub vcl_fetch {
48 | if (beresp.http.Surrogate-Control ~ "ESI/1.0") {
49 | unset beresp.http.Surrogate-Control;
50 |
51 | // para Varnish >= 3.0
52 | set beresp.do_esi = true;
53 | // para Varnish < 3.0
54 | // esi;
55 | }
56 | }
57 |
58 | .. caution::
59 |
60 | Compressão com ESI não é suportada pelo Varnish até a versão 3.0
61 | (leia `GZIP and Varnish`_). Se você não está utilizando Varnish 3.0,
62 | coloque um servidor web a frente do Varnish para executar a compressão.
63 |
64 | .. index::
65 | single: Varnish; Invalidation
66 |
67 | Invalidação do Cache
68 | --------------------
69 |
70 | Você nunca deverá precisar invalidar os dados em cache porque a invalidação é colocada
71 | nativamente nos modelos de cache HTTP (veja :ref:`http-cache-invalidation`).
72 |
73 | Ainda assim, o Varnish pode ser configurado para aceitar um método HTTP ``PURGE`` especial
74 | que invalidará o cache para derterminado recurso:
75 |
76 | .. code-block:: text
77 |
78 | sub vcl_hit {
79 | if (req.request == "PURGE") {
80 | set obj.ttl = 0s;
81 | error 200 "Purgado";
82 | }
83 | }
84 |
85 | sub vcl_miss {
86 | if (req.request == "PURGE") {
87 | error 404 "Não Purgado";
88 | }
89 | }
90 |
91 | .. caution::
92 |
93 | Você deve proteger o método HTTP``PURGE`` para evitar que qualquer pessoa possa
94 | purgar os dados em cache.
95 |
96 | .. _`Edge Architecture`: http://www.w3.org/TR/edge-arch
97 | .. _`GZIP and Varnish`: https://www.varnish-cache.org/docs/3.0/phk/gzip.html
98 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/best_practices/i18n.rst:
--------------------------------------------------------------------------------
1 | Internacionalização
2 | ===================
3 |
4 | Internacionalização e localização adaptam as aplicações e seus conteúdos
5 | para a região ou idioma específico dos usuários. No Symfony, esse é um recurso opt-in
6 | que precisa ser ativado antes de utilizar. Para fazer isso, remova o comentário da
7 | da configuração ``translator`` seguinte e defina a localidade da sua aplicação:
8 |
9 | .. code-block:: yaml
10 |
11 | # app/config/config.yml
12 | framework:
13 | # ...
14 | translator: { fallback: "%locale%" }
15 |
16 | # app/config/parameters.yml
17 | parameters:
18 | # ...
19 | locale: en
20 |
21 | Formato do Arquivo Origem de Tradução
22 | -------------------------------------
23 |
24 | O componente Translation do Symfony suporta vários formatos diferentes
25 | de tradução: PHP, Qt, ``.po``, ``.mo``, JSON, CSV, INI, etc.
26 |
27 | .. best-practice::
28 |
29 | Use o formato XLIFF para os seus arquivos de tradução.
30 |
31 | De todos os formatos de tradução disponíveis, apenas o XLIFF e o gettext possuem amplo
32 | suporte nas ferramentas usadas por tradutores profissionais. E, uma vez que ele possui base
33 | no XML, você pode validar o conteúdo do arquivo XLIFF enquanto você o escreve.
34 |
35 | O Symfony 2.6 adicionou suporte para notas dentro dos arquivos XLIFF, tornando-os mais
36 | user-friendly para os tradutores. No final, boas traduções tratam de
37 | contexto, e essas notas XLIFF permitem definir esse contexto.
38 |
39 | .. tip::
40 |
41 | O `JMSTranslationBundle`_, com licença Apache, oferece uma interface web para
42 | visualizar e editar esses arquivos de tradução. Ele também tem extratores avançados
43 | que podem ler o seu projeto e atualizar automaticamente os arquivos XLIFF.
44 |
45 | Localização do Arquivo Origem de Tradução
46 | -----------------------------------------
47 |
48 | .. best-practice::
49 |
50 | Armazene os arquivos de tradução no diretório ``app/Resources/translations/``.
51 |
52 | Tradicionalmente, os desenvolvedores Symfony criavam esses arquivos no
53 | diretório ``Resources/translations/`` de cada bundle.
54 |
55 | Mas, uma vez que o diretório ``app/Resources/`` é considerado a localização global
56 | para os recursos da aplicação, armazenar as traduções no ``app/Resources/translations/``
57 | centraliza elas *e* lhes fornece prioridade sobre qualquer outro arquivo de tradução.
58 | Isso permite que você sobrescreva traduções definidas em bundles de terceiros.
59 |
60 | Chaves de Tradução
61 | ------------------
62 |
63 | .. best-practice::
64 |
65 | Sempre use chaves para traduções em vez de strings de conteúdo.
66 |
67 | Usar chaves simplifica o gerenciamento dos arquivos de tradução, porque você
68 | pode alterar o conteúdo original sem ter que atualizar todos os arquivo de
69 | tradução.
70 |
71 | As chaves devem sempre descrever seu *propósito* e *não* sua localização. Por
72 | exemplo, se um formulário tem um campo com a label "Username", então uma boa chave
73 | seria ``label.username`` e *não* ``edit_form.label.username``.
74 |
75 | Exemplo de Arquivo de Tradução
76 | ------------------------------
77 |
78 | Aplicando todas as melhores práticas anteriores, o arquivo de tradução exemplo para
79 | Inglês na aplicação seria:
80 |
81 | .. code-block:: xml
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 | title.post_list
90 | Post List
91 |
92 |
93 |
94 |
95 |
96 | .. _`JMSTranslationBundle`: https://github.com/schmittjoh/JMSTranslationBundle
97 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/configuration/override_dir_structure.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Sobrescrever Symfony
3 |
4 | Como Substituir a Estrutura de Diretório Padrão do Symfony
5 | ===========================================================
6 |
7 | O Symfony vem automaticamente com uma estrutura de diretórios padrão. Você pode
8 | facilmente substituir essa estrutura de diretório criando a seu própria. A estrutura
9 | de diretório padrão é:
10 |
11 | .. code-block:: text
12 |
13 | app/
14 | cache/
15 | config/
16 | logs/
17 | ...
18 | src/
19 | ...
20 | vendor/
21 | ...
22 | web/
23 | app.php
24 | ...
25 |
26 | Substituir o diretório ``cache``
27 | --------------------------------
28 |
29 | Você pode substituir o diretório cache, sobrescrevendo o método ``getCacheDir``
30 | na classe ``AppKernel`` de sua aplicação::
31 |
32 | // app/AppKernel.php
33 |
34 | // ...
35 | class AppKernel extends Kernel
36 | {
37 | // ...
38 |
39 | public function getCacheDir()
40 | {
41 | return $this->rootDir.'/'.$this->environment.'/cache/';
42 | }
43 | }
44 |
45 | ``$this->rootDir`` é o caminho absoluto para o diretório ``app`` e ``$this->environment``
46 | é o ambiente atual (ou seja, ``dev``). Neste caso você alterou
47 | a localização do diretório cache para ``app/{environment}/cache``.
48 |
49 | .. caution::
50 |
51 | Você deve manter o diretório ``cache`` diferente para cada ambiente, caso contrário,
52 | algum comportamento inesperado pode acontecer. Cada ambiente gera seus próprios arquivos
53 | de configuração em cache, e assim, cada um precisa de seu próprio diretório para armazenar
54 | os arquivos de cache.
55 |
56 | Substituir o diretório ``logs``
57 | -------------------------------
58 |
59 | O processo para substituir o diretório ``logs`` é o mesmo do diretório ``cache``,
60 | a única diferença é que você precisa sobrescrever o método
61 | ``getLogDir``::
62 |
63 | // app/AppKernel.php
64 |
65 | // ...
66 | class AppKernel extends Kernel
67 | {
68 | // ...
69 |
70 | public function getLogDir()
71 | {
72 | return $this->rootDir.'/'.$this->environment.'/logs/';
73 | }
74 | }
75 |
76 | Aqui você alterou o local do diretório para ``app/{environment}/logs``.
77 |
78 | Substituir o diretório ``web``
79 | ------------------------------
80 |
81 | Se você precisa renomear ou mover o seu diretório ``web``, a única coisa que você
82 | precisa garantir é que o caminho para o diretório ``app`` ainda está correto
83 | em seus front controllers ``app.php`` e ``app_dev.php``. Se você simplesmente
84 | renomear o diretório, então está tudo ok. Mas se você moveu de alguma forma,
85 | pode precisar modificar os caminhos dentro desses arquivos::
86 |
87 | require_once __DIR__.'/../Symfony/app/bootstrap.php.cache';
88 | require_once __DIR__.'/../Symfony/app/AppKernel.php';
89 |
90 | .. tip::
91 |
92 | Alguns hosts compartilhados tem um diretório raiz web ``public_html``. Renomeando
93 | seu diretório web de ``web`` para ``public_html`` é uma maneira de fazer
94 | funcionar o seu projeto Symfony em seu servidor compartilhado. Outra forma é implantar
95 | sua aplicação em um diretório fora do raiz web, excluir seu
96 | diretório ``public_html`` e, então, substituí-lo por um link simbólico para
97 | o ``web`` em seu projeto.
98 |
99 | .. note::
100 |
101 | Se você utiliza o AsseticBundle precisará configurar o seguinte, para que ele possa usar
102 | o diretório ``web`` correto:
103 |
104 | .. code-block:: yaml
105 |
106 | # app/config/config.yml
107 |
108 | # ...
109 | assetic:
110 | # ...
111 | read_from: "%kernel.root_dir%/../../public_html"
112 |
113 | Agora você só precisa realizar o dump dos assets novamente e sua aplicação deve
114 | funcionar:
115 |
116 | .. code-block:: bash
117 |
118 | $ php app/console assetic:dump --env=prod --no-debug
119 |
--------------------------------------------------------------------------------
/doctrine/custom_dql_functions.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Doctrine; Funções DQL Personalizadas
3 |
4 | Como Registrar Funções DQL Personalizadas
5 | =========================================
6 |
7 | O Doctrine permite especificar funções DQL personalizadas. Para mais informações
8 | sobre este assunto, leia o artigo "`Funções DQL Definidas pelo Usuário`_" no cookbook do Doctrine.
9 |
10 | No Symfony, você pode registrar suas funções DQL personalizadas da seguinte forma:
11 |
12 | .. configuration-block::
13 |
14 | .. code-block:: yaml
15 |
16 | # app/config/config.yml
17 | doctrine:
18 | orm:
19 | # ...
20 | entity_managers:
21 | default:
22 | # ...
23 | dql:
24 | string_functions:
25 | test_string: Acme\HelloBundle\DQL\StringFunction
26 | second_string: Acme\HelloBundle\DQL\SecondStringFunction
27 | numeric_functions:
28 | test_numeric: Acme\HelloBundle\DQL\NumericFunction
29 | datetime_functions:
30 | test_datetime: Acme\HelloBundle\DQL\DatetimeFunction
31 |
32 | .. code-block:: xml
33 |
34 |
35 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 | Acme\HelloBundle\DQL\SecondStringFunction
49 | Acme\HelloBundle\DQL\DatetimeFunction
51 |
52 |
53 |
54 |
55 |
56 |
57 | .. code-block:: php
58 |
59 | // app/config/config.php
60 | $container->loadFromExtension('doctrine', array(
61 | 'orm' => array(
62 | ...,
63 | 'entity_managers' => array(
64 | 'default' => array(
65 | ...,
66 | 'dql' => array(
67 | 'string_functions' => array(
68 | 'test_string' => 'Acme\HelloBundle\DQL\StringFunction',
69 | 'second_string' => 'Acme\HelloBundle\DQL\SecondStringFunction',
70 | ),
71 | 'numeric_functions' => array(
72 | 'test_numeric' => 'Acme\HelloBundle\DQL\NumericFunction',
73 | ),
74 | 'datetime_functions' => array(
75 | 'test_datetime' => 'Acme\HelloBundle\DQL\DatetimeFunction',
76 | ),
77 | ),
78 | ),
79 | ),
80 | ),
81 | ));
82 |
83 | .. _`Funções DQL Definidas pelo Usuário`: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/dql-user-defined-functions.html
84 |
--------------------------------------------------------------------------------
/best_practices/web-assets.rst:
--------------------------------------------------------------------------------
1 | Recursos da Web
2 | ===============
3 |
4 | Recursos da web são coisas como arquivos CSS, JavaScript e imagens que fazem o frontend
5 | do seu site parecer e funcionar ótimo. Os desenvolvedores Symfony têm, tradicionalmente,
6 | esses recursos armazenados no diretório ``Resources/public/`` de cada bundle.
7 |
8 | .. best-practice::
9 |
10 | Armazene seus recursos no diretório ``web/``.
11 |
12 | Espalhar seus recursos da web através de dezenas de bundles diferentes torna mais
13 | difícil gerenciá-los. A vida dos seus designers será muito mais fácil se todos
14 | os recursos da aplicação estiverem em um único local.
15 |
16 | Os templates também se beneficiam da centralização dos recursos, porque os links são
17 | muito mais concisos:
18 |
19 | .. code-block:: html+jinja
20 |
21 |
22 |
23 |
24 | {# ... #}
25 |
26 |
27 |
28 |
29 | .. note::
30 |
31 | Tenha em mente que ``web/`` é um diretório público e que qualquer coisa armazenada
32 | nele será acessível publicamente. Por essa razão, você deve colocar ali seus recursos
33 | da web compilados, mas não seus arquivos de origem (por exemplo, arquivos SASS).
34 |
35 | Usando o Assetic
36 | ----------------
37 |
38 | Atualmente, você provavelmente não pode simplesmente criar arquivos CSS e JavaScript estáticos
39 | e incluí-los no seu template. Em vez disso, provavelmente vai querer combinar
40 | e minificar eles para melhorar o desempenho ao lado do cliente. Você também pode querer
41 | usar LESS ou Sass (por exemplo), o que significa que vai precisar, de alguma forma, processar
42 | estes em arquivos CSS.
43 |
44 | Existem muitas ferramentas para resolver esses problemas, incluindo ferramentas puras para frontend (não-PHP)
45 | como GruntJS.
46 |
47 | .. best-practice::
48 |
49 | Use o Assetic para compilar, combinar e minimizar os recursos da web, a menos que você esteja
50 | confortável com ferramentas frontend como o GruntJS.
51 |
52 | :doc:`Assetic ` é um gestor de recursos capaz
53 | de compilar recursos desenvolvidos com várias tecnologias diferentes de frontend
54 | como LESS, Sass e CoffeeScript.
55 | Combinar todos os seus recursos com o Assetic é uma questão de envolver eles
56 | com uma única tag Twig:
57 |
58 | .. code-block:: html+jinja
59 |
60 | {% stylesheets
61 | 'css/bootstrap.min.css'
62 | 'css/main.css'
63 | filter='cssrewrite' output='css/compiled/all.css' %}
64 |
65 | {% endstylesheets %}
66 |
67 | {# ... #}
68 |
69 | {% javascripts
70 | 'js/jquery.min.js'
71 | 'js/bootstrap.min.js'
72 | output='js/compiled/all.js' %}
73 |
74 | {% endjavascripts %}
75 |
76 | Aplicações Fundamentadas no Frontend
77 | ------------------------------------
78 |
79 | Recentemente, tecnologias frontend como AngularJS tornaram-se bastante populares
80 | para o desenvolvimento de aplicações web frontend que conversam com uma API.
81 |
82 | Se você estiver desenvolvendo uma aplicação como essa, deve usar as ferramentas
83 | que são recomendadas pela tecnologia, como Bower e GruntJS. Você deve
84 | desenvolver sua aplicação frontend separadamente do seu backend Symfony (mesmo
85 | separando os repositórios se você quiser).
86 |
87 | Saiba mais sobre o Assetic
88 | --------------------------
89 |
90 | O Assetic também pode minimizar recursos CSS e JavaScript
91 | :doc:`using UglifyCSS/UglifyJS ` para acelerar os seus
92 | websites. Você pode até mesmo :doc:`compactar imagens `
93 | com o Assetic para reduzir seu tamanho antes de servi-las para o usuário. Verifique
94 | a `documentação oficial do Assetic`_ para saber mais sobre todas as características
95 | disponíveis.
96 |
97 | .. _`documentação oficial do Assetic`: https://github.com/kriswallsmith/assetic
98 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/bundles/installation.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Bundle; Instalação
3 |
4 | Como Instalar Bundles de Terceiros
5 | ==================================
6 |
7 | A maioria dos bundles fornecem suas próprias instruções de instalação. No entanto, os
8 | passos básicos para a instalação de um bundle são os mesmos:
9 |
10 | * `A) Adicionar Dependências com o Composer`_
11 | * `B) Habilitar o Bundle`_
12 | * `C) Configurar o Bundle`_
13 |
14 | A) Adicionar Dependências com o Composer
15 | ----------------------------------------
16 |
17 | As dependências são gerenciadas com o Composer, por isso, se o Composer é novo para você, aprenda
18 | algumas noções básicas em `sua documentação`_. Isso tem dois passos:
19 |
20 | 1) Descobrir o Nome do Bundle no Packagist
21 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
22 |
23 | O arquivo README de um bundle (por exemplo, `FOSUserBundle`_) geralmente vai lhe dizer seu nome
24 | (ex., ``friendsofsymfony/user-bundle``). Caso não informar, você pode procurar
25 | pela biblioteca no site `Packagist.org`_.
26 |
27 | .. note::
28 |
29 | Procurando por bundles? Tente pesquisar em `KnpBundles.com`_: o arquivo não-oficial
30 | de Bundles do Symfony.
31 |
32 | 2) Instalar o bundle via Composer
33 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
34 |
35 | Agora que você sabe o nome do bundle, pode instalá-lo via Composer:
36 |
37 | .. code-block:: bash
38 |
39 | $ composer require friendsofsymfony/user-bundle
40 |
41 | Isso irá escolher a melhor versão para o seu projeto, adicionando-a ao ``composer.json``
42 | e fazendo o download da biblioteca no diretório ``vendor/``. Se você precisa de uma versão específica
43 | , adicione um ``:`` e a versão logo após o nome da biblioteca (ver
44 | `composer require`_).
45 |
46 | B) Habilitar o Bundle
47 | ---------------------
48 |
49 | Neste ponto, o bundle está instalado no seu projeto (em
50 | ``vendor/friendsofsymfony/``) e o autoloader reconhece as classes dele.
51 | A única coisa que você precisa fazer agora é registrar o bundle em ``AppKernel``::
52 |
53 | // app/AppKernel.php
54 |
55 | // ...
56 | class AppKernel extends Kernel
57 | {
58 | // ...
59 |
60 | public function registerBundles()
61 | {
62 | $bundles = array(
63 | // ...,
64 | new FOS\UserBundle\FOSUserBundle(),
65 | );
66 |
67 | // ...
68 | }
69 | }
70 |
71 | C) Configurar o Bundle
72 | ----------------------
73 |
74 | É muito comum um bundle precisar de alguma instalação ou configuração adicional
75 | em ``app/config/config.yml``. A documentação do bundle vai falar sobre
76 | a configuração, mas você também pode obter uma referência de configuração do bundle
77 | através do comando ``config:dump-reference``.
78 |
79 | Por exemplo, a fim de olhar a referência de configuração do ``assetic`` você
80 | pode usar isto:
81 |
82 | .. code-block:: bash
83 |
84 | $ app/console config:dump-reference AsseticBundle
85 |
86 | ou isto:
87 |
88 | .. code-block:: bash
89 |
90 | $ app/console config:dump-reference assetic
91 |
92 | A saída será parecida com a seguinte:
93 |
94 | .. code-block:: text
95 |
96 | assetic:
97 | debug: %kernel.debug%
98 | use_controller:
99 | enabled: %kernel.debug%
100 | profiler: false
101 | read_from: %kernel.root_dir%/../web
102 | write_to: %assetic.read_from%
103 | java: /usr/bin/java
104 | node: /usr/local/bin/node
105 | node_paths: []
106 | # ...
107 |
108 | Outra Configuração
109 | ------------------
110 |
111 | Neste ponto, verifique o arquivo ``README`` de seu novo bundle para ver
112 | o que fazer em seguida. Divirta-se!
113 |
114 | .. _sua documentação: http://getcomposer.org/doc/00-intro.md
115 | .. _Packagist.org: https://packagist.org
116 | .. _FOSUserBundle: https://github.com/FriendsOfSymfony/FOSUserBundle
117 | .. _KnpBundles.com: http://knpbundles.com/
118 | .. _`composer require`: https://getcomposer.org/doc/03-cli.md#require
119 |
--------------------------------------------------------------------------------
/event_dispatcher/class_extension.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Dispatcher de Eventos
3 |
4 | Como estender uma Classe sem usar Herança
5 | =========================================
6 |
7 | Para permitir que várias classes adicionem métodos para uma outra, você pode definir o
8 | método mágico ``__call()`` na classe que você deseja que seja estendida da seguinte forma:
9 |
10 | .. code-block:: php
11 |
12 | class Foo
13 | {
14 | // ...
15 |
16 | public function __call($method, $arguments)
17 | {
18 | // cria um evento chamado 'foo.method_is_not_found'
19 | $event = new HandleUndefinedMethodEvent($this, $method, $arguments);
20 | $this->dispatcher->dispatch($this, 'foo.method_is_not_found', $event);
21 |
22 | // nenhum listener foi capaz de processar o evento? O método não existe
23 | if (!$event->isProcessed()) {
24 | throw new \Exception(sprintf('Call to undefined method %s::%s.', get_class($this), $method));
25 | }
26 |
27 | // retorna o valor retornado pelo listener
28 | return $event->getReturnValue();
29 | }
30 | }
31 |
32 | Ela utiliza um ``HandleUndefinedMethodEvent`` especial que também deve ser
33 | criado. Esta é uma classe genérica que poderia ser reutilizada cada vez que você precisa
34 | utilizar esse padrão de extensão de classe:
35 |
36 | .. code-block:: php
37 |
38 | use Symfony\Component\EventDispatcher\Event;
39 |
40 | class HandleUndefinedMethodEvent extends Event
41 | {
42 | protected $subject;
43 | protected $method;
44 | protected $arguments;
45 | protected $returnValue;
46 | protected $isProcessed = false;
47 |
48 | public function __construct($subject, $method, $arguments)
49 | {
50 | $this->subject = $subject;
51 | $this->method = $method;
52 | $this->arguments = $arguments;
53 | }
54 |
55 | public function getSubject()
56 | {
57 | return $this->subject;
58 | }
59 |
60 | public function getMethod()
61 | {
62 | return $this->method;
63 | }
64 |
65 | public function getArguments()
66 | {
67 | return $this->arguments;
68 | }
69 |
70 | /**
71 | * Define o valor de retorno e pára a notificação para outros listeners
72 | */
73 | public function setReturnValue($val)
74 | {
75 | $this->returnValue = $val;
76 | $this->isProcessed = true;
77 | $this->stopPropagation();
78 | }
79 |
80 | public function getReturnValue($val)
81 | {
82 | return $this->returnValue;
83 | }
84 |
85 | public function isProcessed()
86 | {
87 | return $this->isProcessed;
88 | }
89 | }
90 |
91 | Em seguida, crie uma classe que vai ouvir o evento ``foo.method_is_not_found``
92 | e *adicionar* o método ``bar()``:
93 |
94 | .. code-block:: php
95 |
96 | class Bar
97 | {
98 | public function onFooMethodIsNotFound(HandleUndefinedMethodEvent $event)
99 | {
100 | // queremos somente responder as chamadas do método 'bar'
101 | if ('bar' != $event->getMethod()) {
102 | // permite que outro listener cuide deste método desconhecido
103 | return;
104 | }
105 |
106 | // o objeto (a instância foo)
107 | $foo = $event->getSubject();
108 |
109 | // os argumentos do método bar
110 | $arguments = $event->getArguments();
111 |
112 | // faz algo
113 | // ...
114 |
115 | // define o valor de retorno
116 | $event->setReturnValue($someValue);
117 | }
118 | }
119 |
120 | Por fim, adicione o novo método ``bar`` na classe ``Foo`` para registrar uma
121 | instância de ``Bar`` com o evento ``foo.method_is_not_found``:
122 |
123 | .. code-block:: php
124 |
125 | $bar = new Bar();
126 | $dispatcher->addListener('foo.method_is_not_found', $bar);
127 |
--------------------------------------------------------------------------------
/doctrine/multiple_entity_managers.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Doctrine; Múltiplos Gerenciadores de Entidade
3 |
4 | Como trabalhar com Múltiplos Gerenciadores de Entidade
5 | ======================================================
6 |
7 | Você pode usar múltiplos gerenciadores de entidades em uma aplicação Symfony2. Isto é
8 | necessário se você está usando bancos de dados diferentes ou algum vendor com conjuntos de
9 | entidades completamente diferentes. Em outras palavras, um gerenciador de entidades que
10 | conecta em um banco de dados manipulará algumas entidades enquanto um outro gerenciador de
11 | entidades que conecta a um outro banco de dados irá manupular as entidades restantes.
12 |
13 | .. note::
14 |
15 | Usar múltiplos gerenciadores de entidade é muito fácil, mas mais avançado e
16 | geralmente não necessário. Certifique se você realmente precisa de múltiplos
17 | gerenciadores de entidades antes de adicionar esta camada de complexibilidade.
18 |
19 | O código de configuração seguinte mostra como configurar dois gerenciadores de entidade:
20 |
21 | .. configuration-block::
22 |
23 | .. code-block:: yaml
24 |
25 | doctrine:
26 | orm:
27 | default_entity_manager: default
28 | entity_managers:
29 | default:
30 | connection: default
31 | mappings:
32 | AcmeDemoBundle: ~
33 | AcmeStoreBundle: ~
34 | customer:
35 | connection: customer
36 | mappings:
37 | AcmeCustomerBundle: ~
38 |
39 | Neste caso, você deve definir dois gerenciadores de entidade e chamá-los de
40 | ``default`` e ``customer``. O gerenciador de entidade ``default`` manipula as
41 | entidades em ``AcmeDemoBundle`` e ``AcmeStoreBundle``, enquanto o gerenciador
42 | de entidades ``customer`` manipula as entidades ``AcmeCustomerBundle``.
43 |
44 | Quando estiver trabalhando com múltiplos gerenciadores de entidade, você deve ser explícito
45 | sobre qual gerenciador de entidade você quer. Se você *omitir* o nome do gerenciador de
46 | entidade quando você atualizar o seu schema, será usado o padrão (ou seja, ``default``)::
47 |
48 | # Play only with "default" mappings
49 | php app/console doctrine:schema:update --force
50 |
51 | # Play only with "customer" mappings
52 | php app/console doctrine:schema:update --force --em=customer
53 |
54 | Se você *omitir* o nome do gerenciador de entidade ao solicitar ele,
55 | o gerenciador de entidade padrão (ou seja, ``default``) é retornado::
56 |
57 | class UserController extends Controller
58 | {
59 | public function indexAction()
60 | {
61 | // both return the "default" em
62 | $em = $this->get('doctrine')->getManager();
63 | $em = $this->get('doctrine')->getManager('default');
64 |
65 | $customerEm = $this->get('doctrine')->getManager('customer');
66 | }
67 | }
68 |
69 | Agora você pode usar Doctrine exatamente da mesma forma que você fez antes -
70 | usando o gerenciador de entidade ``default`` para persistir e buscar as
71 | entidades que ele gerencia, e o gerenciador de entidade ``customer`` para
72 | persistir e buscar suas entidades.
73 |
74 | O mesmo se aplica para chamadas de repositório::
75 |
76 | class UserController extends Controller
77 | {
78 | public function indexAction()
79 | {
80 | // Retrieves a repository managed by the "default" em
81 | $products = $this->get('doctrine')
82 | ->getRepository('AcmeStoreBundle:Product')
83 | ->findAll();
84 |
85 | // Explicit way to deal with the "default" em
86 | $products = $this->get('doctrine')
87 | ->getRepository('AcmeStoreBundle:Product', 'default')
88 | ->findAll();
89 |
90 | // Retrieves a repository managed by the "customer" em
91 | $customers = $this->get('doctrine')
92 | ->getRepository('AcmeCustomerBundle:Customer', 'customer')
93 | ->findAll();
94 | }
95 | }
96 |
--------------------------------------------------------------------------------
/console/command_in_controller.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Console; Como Chamar um Comando dentro de um Controlador
3 |
4 | Como Chamar um Comando dentro de um Controlador
5 | ===============================================
6 |
7 | A :doc:`documentação do componente Console `
8 | aborda como criar um comando de console. Este artigo aborda como
9 | usar um comando de console diretamente em seu controlador.
10 |
11 | Você pode ter a necessidade de executar alguma função que somente está disponível em um
12 | comando de console. Normalmente, você deve refatorar o comando e mover alguma lógica
13 | em um serviço que pode ser reutilizado no controlador. No entanto, quando o comando
14 | é parte de uma biblioteca de terceiros, você não gostaria de modificar ou duplicar
15 | o seu código. Em vez disso, você pode executar o comando diretamente.
16 |
17 | .. caution::
18 |
19 | Em comparação com uma chamada direta do console, chamar um comando
20 | dentro um controlador tem um leve impacto no desempenho por causa da sobrecarga no stack da
21 | requisição.
22 |
23 | Imagine que você deseja enviar as mensagens que estão no spool do Swift Mailer
24 | :doc:`usando o comando swiftmailer:spool:send `.
25 | Execute esse comando dentro de seu controlador da seguinte forma::
26 |
27 | // src/AppBundle/Controller/SpoolController.php
28 | namespace AppBundle\Controller;
29 |
30 | use Symfony\Bundle\FrameworkBundle\Console\Application;
31 | use Symfony\Bundle\FrameworkBundle\Controller\Controller;
32 | use Symfony\Component\Console\Input\ArrayInput;
33 | use Symfony\Component\Console\Output\BufferedOutput;
34 | use Symfony\Component\HttpFoundation\Response;
35 |
36 | class SpoolController extends Controller
37 | {
38 | public function sendSpoolAction($messages = 10)
39 | {
40 | $kernel = $this->get('kernel');
41 | $application = new Application($kernel);
42 | $application->setAutoExit(false);
43 |
44 | $input = new ArrayInput(array(
45 | 'command' => 'swiftmailer:spool:send',
46 | '--message-limit' => $messages,
47 | ));
48 | // You can use NullOutput() if you don't need the output
49 | $output = new BufferedOutput();
50 | $application->run($input, $output);
51 |
52 | // return the output, don't use if you used NullOutput()
53 | $content = $output->fetch();
54 |
55 | // return new Response(""), if you used NullOutput()
56 | return new Response($content);
57 | }
58 | }
59 |
60 | Mostrando a Saída do Comando Colorida
61 | -------------------------------------
62 |
63 | Ao dizer que ``BufferedOutput`` é decorado através do segundo parâmetro,
64 | ele irá retornar o conteúdo codificado por cores Ansi. O `conversor AnsiToHtml da SensioLabs`_
65 | pode ser usado para converter isso em HTML colorido.
66 |
67 | Em primeiro lugar, instale o pacote:
68 |
69 | .. code-block:: bash
70 |
71 | $ composer require sensiolabs/ansi-to-html
72 |
73 | Agora, use-o em seu controlador::
74 |
75 | // src/AppBundle/Controller/SpoolController.php
76 | namespace AppBundle\Controller;
77 |
78 | use SensioLabs\AnsiConverter\AnsiToHtmlConverter;
79 | use Symfony\Component\Console\Output\BufferedOutput;
80 | use Symfony\Component\Console\Output\OutputInterface;
81 | use Symfony\Component\HttpFoundation\Response;
82 | // ...
83 |
84 | class SpoolController extends Controller
85 | {
86 | public function sendSpoolAction($messages = 10)
87 | {
88 | // ...
89 | $output = new BufferedOutput(
90 | OutputInterface::VERBOSITY_NORMAL,
91 | true // true for decorated
92 | );
93 | // ...
94 |
95 | // return the output
96 | $converter = new AnsiToHtmlConverter();
97 | $content = $output->fetch();
98 |
99 | return new Response($converter->convert($content));
100 | }
101 | }
102 |
103 | O ``AnsiToHtmlConverter`` também pode ser registrado `como uma Extensão Twig`_,
104 | e suporta temas opcionais.
105 |
106 | .. _`conversor AnsiToHtml da SensioLabs`: https://github.com/sensiolabs/ansi-to-html
107 | .. _`como uma Extensão Twig`: https://github.com/sensiolabs/ansi-to-html#twig-integration
108 |
--------------------------------------------------------------------------------
/form/direct_submit.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Formulário; Form::submit()
3 |
4 | Como usar a função submit() para lidar com Submissões de Formulário
5 | ===================================================================
6 |
7 | .. versionadded:: 2.3
8 | O método :method:`Symfony\\Component\\Form\\FormInterface::handleRequest`
9 | foi introduzido no Symfony 2.3.
10 |
11 | Com o método ``handleRequest()``, é realmente fácil lidar com submissões de
12 | formulário::
13 |
14 | use Symfony\Component\HttpFoundation\Request;
15 | // ...
16 |
17 | public function newAction(Request $request)
18 | {
19 | $form = $this->createFormBuilder()
20 | // ...
21 | ->getForm();
22 |
23 | $form->handleRequest($request);
24 |
25 | if ($form->isValid()) {
26 | // perform some action...
27 |
28 | return $this->redirect($this->generateUrl('task_success'));
29 | }
30 |
31 | return $this->render('AcmeTaskBundle:Default:new.html.twig', array(
32 | 'form' => $form->createView(),
33 | ));
34 | }
35 |
36 | .. tip::
37 |
38 | Para ver mais sobre esse método, leia :ref:`book-form-handling-form-submissions`.
39 |
40 | .. _cookbook-form-call-submit-directly:
41 |
42 | Chamando o Form::submit() manualmente
43 | -------------------------------------
44 |
45 | .. versionadded:: 2.3
46 | Antes do Symfony 2.3, o método ``submit()`` era conhecido como ``bind()``.
47 |
48 | Em alguns casos, você quer um controle melhor sobre quando exatamente o formulário é enviado
49 | e quais dados são passados para ele. Em vez de usar o
50 | método :method:`Symfony\\Component\\Form\\FormInterface::handleRequest`
51 | , passe os dados submetidos diretamente ao
52 | :method:`Symfony\\Component\\Form\\FormInterface::submit`::
53 |
54 | use Symfony\Component\HttpFoundation\Request;
55 | // ...
56 |
57 | public function newAction(Request $request)
58 | {
59 | $form = $this->createFormBuilder()
60 | // ...
61 | ->getForm();
62 |
63 | if ($request->isMethod('POST')) {
64 | $form->submit($request->request->get($form->getName()));
65 |
66 | if ($form->isValid()) {
67 | // perform some action...
68 |
69 | return $this->redirect($this->generateUrl('task_success'));
70 | }
71 | }
72 |
73 | return $this->render('AcmeTaskBundle:Default:new.html.twig', array(
74 | 'form' => $form->createView(),
75 | ));
76 | }
77 |
78 | .. tip::
79 |
80 | Formulários que consistem de campos aninhados esperam um array no
81 | :method:`Symfony\\Component\\Form\\FormInterface::submit`. Você também pode enviar
82 | campos individuais chamando :method:`Symfony\\Component\\Form\\FormInterface::submit`
83 | diretamente no campo::
84 |
85 | $form->get('firstName')->submit('Fabien');
86 |
87 | .. _cookbook-form-submit-request:
88 |
89 | Passando uma Requisição para Form::submit() (Obsoleto)
90 | ------------------------------------------------------
91 |
92 | .. versionadded:: 2.3
93 | Antes do Symfony 2.3, o método ``submit`` era conhecido como ``bind``.
94 |
95 | Antes do Symfony 2.3, o método :method:`Symfony\\Component\\Form\\FormInterface::submit`
96 | aceitava um objeto :class:`Symfony\\Component\\HttpFoundation\\Request` como
97 | um atalho conveniente para o exemplo anterior::
98 |
99 | use Symfony\Component\HttpFoundation\Request;
100 | // ...
101 |
102 | public function newAction(Request $request)
103 | {
104 | $form = $this->createFormBuilder()
105 | // ...
106 | ->getForm();
107 |
108 | if ($request->isMethod('POST')) {
109 | $form->submit($request);
110 |
111 | if ($form->isValid()) {
112 | // perform some action...
113 |
114 | return $this->redirect($this->generateUrl('task_success'));
115 | }
116 | }
117 |
118 | return $this->render('AcmeTaskBundle:Default:new.html.twig', array(
119 | 'form' => $form->createView(),
120 | ));
121 | }
122 |
123 | Passar o :class:`Symfony\\Component\\HttpFoundation\\Request` diretamente para
124 | :method:`Symfony\\Component\\Form\\FormInterface::submit` ainda funciona, mas está
125 | obsoleto e será removido no Symfony 3.0. Ao invés, você deve usar o método
126 | :method:`Symfony\\Component\\Form\\FormInterface::handleRequest`.
127 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/bundles/remove.rst:
--------------------------------------------------------------------------------
1 | .. index::
2 | single: Bundle; Removendo o AcmeDemoBundle
3 |
4 | Como remover o AcmeDemoBundle
5 | =============================
6 |
7 | A Edição Standard do Symfony vem com uma demonstração completa que reside dentro de um
8 | bundle chamado AcmeDemoBundle. É um ótimo boilerplate como referência ao
9 | iniciar um projeto, mas, provavelmente, você vai querer eventualmente removê-lo.
10 |
11 | .. tip::
12 |
13 | Este artigo usa o AcmeDemoBundle como um exemplo, mas você pode usar
14 | estes passos para remover qualquer bundle.
15 |
16 | 1. Cancelar o registro do Bundle no ``AppKernel``
17 | -------------------------------------------------
18 |
19 | Para desconectar o bundle do framework, você deve remover o bundle do
20 | método ``AppKernel::registerBundles()``. O bundle é normalmente encontrado no
21 | array ``bundles`` mas o AcmeDemoBundle somente é registrado no
22 | ambiente de desenvolvimento e você pode encontrá-lo dentro do if abaixo::
23 |
24 | // app/AppKernel.php
25 |
26 | // ...
27 | class AppKernel extends Kernel
28 | {
29 | public function registerBundles()
30 | {
31 | $bundles = array(...);
32 |
33 | if (in_array($this->getEnvironment(), array('dev', 'test'))) {
34 | // comment or remove this line:
35 | // $bundles[] = new Acme\DemoBundle\AcmeDemoBundle();
36 | // ...
37 | }
38 | }
39 | }
40 |
41 | 2. Remover a Configuração do Bundle
42 | -----------------------------------
43 |
44 | Agora que o Symfony não sabe sobre o bundle, você precisa remover qualquer
45 | configuração e configuração de roteamento dentro do diretório ``app/config``
46 | que refere-se ao pacote.
47 |
48 | 2.1 Remover Rotas do Bundle
49 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~
50 |
51 | As rotas para o AcmeDemoBundle podem ser encontradas em ``app/config/routing_dev.yml``.
52 | Remova a entrada ``_acme_demo`` na parte inferior deste arquivo.
53 |
54 | 2.2 Remover a Configuração do Bundle
55 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
56 |
57 | Alguns bundles contêm configuração em um dos arquivos ``app/config/config*.yml``
58 | . Certifique-se de remover a configuração relacionada nesses arquivos. Você pode
59 | rapidamente detectar a configuração do bundle, procurando por uma string ``acme_demo`` (ou qualquer
60 | seja o nome do bundle, por exemplo, ``fos_user`` para o FOSUserBundle) nos
61 | arquivos de configuração.
62 |
63 | O AcmeDemoBundle não têm configuração. No entanto, o bundle é
64 | utilizado na configuração para o arquivo ``app/config/security.yml``. Você pode
65 | usá-lo como um boilerplate para a sua própria segurança, mas você também **pode** remover
66 | tudo: não importa para o Symfony se você removeu ele ou não.
67 |
68 | 3. Remover o Bundle do Sistema de Arquivos
69 | ------------------------------------------
70 |
71 | Agora que você removeu todas as referências ao bundle em sua aplicação, você
72 | deve remover o bundle do sistema de arquivos. O bundle está localizado no diretório
73 | ``src/Acme/DemoBundle``. Você deve remover esse diretório e
74 | pode remover o diretório ``Acme`` também.
75 |
76 | .. tip::
77 |
78 | Se você não sabe a localização de um bundle, pode usar o
79 | método :method:`Symfony\\Component\\HttpKernel\\Bundle\\BundleInterface::getPath`
80 | para obter o caminho do bundle::
81 |
82 | echo $this->container->get('kernel')->getBundle('AcmeDemoBundle')->getPath();
83 |
84 | 3.1 Remover Assets do Bundle
85 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
86 |
87 | Remover os assets do bundle no diretório web/ (ex.,
88 | ``web/bundles/acmedemo`` para o AcmeDemoBundle).
89 |
90 | 4. Remover Integração em outros Bundles
91 | ---------------------------------------
92 |
93 | .. note::
94 |
95 | Isto não se aplica ao AcmeDemoBundle - não há outros bundles que dependem
96 | dele, de modo que você pode pular esta etapa.
97 |
98 | Alguns bundles dependem de outros bundles, e, se você remover um dos dois, o outro
99 | provavelmente não vai funcionar. Certifique-se de que nenhum outro bundle, terceiros ou self-made,
100 | dependam do bundle que você está prestes a remover.
101 |
102 | .. tip::
103 |
104 | Se um bundle depende de um outro, na maioria dos casos, significa que ele usa
105 | alguns serviços do bundle. Pesquisando pelo alias do bundle pode
106 | ajudá-lo a identificá-los (ex., ``acme_demo`` para bundles que dependem do AcmeDemoBundle).
107 |
108 | .. tip::
109 |
110 | Se um bundle de terceiro depende de um outro bundle, você pode encontrar esse bundle
111 | mencionado no arquivo ``composer.json`` incluído no diretório do bundle.
112 |
--------------------------------------------------------------------------------
/email/spool.rst:
--------------------------------------------------------------------------------
1 | Como fazer Spool de E-mail
2 | ==========================
3 |
4 | Quando você estiver usando o ``SwiftmailerBundle`` para enviar um email de uma aplicação Symfony2,
5 | ele irá, por padrão, enviar o e-mail imediatamente. Você pode, entretanto,
6 | desejar evitar um impacto no desempenho da comunicação entre o ``Swiftmailer``
7 | e o transporte do e-mail, o que poderia fazer com que o usuário tenha que aguardar
8 | a próxima página carregar, enquanto está enviando o e-mail. Isto pode ser evitado escolhendo
9 | pelo "spool" dos e-mails em vez de enviá-los diretamente. Isto significa que o ``Swiftmailer``
10 | não tentará enviar o email, mas, ao invés, salvará a mensagem em algum lugar,
11 | como um arquivo. Outro processo poderá então ler a partir do spool e cuidar
12 | de enviar os e-mails no spool. Atualmente, apenas o spool para arquivo ou memória são suportados
13 | pelo ``Swiftmailer``.
14 |
15 | Spool usando memória
16 | --------------------
17 |
18 | Quando você usa o spool para armazenar os e-mails em memória, eles são enviados
19 | mesmo antes do kernel terminar. Isto significa que o e-mail só é enviado
20 | se o pedido foi todo executado sem qualquer exceção não tratada ou quaisquer erros.
21 | Para configurar o SwiftMailer com a opção de memória, utilize a seguinte configuração:
22 |
23 | .. configuration-block::
24 |
25 | .. code-block:: yaml
26 |
27 | # app/config/config.yml
28 | swiftmailer:
29 | # ...
30 | spool: { type: memory }
31 |
32 | .. code-block:: xml
33 |
34 |
35 |
36 |
40 |
41 |
42 |
43 |
44 |
45 | .. code-block:: php
46 |
47 | // app/config/config.php
48 | $container->loadFromExtension('swiftmailer', array(
49 | ...,
50 | 'spool' => array('type' => 'memory')
51 | ));
52 |
53 | Spool usando um arquivo
54 | -----------------------
55 |
56 | Para utilizar o spool com um arquivo, use a seguinte configuração:
57 |
58 | .. configuration-block::
59 |
60 | .. code-block:: yaml
61 |
62 | # app/config/config.yml
63 | swiftmailer:
64 | # ...
65 | spool:
66 | type: file
67 | path: /path/to/spool
68 |
69 | .. code-block:: xml
70 |
71 |
72 |
73 |
77 |
78 |
79 |
82 |
83 |
84 | .. code-block:: php
85 |
86 | // app/config/config.php
87 | $container->loadFromExtension('swiftmailer', array(
88 | // ...
89 | 'spool' => array(
90 | 'type' => 'file',
91 | 'path' => '/path/to/spool',
92 | )
93 | ));
94 |
95 | .. tip::
96 |
97 | Se você deseja armazenar o spool em algum lugar no diretório do seu projeto,
98 | lembre-se que você pode usar o parâmetro `%kernel.root_dir%` para referenciar
99 | o raiz do seu projeto:
100 |
101 | .. code-block:: yaml
102 |
103 | path: %kernel.root_dir%/spool
104 |
105 | Agora, quando a sua aplicação enviar um e-mail, ele não será realmente enviado, ao invés,
106 | será adicionado ao spool. O envio de mensagens do spool é feito separadamente.
107 | Existe um comando do console para enviar as mensagens que encontram-se no spool:
108 |
109 | .. code-block:: bash
110 |
111 | php app/console swiftmailer:spool:send
112 |
113 | Ele tem uma opção para limitar o número de mensagens a serem enviadas:
114 |
115 | .. code-block:: bash
116 |
117 | php app/console swiftmailer:spool:send --message-limit=10
118 |
119 | Você também pode definir o limite de tempo em segundos:
120 |
121 | .. code-block:: bash
122 |
123 | php app/console swiftmailer:spool:send --time-limit=10
124 |
125 | Claro que, na realidade, você não vai querer executar ele manualmente. Em vez disso, o
126 | comando do console deve ser disparado por um cron job ou tarefa agendada e executar
127 | em um intervalo regular.
128 |
--------------------------------------------------------------------------------
/contributing/code/standards.rst:
--------------------------------------------------------------------------------
1 | Padrões de Codificação
2 | ======================
3 |
4 | Para contribuir com código para o Symfony2, você deve seguir seus padrões de
5 | codificação. Para encurtar a história, esta é a regra de ouro: **Imite o código
6 | existente no Symfony2**. Muitos Bundles e bilbiotecas usados pelo Symfony2
7 | também seguem as mesmas regras, e você também deveria.
8 |
9 | Lembre-se que a principal vantagem de padrões é que cada pedaço de código parece
10 | familiar, não é sobre isso ou aquilo ser mais legível.
11 |
12 | Como uma imagem — ou código — diz mais que mil palavras, aqui está um exemplo
13 | curto, contendo a maior parte dos aspectos descrito abaixo.
14 |
15 | .. code-block:: php
16 |
17 |
23 | *
24 | * For the full copyright and license information, please view the LICENSE
25 | * file that was distributed with this source code.
26 | */
27 |
28 | namespace Acme;
29 |
30 | class Foo
31 | {
32 | const SOME_CONST = 42;
33 |
34 | private $foo;
35 |
36 | /**
37 | * @param string $dummy Some argument description
38 | */
39 | public function __construct($dummy)
40 | {
41 | $this->foo = $this->transform($dummy);
42 | }
43 |
44 | /**
45 | * @param string $dummy Some argument description
46 | * @return string|null Transformed input
47 | */
48 | private function transform($dummy)
49 | {
50 | if (true === $dummy) {
51 | return;
52 | }
53 | if ('string' === $dummy) {
54 | $dummy = substr($dummy, 0, 5);
55 | }
56 |
57 | return $dummy;
58 | }
59 | }
60 |
61 |
62 | Estrutura
63 | ---------
64 |
65 | * Nunca use *short tags* (``);
66 |
67 | * Não termine arquivos de classe com o a tag `?>` de costume;
68 |
69 | * Indentação é feita em passos de 4 espaços (tabulações nunca são permitidas);
70 |
71 | * Use o caractere de nova linha (LF ou `0x0A`) para encerrar linhas;
72 |
73 | * Coloque um único espaço depois de cada vírgula;
74 |
75 | * Não coloque espaços depois de abrir parênteses ou antes de fechá-los;
76 |
77 | * Coloque um único espaço em volta de operadores (`==`, `&&`, …);
78 |
79 | * Coloque um único espaço antes de abrir parênteses de uma palavra de controle
80 | (`if`, `else`, `for`, `while`, …);
81 |
82 | * Coloque uma linha em braco antes de uma declaração `return`, a não ser que a
83 | declaração esteja sozinha dentro de um bloco (como dentro de um `if`);
84 |
85 | * Não acrescente espaços no final das linhas;
86 |
87 | * Use chaves para indicar o corpo de estruturas de controle, não importando o
88 | númedo de declarações que ele contém;
89 |
90 | * Coloque chaves nas suas prórpias linhas na declaração de classes, métodos e funções;
91 |
92 | * Separe as declarações de estruturas de controle (`if`, `else`, …) e suas
93 | chaves de abertura com um único espaço e nenhuma linha em branco;
94 |
95 | * Declare explicitamente a visibilidade de classes, métodos e propriedades. O
96 | uso de `var` é proibido;
97 |
98 | * Use as constantes nativas do PHP em caixa baixa: `false`, `true` e `null`. O
99 | mesmo vale para `array()`;
100 |
101 | * Use caixa alta para constantes, com as palavras separadas por `_`;
102 |
103 | * Defina uma classe por arquivo;
104 |
105 | * Declare as propriedades da classe antes dos métodos;
106 |
107 | * Declare métodos públicos primeiro, depois os protegidos e, finalmente, os
108 | privados.
109 |
110 |
111 | Padrões de nomeação
112 | -------------------
113 |
114 | * Use camelCase, não underscores (`_`), para variáveis, funções e métodos;
115 |
116 | * Use underscores para nomes de opções, argumentos e parâmetros;
117 |
118 | * Use namespaces em todas as classes;
119 |
120 | * Sufixe nomes de interface com `Interface`;
121 |
122 | * Use caracteres alfanuméricos e underscores para nomes de arquivos;
123 |
124 | * Não se esqueça de ver no documento mais explicativo :doc:`conventions` para
125 | considerações de nomeação mais subjetivas.
126 |
127 |
128 | Documentação
129 | ------------
130 |
131 | * Insira blocks PHPDoc para todas as classes, métodos e funções;
132 |
133 | * Omita a tag `@return` se o método não retorna nada;
134 |
135 | * As anotações `@package` e `@subpackage` não são usadas.
136 |
137 |
138 | Licença
139 | -------
140 |
141 | * Symfony é distribuido sob a licença MIT, e o bloco de licença deve estar
142 | presente no topo de todo arquivo PHP, antes do namespace.
143 |
--------------------------------------------------------------------------------
/best_practices/tests.rst:
--------------------------------------------------------------------------------
1 | Testes
2 | ======
3 |
4 | Em termos gerais, existem dois tipos de teste. O teste de unidade permite
5 | testar a entrada e saída de funções específicas. O teste funcional permite comandar
6 | um "browser", onde é possível navegar pelas páginas do seu site, clicar em
7 | links, preencher formulários e afirmar que existem certas coisas na página.
8 |
9 | Testes de Unidade (ou Testes Unitários)
10 | ---------------------------------------
11 |
12 | Os testes de unidade são usados para testar a sua "lógica de negócios", que deve residir em
13 | classes que são independentes do Symfony. Por essa razão, o Symfony realmente não
14 | tem uma opinião sobre as ferramentas que você usa para testes de unidade. No entanto, as
15 | ferramentas mais populares são `PhpUnit`_ e `PhpSpec`_.
16 |
17 | Testes Funcionais
18 | -----------------
19 |
20 | Criar bons testes funcionais realmente pode ser difícil, então, alguns desenvolvedores ignoram
21 | estes completamente. Não ignore os testes funcionais! Ao definir alguns testes funcionais
22 | *simples*, você pode detectar rapidamente quaisquer grandes erros antes de implantá-los:
23 |
24 | .. best-practice::
25 |
26 | Defina um teste funcional, que, pelo menos, verifique se as páginas da sua aplicação
27 | foram carregadas com sucesso.
28 |
29 | Um teste funcional pode ser simples assim:
30 |
31 | .. code-block:: php
32 |
33 | /** @dataProvider provideUrls */
34 | public function testPageIsSuccessful($url)
35 | {
36 | $client = self::createClient();
37 | $client->request('GET', $url);
38 |
39 | $this->assertTrue($client->getResponse()->isSuccessful());
40 | }
41 |
42 | public function provideUrls()
43 | {
44 | return array(
45 | array('/'),
46 | array('/posts'),
47 | array('/post/fixture-post-1'),
48 | array('/blog/category/fixture-category'),
49 | array('/archives'),
50 | // ...
51 | );
52 | }
53 |
54 | Esse código verifica se todas as URLs informadas foram carregadas com sucesso, significando que
55 | seu código de status de resposta HTTP está entre ``200`` e ``299``. Isso pode
56 | não parecer muito útil, mas levando em consideração o pouco esforço necessário, vale a pena
57 | ter em sua aplicação.
58 |
59 | Em software de computador, esse tipo de teste é chamado `teste de fumaça`_ e consiste
60 | de *"testes preliminares para revelar falhas simples graves o suficiente para rejeitar um
61 | potencial lançamento de software"*.
62 |
63 | URLs no próprio código em um Teste Funcional
64 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
65 |
66 | Alguns de vocês podem estar se perguntando por que o teste funcional anterior não usa um
67 | serviço gerador de URL:
68 |
69 | .. best-practice::
70 |
71 | Utilizar, nos testes funcionais, as URLs no próprio código em vez de usar um gerador
72 | de URL.
73 |
74 | Considere o seguinte teste funcional que usa o serviço ``router`` para
75 | gerar a URL da página testada:
76 |
77 | .. code-block:: php
78 |
79 | public function testBlogArchives()
80 | {
81 | $client = self::createClient();
82 | $url = $client->getContainer()->get('router')->generate('blog_archives');
83 | $client->request('GET', $url);
84 |
85 | // ...
86 | }
87 |
88 | Isso irá funcionar, mas tem uma *enorme* desvantagem. Se um desenvolvedor altera por engano
89 | o caminho da rota ``blog_archives``, o teste ainda vai passar,
90 | mas a URL original (antiga) não vai funcionar! Isso significa que quaisquer bookmarks para
91 | aquela URL serão quebrados e você vai perder qualquer ranking da página nas engines de busca.
92 |
93 | Testando Funcionalidade JavaScript
94 | ----------------------------------
95 |
96 | O cliente de teste funcional integrado é ótimo, mas não pode ser usado para
97 | testar qualquer comportamento JavaScript em suas páginas. Se você precisa testar isso, considere
98 | usar a biblioteca `Mink`_ do PHPUnit.
99 |
100 | É claro que, se você tem um frontend JavaScript pesado, deve considerar o uso
101 | ferramentas de teste em JavaScript puro.
102 |
103 | Saiba mais sobre Testes Funcionais
104 | ----------------------------------
105 |
106 | Considere o uso das bibliotecas `Faker`_ e `Alice`_ para gerar dados parecidos com os reais
107 | para os seus dados de ensaio de teste.
108 |
109 | .. _`Faker`: https://github.com/fzaninotto/Faker
110 | .. _`Alice`: https://github.com/nelmio/alice
111 | .. _`PhpUnit`: https://phpunit.de/
112 | .. _`PhpSpec`: http://www.phpspec.net/
113 | .. _`Mink`: http://mink.behat.org
114 | .. _`teste de fumaça`: http://en.wikipedia.org/wiki/Smoke_testing_(software)
115 |
--------------------------------------------------------------------------------