Arquitetura de Sistema & Plataforma Empresarial
Plataforma web automóvel completa desenvolvida com Symfony 6, Doctrine ORM e EasyAdmin 4. Integra um portal público focado na conversão, um motor de busca de viaturas usadas em AJAX, gestão por perfis de acesso (RBAC) e APIs REST consumidas por aplicações móveis.
┌─────────────────────────────────────────────────────────────────────────────┐
│ Garage Vincent Parrot — Architecture Dual-Tier │
└──────────────────────────────────────┬──────────────────────────────────────┘
│
┌───────────────────────────┼───────────────────────────┐
▼ ▼ ▼
🚗 Moteur Véhicules & AJAX 👥 Back-Office RBAC 📡 API REST Headless
• noUiSlider (Prix, Km, Année) • EasyAdmin 4 Dashboard • Serializer JMS Groups
• Dropdowns dépendants BDD • Isolation ROLE_ADMIN/EMP • Endpoints paginés (/api)
• Rendu partiel JSON/Twig • Modération avis clients • Support Mobile & Cross-App
• VichUploader multi-photos • Gestion horaires & services • Sécurité CORS & CSRF
Motor de Busca AJAX
Pesquisa dinâmica multicritério de viaturas com noUiSlider sem necessidade de recarregar a página.
Controlo de Acessos por Perfis (RBAC)
Separação estrita de privilégios entre o proprietário da oficina e os colaboradores.
API REST Desacoplada
Endpoints JSON seguros que alimentam a aplicação móvel em Flutter e integrações externas.
1. Funcionalidades do Portal Público
Concebido para apresentar as competências da oficina e converter visitantes em contactos comerciais qualificados:
CMS de Serviços de Oficina
Apresentação detalhada de reparações (mecânica, chapa e pintura, manutenção periódica, ar condicionado) com gestão de imagens via VichUploader.
Catálogo de Viaturas Usadas
Fichas detalhadas (/occasions/vehicule/{id}) com carrossel de fotografias, especificações completas e formulário de contacto associado à viatura.
Avaliações de Clientes & Moderação
Sistema de classificação de 5 estrelas com proteção antispam e validação prévia pela equipa antes da publicação.
Horários de Funcionamento Dinâmicos
Extensão personalizada do Twig (HoraireExtension) que injeta automaticamente os horários atualizados no rodapé global.
2. Motor de Filtragem Multicritério em AJAX
A pesquisa avançada articula SearchData, SearchForm, VehiculeRepository::findSearch() e um controlador JavaScript assíncrono:
| Critério de Pesquisa |
Componente de Interface |
Consulta Doctrine DQL |
| Intervalo de Preços |
Dual-handle noUiSlider |
p.prix >= :prixmin AND p.prix <= :prixmax |
| Quilometragem |
Dual-handle noUiSlider |
p.kilometrage >= :kmmin AND p.kilometrage <= :kmmax |
| Ano de Matrícula |
Dual-handle noUiSlider (1970 - 2026) |
p.annee >= :anneemin AND p.annee <= :anneemax |
| Marca & Modelo |
Menus suspensos dependentes dinâmicos (/modeles/fetch) |
m.id IN (:marque) AND d.id IN (:modele) |
| Carroçaria, Combustível & Categoria |
Checkboxes (Carrosserie, Énergie) |
t.id IN (:type), a.id IN (:carburant) |
// Rendu partiel asynchrone JSON dans OccasionsController.php
if ($request->get('ajax')) {
return new JsonResponse([
'content' => $this->renderView('occasions/_occasions.html.twig', ['occasions' => $occasions]),
'sorting' => $this->renderView('occasions/_sorting.html.twig', ['occasions' => $occasions]),
'pagination' => $this->renderView('occasions/_pagination.html.twig', ['occasions' => $occasions]),
'prixmin' => $prixmin, 'prixmax' => $prixmax,
'kmmin' => $kmmin, 'kmmax' => $kmmax,
'anneemin' => $anneemin,'anneemax'=> $anneemax
]);
}
3. Controlo de Acessos Baseado em Perfis (RBAC)
Gestão de permissões e secções administrativas através do EasyAdmin e firewalls do Symfony Security:
ROLE_ADMIN
Administrador (Vincent Parrot)
- Gestão de contas de funcionários (criação, redefinição de palavras-passe com políticas de complexidade rigorosas).
- Controlo total do CMS para serviços de oficina, textos e recursos visuais.
- Configuração dos horários de funcionamento semanais e marcação de períodos de encerramento.
- Consulta e tratamento das mensagens de contacto recebidas.
ROLE_EMPLOYE
Colaboradores da Oficina
- Gestão do catálogo de viaturas usadas (publicação, carregamento de várias fotos, seleção de equipamento).
- Atribuição automática do colaborador com sessão iniciada como autor do anúncio ao guardar na base de dados.
- Moderação de testemunhos (aprovação de avaliações autênticas ou rejeição de spam).
- Impossibilidade de elevar privilégios para a função de Administrador.
4. Endpoints da API REST Headless
Endpoints JSON seguros para a aplicação móvel e ferramentas externas:
| Method |
Endpoint URL |
Finalidade |
Estrutura da Resposta JSON |
| GET |
/api/vehicules |
Obtenção do inventário completo de viaturas disponíveis |
JSON Array (JMS getVehicules group) |
| GET |
/api/vehiculesby?page={n} |
Coleção paginada de viaturas para carregamento progressivo |
{ data: [...], pagination: { ... } } |
| GET |
/api/vehicules/{id} |
Especificações e galeria de fotos de uma viatura por ID |
JSON Object (Véhicule, Galerie, Options) |
| GET |
/api/marques-modeles |
Estrutura hierárquica de marcas e modelos disponíveis |
[{ id, nom, modeles: [{ id, nom }] }] |
| POST |
/api/contact |
Envio de pedidos de contacto com notificação automática por e-mail |
{ status: "success" } (HTTP 201) |
5. Modelo de Dados & Relações Doctrine
Esquema relacional normalizado com integridade referencial em MySQL:
Entidade Viatura & Media
Relação OneToMany em cascata com VehiculeImage para suporte multifoto e ManyToMany com Employes.
Taxonomia Automóvel
Entidades normalizadas para Marque, Modele, Carburant (Gasolina, Gasóleo, Híbrido, Elétrico), Categorie e Type.
Operações & Contactos
Entidades para Service, Horaire, Temoignage (com estado de validação) e Contact.
6. Estratégia SEO & Desempenho
SEO Local & Marcação Semântica
Marcação Schema.org para AutoRepair e Product/Car, densidade de palavras-chave direcionada à área de Toulouse e URLs canónicos limpos.
Desempenho & Renderização Parcial
Renderização parcial em AJAX para minimizar o tráfego de dados na filtragem, entrega otimizada de imagens e proteção CSRF.