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:
make install_dependencies
Os Controllers
em conjunto com as Routes
permitem criar endpoints para diversas finalidades.
Como criar um novo controller
Crie uma nova classe em /src/Controller/Api/
, por exemplo, EventApiController.php
:
<?php
declare(strict_types=1);
namespace App\Controller\Api;
class EventApiController extends AbstractApiController
{
}
Crie seu(s) método(s) com a lógica de resposta.
Para gerar respostas em json, estamos utilizando a implementação da
JsonResponse
fornecida 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;
class EventApiController extends AbstractApiController
{
public function getList(): JsonResponse
{
$events = [
['id' => 1, 'name' => 'Palestra'],
['id' => 2, 'name' => 'Curso'],
];
return new JsonResponse($events);
}
}
ou
<?php
declare(strict_types=1);
namespace App\Controller\Web;
use Symfony\Component\HttpFoundation\Response;
class EventWebController extends AbstractWebController
{
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\Web\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-command
Você 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:load
Pronto, 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 /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
As enumerações são feitas seguindo o padrão implementado pelo php8.1, no entanto, tem algumas particularidades explanadas nesse documento.
DOCKER
Para iniciar todos os containers definidos no arquivo docker-compose.yml
:
docker-compose up -d
A flag -d
executa os containers em segundo plano (modo "detached").
Para parar e remover todos os containers definidos no docker-compose.yml
:
docker-compose down
Para listar todos os containers ativos:
docker ps
Para acessar o shell de um container em execução:
docker exec -it <ID_DO_CONTAINER> bash
Substitua <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:clear
Esse 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-style
Esse 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:router
Você 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