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

Our google tracking code is: {{ ga_tracking }}

24 | 25 | É fácil! Você também pode utilizar do sistema de parâmetros (:ref:`book-service-container-parameters`), 26 | que permite você isolar e reutilizar o valor como a seguir. 27 | 28 | .. code-block:: ini 29 | 30 | ; app/config/parameters.yml 31 | [parameters] 32 | ga_tracking: UA-xxxxx-x 33 | 34 | .. code-block:: yaml 35 | 36 | # app/config/config.yml 37 | twig: 38 | globals: 39 | ga_tracking: %ga_tracking% 40 | 41 | A mesma variável está disponível exatamente como antes. 42 | 43 | Variáveis globais mais complexas 44 | -------------------------------- 45 | 46 | Se a variável global que deseja definir é mais complexa, como um objeto por exemplo, 47 | então você não poderá utilizar o método acima. Ao invés disso, precisa criar uma 48 | extensão Twig (:ref:`Twig Extension`) e retornar 49 | a variável global como uma das entradas no método ``getGlobals``. 50 | -------------------------------------------------------------------------------- /templating/twig_extension.rst: -------------------------------------------------------------------------------- 1 | .. index:: 2 | single: Extensões Twig 3 | 4 | Como Escrever uma Extensão Twig Personalizada 5 | ============================================= 6 | 7 | A principal motivação para escrever uma extensão é mover código usado frequentemente 8 | em uma classe reutilizável como adicionar suporte para internacionalização. 9 | Uma extensão pode definir tags, filtros, testes, operadores, variáveis ​​globais, 10 | funções e node visitors. 11 | 12 | Criar uma extensão também contribui para uma melhor separação do código que é 13 | executado em tempo de compilação e código necessário em tempo de execução. Assim, ela torna 14 | o seu código mais rápido. 15 | 16 | .. tip:: 17 | 18 | Antes de escrever suas próprias extensões, verifique o 19 | `repositório de extensão oficial do Twig`_. 20 | 21 | Criar a Classe de Extensão 22 | -------------------------- 23 | 24 | .. note:: 25 | 26 | Este cookbook descreve como escrever uma extensão Twig personalizada a partir do 27 | Twig 1.12. Se você estiver usando uma versão mais antiga, por favor leia a 28 | `documentação das extensões Twig legada`_. 29 | 30 | Para obter a sua funcionalidade personalizada, primeiro você deve criar uma classe de extensão Twig. 31 | Como exemplo, você vai criar um filtro de preço para formatar um determinado número em preço:: 32 | 33 | // src/AppBundle/Twig/AppExtension.php 34 | namespace AppBundle\Twig; 35 | 36 | class AppExtension extends \Twig_Extension 37 | { 38 | public function getFilters() 39 | { 40 | return array( 41 | new \Twig_SimpleFilter('price', array($this, 'priceFilter')), 42 | ); 43 | } 44 | 45 | public function priceFilter($number, $decimals = 0, $decPoint = '.', $thousandsSep = ',') 46 | { 47 | $price = number_format($number, $decimals, $decPoint, $thousandsSep); 48 | $price = '$'.$price; 49 | 50 | return $price; 51 | } 52 | 53 | public function getName() 54 | { 55 | return 'app_extension'; 56 | } 57 | } 58 | 59 | .. tip:: 60 | 61 | Junto com os filtros personalizados, você também pode adicionar `funções` personalizadas e registrar 62 | `variáveis globais`. 63 | 64 | Registrar uma Extensão como um Serviço 65 | -------------------------------------- 66 | 67 | Agora você deve deixar o Container de Serviço saber sobre a sua extensão Twig recém-criada: 68 | 69 | .. configuration-block:: 70 | 71 | .. code-block:: yaml 72 | 73 | # app/config/services.yml 74 | services: 75 | app.twig_extension: 76 | class: AppBundle\Twig\AppExtension 77 | public: false 78 | tags: 79 | - { name: twig.extension } 80 | 81 | .. code-block:: xml 82 | 83 | 84 | 85 | 88 | 89 | 90 | 91 | 92 | .. code-block:: php 93 | 94 | // app/config/services.php 95 | use Symfony\Component\DependencyInjection\Definition; 96 | 97 | $container 98 | ->register('app.twig_extension', '\AppBundle\Twig\AppExtension') 99 | ->setPublic(false) 100 | ->addTag('twig.extension'); 101 | 102 | Usar a Extensão Personalizada 103 | ----------------------------- 104 | 105 | Usar sua extensão Twig recém-criada não é diferente de qualquer outra: 106 | 107 | .. code-block:: twig 108 | 109 | {# outputs $5,500.00 #} 110 | {{ '5500'|price }} 111 | 112 | Passando outros argumentos para o seu filtro: 113 | 114 | .. code-block:: twig 115 | 116 | {# outputs $5500,2516 #} 117 | {{ '5500.25155'|price(4, ',', '') }} 118 | 119 | Aprender mais 120 | ------------- 121 | 122 | Para aprofundar mais sobre Extensões Twig, por favor verifique a 123 | `documentação de extensões Twig`_. 124 | 125 | .. _`repositório de extensão oficial do Twig`: https://github.com/twigphp/Twig-extensions 126 | .. _`documentação de extensões Twig`: http://twig.sensiolabs.org/doc/advanced.html#creating-an-extension 127 | .. _`variáveis globais`: http://twig.sensiolabs.org/doc/advanced.html#id1 128 | .. _`funções`: http://twig.sensiolabs.org/doc/advanced.html#id2 129 | .. _`documentação das extensões Twig legada`: http://twig.sensiolabs.org/doc/advanced_legacy.html#creating-an-extension 130 | -------------------------------------------------------------------------------- /testing/bootstrap.rst: -------------------------------------------------------------------------------- 1 | Como customizar o processo de Bootstrap antes de rodar os testes 2 | ================================================================ 3 | 4 | Algumas vezes quando testes são rodados, você precisa fazer trabalho adicional 5 | de inicialização antes de rodá-los. Por exemplo, se você esta rodando um teste funcional 6 | e foi introduzido um novo recurso de tradução, então você vai precisar limpar seu cache 7 | antes de rodar os testes. Este cookbook aborda como fazer isso. 8 | 9 | Primeiramente, adicione o seguinte arquivo:: 10 | 11 | // app/tests.bootstrap.php 12 | if (isset($_ENV['BOOTSTRAP_CLEAR_CACHE_ENV'])) { 13 | passthru(sprintf( 14 | 'php "%s/console" cache:clear --env=%s --no-warmup', 15 | __DIR__, 16 | $_ENV['BOOTSTRAP_CLEAR_CACHE_ENV'] 17 | )); 18 | } 19 | 20 | require __DIR__.'/bootstrap.php.cache'; 21 | 22 | Substitua o arquivo boostrap de teste ``bootstrap.php.cache`` em ``app/phpunit.xml.dist`` 23 | com ``tests.bootstrap.php``: 24 | 25 | .. code-block:: xml 26 | 27 | 28 | 29 | 30 | 34 | 35 | Agora, você pode definir em seu arquivo ``phpunit.xml.dist`` de qual ambiente você quer 36 | que seja limpado o cache: 37 | 38 | .. code-block:: xml 39 | 40 | 41 | 42 | 43 | 44 | 45 | Isto torna-se agora uma variável de ambiente (i.e. ``$_ENV``) que está disponpivel 46 | no arquivo bootstrap personalizado (``tests.bootstrap.php``). 47 | --------------------------------------------------------------------------------