Skip to content

Instantly share code, notes, and snippets.

@webdevilopers
webdevilopers / AbstractControllerTest.php
Last active May 8, 2020
Functional Testing Symfony Controllers with JWT and Symfony Messenger
View AbstractControllerTest.php
<?php
namespace Tests\Acme\PersonnelManagement\Infrastructure\Symfony\AcmePersonnelManagementBundle\Controller;
use Lexik\Bundle\JWTAuthenticationBundle\Encoder\JWTEncoderInterface;
use Symfony\Bundle\FrameworkBundle\KernelBrowser;
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
abstract class AbstractControllerTest extends WebTestCase
{
@webdevilopers
webdevilopers / ErrorResponseBuilder.php
Last active Jul 30, 2021
API friendly error handling with Symfony Messenger and Event Listener
View ErrorResponseBuilder.php
<?php
namespace Acme\Common\Infrastructure\Symfony\Messenger;
use Prooph\EventStore\Exception\ConcurrencyException;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\Exception\HandlerFailedException;
use Symfony\Component\Messenger\Exception\RuntimeException;
use Symfony\Component\Messenger\Exception\ValidationFailedException;
@webdevilopers
webdevilopers / Deployment.php
Last active Mar 10, 2020
Domain-Driven Design - Creating aggregates and enforcing invariants spanning multiple aggregates
View Deployment.php
<?php
final class Deployment1
{
public static function with(DeploymentId $anId, EmploymentContractId $anEmploymentContractId,
DeploymentPeriod $aPeriod): Deployment
{
// No period range validation, final period was already validated and passed
}
}
@webdevilopers
webdevilopers / DefaultGridFSRepository.php
Last active Jan 18, 2020
Uploading Files with Metadata using MongoDB GridFS in a PHP Domain-Driven Design application
View DefaultGridFSRepository.php
<?php
class DefaultGridFSRepository extends DocumentRepository implements GridFSRepository
{
public function uploadFromStream(string $filename, $source, ?UploadOptions $uploadOptions = null)
{
$options = $this->prepareOptions($uploadOptions);
$databaseIdentifier = $this->getDocumentBucket()->uploadFromStream($filename, $source, $options);
$documentIdentifier = $this->class->getPHPIdentifierValue($databaseIdentifier);
@webdevilopers
webdevilopers / functions.php
Created Jan 11, 2020
How to convert PHP MongoDB BSON Binary to (L)UUID or ObjectId
View functions.php
<?php
use MongoDB\BSON\Binary;
use MongoDB\BSON\ObjectId;
function mongoBinaryToUuid(Binary $bin): string
{
$hex = bin2hex($bin->getData());
return substr($hex, 0, 32);
@webdevilopers
webdevilopers / MaterialQuantityDto.php
Created Nov 29, 2019
Dynamic form validation groups with callback in Symfony 2.8
View MaterialQuantityDto.php
<?php
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
class MaterialQuantityDto
{
/**
* @var string
* @Assert\NotNull(groups={"available_material"})
@webdevilopers
webdevilopers / JsonObject.php
Created Apr 15, 2019
UPDATE and INSERT statements with Doctrine DBAL and MySQL JSON type
View JsonObject.php
<?php
class JsonObject
{
/** @var string $result */
private $result;
private function __construct(string $result)
{
$this->result = $result;
@webdevilopers
webdevilopers / DoctrineGutterColorRepository.php
Last active Mar 10, 2019
Using Value Objects as Custom Doctrine DBAL Type as Identifier in Symfony
View DoctrineGutterColorRepository.php
<?php
namespace Sps\DormerCalculation\Infrastructure\Persistence\Doctrine;
use Doctrine\ORM\EntityRepository;
/**
* Class DoctrineGutterColorRepository
* @package Sps\DormerCalculation\Infrastructure\Persistence\Doctrine
*/
@webdevilopers
webdevilopers / DormerType.php
Created Feb 25, 2019
Using Entity as Factory for Value Object
View DormerType.php
<?php
abstract class DormerType implements DormerTypeInterface
{}
@webdevilopers
webdevilopers / OfferFactory_v1.php
Last active Feb 20, 2019
DDD Domain Service vs Domain Factory vs. Double Dispatch
View OfferFactory_v1.php
<?php
final class OfferFactory
{
/** @var ChargeRatesFactory $chargeRatesFactory */
private $chargeRatesFactory;
/** @var PricesCalculator $pricesCalculator */
private $pricesCalculator;