SlideShare uma empresa Scribd logo
1 de 48
Symfony2 Básico Prof. Nécio de Lima Veras
Parte I: Conhecendo... ,[object Object]
...o que é o Symfony2
...se é um framework MVC
...os componentes
...as inovações
...por onde começar
Sobre o criador ... Fabien Potencier @fabpot  Paris, France Sensio CEO (sensiolabs.com) and Symfony lead developer (symfony.com)  http://fabien.potencier.org   Work  CEO at Sensio About  Fabien discovered the Web in 1994, at a time when connecting to the Internet was still associated with the harmful strident sounds of a modem. Being a developer by passion, he immediately started to build websites with Perl. But with the release of PHP 5, he decided to switch focus to PHP, and created the symfony framework project in 2004 to help his company leverage the power of PHP for its customers. Fabien is a serial-entrepreneur, and among other companies, he created Sensio, a services and consulting company specialized in web technologies and Internet marketing, in 1998. Fabien is also the creator of several other Open-Source projects, a writer, a blogger, a speaker at internatio
Fabien Potencier ,[object Object],[object Object]
Symfony Live Conference, Symfony 2.0, and Dependency Injection
The state of YAML in PHP
Symfony Service Container: Using XML or YAML to describe Services ,[object Object]
Fabien Potencier ,[object Object]
http://symfony.com/blog/
Compartilha slides produzidos/apresentados em eventos
http://www.slideshare.net/fabpot
Publica ainda na “rede social dos codificadores” vários repositórios públicos de projetos
https://github.com/fabpot
Oficialização do Symfony2... “ After 12 preview releases, 5 beta versions, and 6 release candidates, I'm very orgulhoso to announce the immediate availability of Symfony 2.0, final version. Since the first preview release, published 18 months ago during the Symfony Live conference, the Symfony community has done an amazing work. The Symfony2 code quality would not have been the same without their outstanding work. Thank you!” Symfony 2.0 (http://symfony.com/blog/symfony-2-0)  by Fabien Potencier – July 28, 2011
A comunidade... ,[object Object]
“Since March 2011, more than 100 new contributors have joined the Symfony2 team (250 vs 150); and more than 250 new bundles have been created on Github (440 vs 170)” Symfony 2.0 (http://symfony.com/blog/symfony-2-0)  by Fabien Potencier – July 28, 2011
“ What is Symfony2?” ,[object Object]
“Then, based on these components, Symfony2 is also a full-stack web framework”
“ Dependendo do seu projeto e de suas necessidades, você pode escolher alguns dos componentes do Symfony2 e iniciar o projeto com eles, ou você pode usar tudo do framework e se beneficiar com a integração que ele proporciona” Fabien Potencier – publicado em seu blog pessoal (25/10/11)
Is Symfony2 an MVC framework? ,[object Object],[object Object],[object Object],[object Object],[object Object],Fabien Potencier – publicado em seu blog pessoal (25/10/11)
Is Symfony2 an MVC framework? ,[object Object]
“ Symfony2 is a great framework for bigger projects where tens of developers are involved and where the business logic is more complex. And the Symfony2 components are for people who don't want to use a framework, or for other Open-Source projects that  don't want to reinvent the wheel ” Fabien Potencier – publicado em seu blog pessoal (25/10/11)
The Symfony2 Component Fabien Potencier – publicado em seu blog pessoal (25/10/11) ,[object Object]
EventDispatcher
HttpFoundation
DomCrawler
ClassLoader
CssSelector
HttpKernel
BrowserKit
Templating
Translation
Serializer ,[object Object]
Security
Routing
Console
Process
Config
Finder
Locale
Yaml
Form
Symfony2: Inovações únicas no mundo PHP ,[object Object]

Mais conteúdo relacionado

Semelhante a Symfony2 Básico

Composer dependency manager - TDC - POA 2017
Composer   dependency manager - TDC - POA 2017Composer   dependency manager - TDC - POA 2017
Composer dependency manager - TDC - POA 2017Vitor Mattos
 
Drupal Camp Campinas 2016 - Composer 101 e sua integração com drupal 8
Drupal Camp Campinas 2016 - Composer 101 e sua integração com drupal 8Drupal Camp Campinas 2016 - Composer 101 e sua integração com drupal 8
Drupal Camp Campinas 2016 - Composer 101 e sua integração com drupal 8Natan Moraes
 
Desvendando o Symfony 4 - Webinar Symfony Brasil
Desvendando o Symfony 4 - Webinar Symfony BrasilDesvendando o Symfony 4 - Webinar Symfony Brasil
Desvendando o Symfony 4 - Webinar Symfony BrasilCamila Fernandes
 
Palestra do TechEd : O Projeto Mono: Aplicações .NET para sistemas não Windows
Palestra do TechEd : O Projeto Mono: Aplicações .NET para sistemas não WindowsPalestra do TechEd : O Projeto Mono: Aplicações .NET para sistemas não Windows
Palestra do TechEd : O Projeto Mono: Aplicações .NET para sistemas não WindowsAlessandro Binhara
 
Controlando Projetos com Netbeans e Subversion
Controlando Projetos com Netbeans e SubversionControlando Projetos com Netbeans e Subversion
Controlando Projetos com Netbeans e Subversionlekitamura
 
Symfony Flex @ 2º Meetup PHPVale
Symfony Flex @ 2º Meetup PHPValeSymfony Flex @ 2º Meetup PHPVale
Symfony Flex @ 2º Meetup PHPValeGabriel Machado
 
O Projeto Mono: Aplicações .NET para sistemas não Windows
O Projeto Mono: Aplicações .NET para sistemas não WindowsO Projeto Mono: Aplicações .NET para sistemas não Windows
O Projeto Mono: Aplicações .NET para sistemas não WindowsAlessandro Binhara
 
8 motivos-para-usar-o-yii2
8 motivos-para-usar-o-yii28 motivos-para-usar-o-yii2
8 motivos-para-usar-o-yii2Renato Lucena
 
TDC2016SP - Por dentro do .Net Core
TDC2016SP - Por dentro do .Net CoreTDC2016SP - Por dentro do .Net Core
TDC2016SP - Por dentro do .Net Coretdc-globalcode
 
Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Vinícius de Paula
 
Desenvolver aplicações C# para o iPhone
Desenvolver aplicações C# para o iPhoneDesenvolver aplicações C# para o iPhone
Desenvolver aplicações C# para o iPhoneBruno Pires
 
Interoperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente MainframeInteroperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente MainframeAlessandro Binhara
 
Single-SPA: Como este framework pode me ajudar na construção de Micro Front-Ends
Single-SPA: Como este framework pode me ajudar na construção de Micro Front-EndsSingle-SPA: Como este framework pode me ajudar na construção de Micro Front-Ends
Single-SPA: Como este framework pode me ajudar na construção de Micro Front-EndsDaiana Cambruzzi Avila
 

Semelhante a Symfony2 Básico (20)

O projeto Mono
O projeto MonoO projeto Mono
O projeto Mono
 
Composer dependency manager - TDC - POA 2017
Composer   dependency manager - TDC - POA 2017Composer   dependency manager - TDC - POA 2017
Composer dependency manager - TDC - POA 2017
 
Drupal Camp Campinas 2016 - Composer 101 e sua integração com drupal 8
Drupal Camp Campinas 2016 - Composer 101 e sua integração com drupal 8Drupal Camp Campinas 2016 - Composer 101 e sua integração com drupal 8
Drupal Camp Campinas 2016 - Composer 101 e sua integração com drupal 8
 
Desvendando o Symfony 4 - Webinar Symfony Brasil
Desvendando o Symfony 4 - Webinar Symfony BrasilDesvendando o Symfony 4 - Webinar Symfony Brasil
Desvendando o Symfony 4 - Webinar Symfony Brasil
 
Int305 projeto mono-final
Int305 projeto mono-finalInt305 projeto mono-final
Int305 projeto mono-final
 
Treinamento em Symfony2
Treinamento em Symfony2Treinamento em Symfony2
Treinamento em Symfony2
 
Palestra do TechEd : O Projeto Mono: Aplicações .NET para sistemas não Windows
Palestra do TechEd : O Projeto Mono: Aplicações .NET para sistemas não WindowsPalestra do TechEd : O Projeto Mono: Aplicações .NET para sistemas não Windows
Palestra do TechEd : O Projeto Mono: Aplicações .NET para sistemas não Windows
 
Controlando Projetos com Netbeans e Subversion
Controlando Projetos com Netbeans e SubversionControlando Projetos com Netbeans e Subversion
Controlando Projetos com Netbeans e Subversion
 
Symfony Flex @ 2º Meetup PHPVale
Symfony Flex @ 2º Meetup PHPValeSymfony Flex @ 2º Meetup PHPVale
Symfony Flex @ 2º Meetup PHPVale
 
O Projeto Mono: Aplicações .NET para sistemas não Windows
O Projeto Mono: Aplicações .NET para sistemas não WindowsO Projeto Mono: Aplicações .NET para sistemas não Windows
O Projeto Mono: Aplicações .NET para sistemas não Windows
 
Php apostila - vol 02
Php   apostila - vol 02Php   apostila - vol 02
Php apostila - vol 02
 
Revista On-line
Revista On-lineRevista On-line
Revista On-line
 
8 motivos-para-usar-o-yii2
8 motivos-para-usar-o-yii28 motivos-para-usar-o-yii2
8 motivos-para-usar-o-yii2
 
WP Composer
WP ComposerWP Composer
WP Composer
 
Microframeworksphp
MicroframeworksphpMicroframeworksphp
Microframeworksphp
 
TDC2016SP - Por dentro do .Net Core
TDC2016SP - Por dentro do .Net CoreTDC2016SP - Por dentro do .Net Core
TDC2016SP - Por dentro do .Net Core
 
Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.
 
Desenvolver aplicações C# para o iPhone
Desenvolver aplicações C# para o iPhoneDesenvolver aplicações C# para o iPhone
Desenvolver aplicações C# para o iPhone
 
Interoperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente MainframeInteroperabilidade com .NET em ambiente Mainframe
Interoperabilidade com .NET em ambiente Mainframe
 
Single-SPA: Como este framework pode me ajudar na construção de Micro Front-Ends
Single-SPA: Como este framework pode me ajudar na construção de Micro Front-EndsSingle-SPA: Como este framework pode me ajudar na construção de Micro Front-Ends
Single-SPA: Como este framework pode me ajudar na construção de Micro Front-Ends
 

Mais de Nécio de Lima Veras

Introdução à analise e complexidade de algoritmos
Introdução à analise e complexidade de algoritmosIntrodução à analise e complexidade de algoritmos
Introdução à analise e complexidade de algoritmosNécio de Lima Veras
 
Uma Abordagem Baseada em Agentes para Planejamento e Monitoramento de Serviço...
Uma Abordagem Baseada em Agentes para Planejamento e Monitoramento de Serviço...Uma Abordagem Baseada em Agentes para Planejamento e Monitoramento de Serviço...
Uma Abordagem Baseada em Agentes para Planejamento e Monitoramento de Serviço...Nécio de Lima Veras
 
Introdução à Engenharia de Software Orientada a Agentes com JaCaMo
Introdução à Engenharia de Software Orientada a Agentes com JaCaMoIntrodução à Engenharia de Software Orientada a Agentes com JaCaMo
Introdução à Engenharia de Software Orientada a Agentes com JaCaMoNécio de Lima Veras
 
Jason: Componentes personalizados
Jason: Componentes personalizados Jason: Componentes personalizados
Jason: Componentes personalizados Nécio de Lima Veras
 
Ambientes em Sistemas Multi-agentes
Ambientes em Sistemas Multi-agentesAmbientes em Sistemas Multi-agentes
Ambientes em Sistemas Multi-agentesNécio de Lima Veras
 
Arquiteturas concretas de agentes inteligentes - bdi agents
Arquiteturas concretas de agentes inteligentes - bdi agentsArquiteturas concretas de agentes inteligentes - bdi agents
Arquiteturas concretas de agentes inteligentes - bdi agentsNécio de Lima Veras
 
Especificações iniciais de agentes inteligentes
Especificações iniciais de agentes inteligentesEspecificações iniciais de agentes inteligentes
Especificações iniciais de agentes inteligentesNécio de Lima Veras
 
Processos iniciais do mapeamento OR
Processos iniciais do mapeamento ORProcessos iniciais do mapeamento OR
Processos iniciais do mapeamento ORNécio de Lima Veras
 

Mais de Nécio de Lima Veras (20)

Introdução ao JavaFX
Introdução ao JavaFXIntrodução ao JavaFX
Introdução ao JavaFX
 
Introdução à analise e complexidade de algoritmos
Introdução à analise e complexidade de algoritmosIntrodução à analise e complexidade de algoritmos
Introdução à analise e complexidade de algoritmos
 
Teste de software
Teste de softwareTeste de software
Teste de software
 
Versionamento com git
Versionamento com gitVersionamento com git
Versionamento com git
 
Uma Abordagem Baseada em Agentes para Planejamento e Monitoramento de Serviço...
Uma Abordagem Baseada em Agentes para Planejamento e Monitoramento de Serviço...Uma Abordagem Baseada em Agentes para Planejamento e Monitoramento de Serviço...
Uma Abordagem Baseada em Agentes para Planejamento e Monitoramento de Serviço...
 
Introdução à Engenharia de Software Orientada a Agentes com JaCaMo
Introdução à Engenharia de Software Orientada a Agentes com JaCaMoIntrodução à Engenharia de Software Orientada a Agentes com JaCaMo
Introdução à Engenharia de Software Orientada a Agentes com JaCaMo
 
Jason: Componentes personalizados
Jason: Componentes personalizados Jason: Componentes personalizados
Jason: Componentes personalizados
 
Agentes inteligentes com jason
Agentes inteligentes com jasonAgentes inteligentes com jason
Agentes inteligentes com jason
 
Ambientes em Sistemas Multi-agentes
Ambientes em Sistemas Multi-agentesAmbientes em Sistemas Multi-agentes
Ambientes em Sistemas Multi-agentes
 
Arquiteturas concretas de agentes inteligentes - bdi agents
Arquiteturas concretas de agentes inteligentes - bdi agentsArquiteturas concretas de agentes inteligentes - bdi agents
Arquiteturas concretas de agentes inteligentes - bdi agents
 
Revisão de matemática
Revisão de matemáticaRevisão de matemática
Revisão de matemática
 
Especificações iniciais de agentes inteligentes
Especificações iniciais de agentes inteligentesEspecificações iniciais de agentes inteligentes
Especificações iniciais de agentes inteligentes
 
Notas sobre agentes inteligentes
Notas sobre agentes inteligentesNotas sobre agentes inteligentes
Notas sobre agentes inteligentes
 
Anotações do mapeamento OR
Anotações do mapeamento ORAnotações do mapeamento OR
Anotações do mapeamento OR
 
Hibernate-consultas
Hibernate-consultasHibernate-consultas
Hibernate-consultas
 
Mapeamento de herança OR
Mapeamento de herança ORMapeamento de herança OR
Mapeamento de herança OR
 
Relacionamentos do mapeamento OR
Relacionamentos do mapeamento ORRelacionamentos do mapeamento OR
Relacionamentos do mapeamento OR
 
Processos iniciais do mapeamento OR
Processos iniciais do mapeamento ORProcessos iniciais do mapeamento OR
Processos iniciais do mapeamento OR
 
Java swing
Java swingJava swing
Java swing
 
Introdução à linguagem UML
Introdução à linguagem UMLIntrodução à linguagem UML
Introdução à linguagem UML
 

Symfony2 Básico

  • 1. Symfony2 Básico Prof. Nécio de Lima Veras
  • 2.
  • 3. ...o que é o Symfony2
  • 4. ...se é um framework MVC
  • 8. Sobre o criador ... Fabien Potencier @fabpot Paris, France Sensio CEO (sensiolabs.com) and Symfony lead developer (symfony.com) http://fabien.potencier.org Work CEO at Sensio About Fabien discovered the Web in 1994, at a time when connecting to the Internet was still associated with the harmful strident sounds of a modem. Being a developer by passion, he immediately started to build websites with Perl. But with the release of PHP 5, he decided to switch focus to PHP, and created the symfony framework project in 2004 to help his company leverage the power of PHP for its customers. Fabien is a serial-entrepreneur, and among other companies, he created Sensio, a services and consulting company specialized in web technologies and Internet marketing, in 1998. Fabien is also the creator of several other Open-Source projects, a writer, a blogger, a speaker at internatio
  • 9.
  • 10. Symfony Live Conference, Symfony 2.0, and Dependency Injection
  • 11. The state of YAML in PHP
  • 12.
  • 13.
  • 17. Publica ainda na “rede social dos codificadores” vários repositórios públicos de projetos
  • 19. Oficialização do Symfony2... “ After 12 preview releases, 5 beta versions, and 6 release candidates, I'm very orgulhoso to announce the immediate availability of Symfony 2.0, final version. Since the first preview release, published 18 months ago during the Symfony Live conference, the Symfony community has done an amazing work. The Symfony2 code quality would not have been the same without their outstanding work. Thank you!” Symfony 2.0 (http://symfony.com/blog/symfony-2-0) by Fabien Potencier – July 28, 2011
  • 20.
  • 21. “Since March 2011, more than 100 new contributors have joined the Symfony2 team (250 vs 150); and more than 250 new bundles have been created on Github (440 vs 170)” Symfony 2.0 (http://symfony.com/blog/symfony-2-0) by Fabien Potencier – July 28, 2011
  • 22.
  • 23. “Then, based on these components, Symfony2 is also a full-stack web framework”
  • 24. “ Dependendo do seu projeto e de suas necessidades, você pode escolher alguns dos componentes do Symfony2 e iniciar o projeto com eles, ou você pode usar tudo do framework e se beneficiar com a integração que ele proporciona” Fabien Potencier – publicado em seu blog pessoal (25/10/11)
  • 25.
  • 26.
  • 27. “ Symfony2 is a great framework for bigger projects where tens of developers are involved and where the business logic is more complex. And the Symfony2 components are for people who don't want to use a framework, or for other Open-Source projects that don't want to reinvent the wheel ” Fabien Potencier – publicado em seu blog pessoal (25/10/11)
  • 28.
  • 38.
  • 46. Yaml
  • 47. Form
  • 48.
  • 49. “ Distributions : A distribution is a pre-configured Symfony2 project with a selection of bundles and sensible defaults. The Symfony Standard Edition also comes with a Web configurator. That makes the installation and configuration of a new Symfony2 project fast and insanely easy”
  • 50. “ Everything is a Bundle in Symfony2 : A bundle is a directory containing a set of files (PHP files, stylesheets, JavaScripts, images, ...) that implement a single feature (a blog, a forum, etc). That changes everything. Share your bundles between your projects or publish them in the wild”
  • 51. “ Symfony2 is Fast : the raw performance of the framework is great, but there is more”
  • 52. [...] Fabien Potencier – publicado em http://symfony.com/blog/symfony-2-0
  • 53.
  • 54. O console está dentro da pasta /app;
  • 55. As rotas estão definidas no arquivo /app/config/routing [_dev] .yml e é possível criar “atalhos”;
  • 56. Autoloading mais universal, mais rápido e independente de necessidade de limpeza de cache;
  • 57. Três tipos de configurações: Anotações , PHP e YAML
  • 58.
  • 59.
  • 61.
  • 62.
  • 65.
  • 66.
  • 67. Passo 3: descompactar na pasta apropriada para aplicações no servidor web;
  • 68.
  • 70. Página de boas vindas:
  • 71.
  • 72. Its prize projects are a Object Relational Mapper and the Database Abstraction Layer it is built on top of
  • 73. Console do Symfony: app/console
  • 74.
  • 79.
  • 80. Exemplo de um bundle criado automaticamente: Ifpi/Bundles/DisciplinasBundle Estrutura de diretórios IfpiBundlesDisciplinasBundle: resource: "@IfpiBundlesDisciplinasBundle/Controller/" type: annotation prefix: / Rota criada em /app/config/routing.yml public function registerBundles() {.... new IfpiundlesisciplinasBundlefpiBundlesDisciplinasBundle(), ); Bundle registrado no app/appKernel.php
  • 81.
  • 86. Exemplo: Entidade Disciplina Entidade gerada: Arquivo gerado:
  • 88.
  • 89.
  • 90. Ele irá criar uma nova base de dados;
  • 91.
  • 93.
  • 94.
  • 95. Comando2: executar o comando SQL criado; Obs.: faça isso quando todas as entidades estiverem prontas!
  • 97.
  • 98. Resultado do comando... Controller Views
  • 99.
  • 100.
  • 104. Resultados no browser... Rota padrão (index) Rota para exibição (show) Rota para edição (edit)
  • 105.
  • 107.
  • 108.
  • 111. Tipos de validação Basic Constraints These are the basic comstraints: use them to assert very basic things about the value of properties or the return value of methods on your object. NotBlank Blank NotNull Null True False Type String Constraints Email MinLength MaxLength Url Regex Ip Number Constraints Max Min Date Constraints Date DateTime Time Collection Constraints Choice Collection UniqueEntity Language Locale Country File Constraints File Image
  • 112. Algumas validações // src/Ifpi/Bundle/DisciplinasBundle/Aluno.php use Symfonyomponentalidatoronstraints as Assert; class Aluno { /** * @AssertotBlank(); * @Assertax(limit = 10, message = "O valor para média não pode ultrapassar o limite de DEZ.") * @Assertin(limit = 0, message = "O valor para média não pode ser inferior que ZERO.") */ private $media; } Valor Máximo e Mínimo de um atributo @Assertmail( * message = "The email '{{ value }}' is not a valid email.", * checkMX = true * ) protected $email; Validação de e-mail para um atributo /** * @Assertate() */ protected $dataNasc; Validação de data /** * @Asserthoice(choices = {"masculino", "feminino"}, message = "Escolha um sexo válido.") */ protected $sexo; Validação de opções Importação comum em todos os exemplos abaixo
  • 113. Validação usando um callback // src/Acme/BlogBundle/Entity/Author.php use Symfonyomponentalidatoronstraints as Assert; use SymfonyomponentalidatorxecutionContext; /** * @Assertallback(methods={"isAuthorValid"}) */ class Author { // ... private $firstName; public function isAuthorValid(ExecutionContext $context) { // somehow you have an array of "fake names" $fakeNames = array(); // check if the name is actually a fake name if (in_array($this->getFirstName(), $fakeNames)) { $property_path = $context->getPropertyPath() . '.firstName'; $context->setPropertyPath($property_path); $context->addViolation('This name sounds totally fake!', array(), null); } } } Setup Método
  • 114.
  • 115.
  • 118.
  • 119.
  • 120. Função __toString() na entidade Aluno; /** * @ORMneToOne(targetEntity="Aluno") * @ORMoinColumn(name="aluno_id", referencedColumnName="id") */ private $aluno; Mapeamento em Notas
  • 121. OneToOne – Unidirecional Resultado do comando automático (CRUD)
  • 122. OneToOne - Bidirecional /** @Entity */ class Aluno { // ... /** * @OneToOne(targetEntity="Notas", mappedBy="aluno") */ private $notas; // ... }
  • 123. OneToOne - Auto-relacionamento /** @Entity */ class Conjuge { // ... /** * @OneToOne(targetEntity="Conjuge") * @JoinColumn(name="conjuge_id", referencedColumnName="id") */ private $conjuge; // }
  • 124. OneToMany - Bidirecional /** @Entity */ class Produto { // ... /** * @OneToMany(targetEntity="Funcionalidade", mappedBy="produto") */ private $funcionalidades; // ... } /** @Entity */ class Funcionalidade { // ... /** * @ManyToOne(targetEntity="Produto") * @JoinColumn(name="produto_id", referencedColumnName="id") */ private $produto; // ... }
  • 125. ManyToMany - Bidirecional /** @Entity */ class Usuario { // ... /** * @ManyToMany(targetEntity="Grupo") * @JoinTable(name="gruposUsuarios", * joinColumns={@JoinColumn(name="usuario_id", referencedColumnName="id")}, * inverseJoinColumns={@JoinColumn(name="grupo_id", referencedColumnName="id")} * ) */ private $grupos; // ... }
  • 126. ManyToMany - Bidirecional /** @Entity */ class Grupo { // ... /** * @ManyToMany(targetEntity="Usuario", mappedBy="grupos") */ private $usuarios; // ... }
  • 127.
  • 128. Crie regras de validação para os campos: vTelefone, vRaca, bPedigree e vCor; Faça também com que o campo tHora aceite apenas o intervalo entre 08:00 e 18:00 horas.