Essa é a documentação das decisões técnicas, voltada para desenvolvedores e/ou entusiastas do código.
Acesso Rápido
Instalação dos Pacotes
Controller
Repository
Command
Data Fixtures
Testes
Console
Para instalar as dependências e atualizar o autoload, entre no container da aplicação e execute:
composer installOs Controllers em conjunto com as Routes permitem criar endpoints para diversas finalidades.
Como criar um novo controller
Crie uma nova classe em /app/Controller/Api/, por exemplo, EventApiController.php:
<?php
declare(strict_types=1);
namespace App\Controller\Api;
class EventApiController
{
}Crie seu(s) método(s) com a lógica de resposta.
Para gerar respostas em json, estamos utilizando a implementação da
JsonResponsefornecida pelo pacote do Symfony: Para gerar respostas em HTML, estamos utilizando a implementação daResponse(Twig) fornecida pelo pacote do Symfony:
<?php
declare(strict_types=1);
namespace App\Controller\Api;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
class EventApiController
{
public function getList(): JsonResponse
{
$events = [
['id' => 1, 'name' => 'Palestra'],
['id' => 2, 'name' => 'Curso'],
];
return new JsonResponse($events);
}
public function getList(): Response
{
$events = [
['id' => 1, 'name' => 'Palestra'],
['id' => 2, 'name' => 'Curso'],
];
return $this->render('view.html.twig', $events);
}
}Acesse os arquivos das rotas em /config/routes lá nós estamos separando as rotas em API e Web
get:
path: /example
controller: App\Controller\Admin\ExampleAdminController::action
methods: ['GET']Atente-se para seguir o padrão, um arquivo .yaml por controller
Feito isso, seu endpoint deverá estar disponível em: http://localhost:8080/o-que-voce-definiu-como-path
E deve estar retornando um JSON ou uma página web, dependendo da action que você criou.
A camada responsável pela comunicação entre nosso código e o banco de dados.
Como criar um novo repository
Siga o passo a passo a seguir:
<?php
declare(strict_types=1);
namespace App\Repository;
class MyRepository extends AbstractRepository
{
}use Doctrine\Persistence\ManagerRegistry;
use App\Entity\MyEntity;
...
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, MyEntity::class);
}Migrations são a forma (correta) de fazer um versionamento do banco de dados, nesta parte da aplicação isso é fornecido pela biblioteca doctrine/migrations mas no core do Aurora isso ainda é feito por uma decisão técnica interna chamada db-updates.php
Como criar uma nova migration
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
final class Version20241231235959 extends AbstractMigration
{
public function up(Schema $schema): void
{
//$this->addSql('CREATE TABLE ...');
}
public function down(Schema $schema): void
{
//$this->addSql('DROP TABLE ...');
}
}Note que o nome da classe deve informar o momento de sua criação, para que seja mantida uma sequência temporal da evolução do esquema do banco de dados.
Documentação oficial das migrations do Doctrine: https://www.doctrine-project.org/projects/doctrine-migrations/en/3.8/reference/generating-migrations.html
Atualmente o Doctrine não fornece suporte para migrations em bancos de dados não relacionais, no entanto, foi criada uma estrutura simples para que esse gerenciamento seja exercido.
Como criar uma nova migration
<?php
declare(strict_types=1);
namespace DoctrineMigrationsOdm;
use Doctrine\ODM\MongoDB\DocumentManager;
final class Version20241231235959
{
public function up(DocumentManager $dm): void
{
// TODO: Implement the migration
// Example:
// \$dm->getDocumentCollection(YourDocument::class)->updateMany(
// ['field' => 'value'],
// ['\$set' => ['newField' => 'newValue']]
// );
}
public function down(DocumentManager $dm): void
{
// TODO: Implement the rollback
// Example:
// \$dm->getDocumentCollection(YourDocument::class)->updateMany(
// ['field' => 'value'],
// ['\$unset' => ['newField' => '']]
// );
}
} Note que o nome da classe deve informar o momento de sua criação, para que seja mantida uma sequência temporal da evolução do esquema do banco de dados.
É recomendado gerar utilizado o comando
app:mongo:migrations:generate
Comandos são entradas via CLI (linha de comando) que permitem automatizar alguns processos, como rodar testes, verificar estilo de código, e debugar rotas
Como criar um novo console command
<?php
namespace App\Command;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class MyCommand extends Command
{
protected static string $defaultName = 'app:my-command';
protected function execute(InputInterface $input, OutputInterface $output): int
{
$output->writeln('Hello World!');
return Command::SUCCESS;
}
} Entre no container da aplicação PHP e execute isso
php bin/console app:my-commandVocê deverá ver na tela o texto Hello World!
Para criar e gerenciar os nossos commands estamos utilizando o pacote symfony/console, para ver sua documentação acesse:
Saiba mais em https://symfony.com/doc/current/console.html
Para ver outros console commands da aplicação acesse a seção Console Commands
Data Fixtures são dados falsos, normalmente criados para testar a aplicação, algumas vezes são chamados de "Seeders".
Como criar uma DataFixture para uma Entidade
<?php
namespace App\DataFixtures;
use Doctrine\Persistence\ObjectManager;
use MapasCulturais\Entities\Agent;
class AgentFixtures extends Fixture
{
public function load(ObjectManager $manager): void
{
$agent = new Agent();
$agent->name = 'Agente Teste da Silva';
$manager->persist($agent);
$manager->flush();
}
} Entre no container da aplicação PHP e execute isso
php bin/console doctrine:fixtures:loadPronto, você deverá ter um novo Agente criado de acordo com a sua Fixture.
Saiba mais sobre DataFixtures em https://www.doctrine-project.org/projects/doctrine-data-fixtures/en/1.7/index.html
Estamos utilizando o PHPUnit para criar e gerenciar os testes automatizados, focando principalmente nos testes funcionais, ao invés dos testes unitários.
Documentação do PHPUnit: https://phpunit.de/index.html
Como criar um novo teste
Para criar um novo cenário de teste funcional, basta adicionar sua nova classe no diretório /app/tests/functional/, com o seguinte código:
<?php
namespace App\Tests\Functional;
class MeuTest extends AbstractTestCase
{
}Adicione dentro da classe os cenários que você precisa garantir que funcionem, caso precise imprimir algo na tela para "debugar", utilize o método dump() fornecido pela classe AbstractTestCase:
public function testIfOneIsOne(): void
{
$list = ['Mar', 'Minino'];
$this->dump($list); // equivalente ao print_r
$this->assertEquals(
'MarMinino',
implode('', $list)
);
}Para executar os testes veja a seção Console Commands
Atualmente, o projeto faz o uso dos próprios artifícios do Symfony para gerenciar os eventos, incluindo os dois tipos descritos a seguir.
Para saber mais sobre o assunto basta acessar a documentação.
O symfony oferece uma explicação especial para o relacionamento com os eventos do Doctrine, basta acessar aqui.
Utilizados principalmente quando queremos reagir de forma específica a um evento fixo.
Utilizado quando queremos escutar um conjunto de eventos.
A injeção de dependência já acontece automaticamente pela própria estrutura do Symfony
DOCKER
Para iniciar todos os containers definidos no arquivo docker-compose.yml:
docker-compose up -dA flag -d executa os containers em segundo plano (modo "detached").
Para parar e remover todos os containers definidos no docker-compose.yml:
docker-compose downPara listar todos os containers ativos:
docker psPara acessar o shell de um container em execução:
docker exec -it <ID_DO_CONTAINER> bashSubstitua <ID_DO_CONTAINER> pelo ID do container, que você pode obter com o comando docker ps.
CACHE CLEAR
Para executar o comando de limpar cache basta entrar no container PHP e executar o seguinte comando:
php bin/console cache:clearEsse comando remove o cache gerado pelo Symfony, útil para garantir que as alterações sejam refletidas.
COMMAND SQL
Para executar um comando SQL basta entrar no container PHP e executar o seguinte comando:
php bin/console doctrine:query:sql {"SEU_COMANDO_SQL"}Substitua "SEU_COMANDO_SQL" pelo comando SQL desejado.
TESTES AUTOMATIZADOS
Para rodar os testes da aplicação, acesse o container PHP e execute:
php bin/phpunit {path}O parâmetro path é opcional e se refere ao diretório ou arquivo específico que você deseja testar. O caminho padrão é /tests.
STYLE CODE
Para rodar o PHP-CS-FIXER e garantir que o código siga os padrões de estilo definidos, execute:
php bin/console app:code-styleEsse comando aplica correções de estilo e formatação no código da aplicação.
ROUTER DEBUG
Para listar todas as rotas registradas na aplicação, entre no container PHP e execute:
php bin/console debug:routerVocê também pode usar as flags opcionais --show-actions e --show-controllers para obter mais detalhes sobre as rotas e seus controladores.
DOCTRINE
Para listas todos os comandos disponiveis para gerenciamento do banco de dados através do doctrine basta entrar no container PHP e executar
php bin/doctrine
- Remover o banco de dados:
php bin/console doctrine:database:drop --force
- Criar o banco de dados:
php bin/console doctrine:database:create
- Gerar uma nova migration com base em alterações no código:
php bin/console doctrine:migrations:diff
- Executar as migrations para aplicar as alterações no banco:
php bin/console doctrine:migrations:migrate
- Gerar uma nova migration com base em alterações no código:
php bin/console app:mongo:migrations:generate
- Executar as migrations para aplicar as alterações no banco:
php bin/console app:mongo:migrations:execute
-
Carregar fixtures (dados de teste) no banco de dados relacional:
php bin/console doctrine:fixtures:load
-
Carregar fixtures (dados de teste) no banco de dados não relacional:
php bin/console doctrine:mongodb:fixtures:load