Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .php-cs-fixer.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
$finder = PhpCsFixer\Finder::create()
->files()
->name('*.php')
->in(__DIR__ . '/config')
->in(__DIR__ . '/src')
->in(__DIR__ . '/tests')
;
Expand Down
50 changes: 30 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,58 +96,64 @@ composer setup:dev

Collections are sortable, filterable paginated lists of models.

* [App\Collection][60]
* [App\Core\Collection][60]
* [App\Pet\Collection][61]

### Dto

A DTO, or Data Transfer Object, is a simple object used to transport data between software application components.

* [App\Dto][70]
* [App\Core\Dto][70]
* [App\Pet\Dto][71]

### Middleware

Middleware functions can execute code, make changes to the request and response objects.
Middleware can generally be added globally or on a per-route basis.

* [App\Middleware][80]
* [App\Core\Middleware][80]

### Model

Models, entities, documents what ever fits your purpose the best.

* [App\Model][90]
* [App\Core\Model][90]
* [App\Pet\Model][91]

### ORM

ORM Mapping definitions.

* [App\ORM][100]
* [App\Pet\Orm][100]

### Parsing

Parses and validates data against predefined schemas, ensuring that incoming data conforms to expected structures and criteria.

* [App\Parsing][110]
* [App\Core\Parsing][110]
* [App\Pet\Parsing][111]

### Repository

Repositories get data from storages like databases, elasticsearch, redis or whereever your models are stored or cached.

* [App\Repository][120]
* [App\Core\Repository][120]
* [App\Pet\Repository][121]

### RequestHandler

RequestHandler alias Controller, or Controller actions to be more precise.
There is a directory with generic crud controllers. If you like the idea adapt them for your generic use case, if not drop them.
I highly recommend to not extend them.

* [App\RequestHandler][130]
* [App\Core\RequestHandler][130]

### ServiceFactory

Service factories are the glue code of the dependeny injection container.

* [App\ServiceFactory][140]
* [App\Core\ServiceFactory][140]
* [App\Pet\ServiceFactory][141]

## Opensearch

Expand Down Expand Up @@ -215,22 +221,26 @@ curl -XPUT 'https://admin:98T722Eqw99oqFCSJCnB@localhost:9200/_plugins/_ism/poli
[16]: https://packagist.org/packages/symfony/console
[17]: https://packagist.org/packages/symfony/var-exporter

[40]: https://packagist.org/packages/chubbyphp/petstore
[60]: src/Core/Collection
[61]: src/Pet/Collection

[60]: src/Collection
[70]: src/Core/Dto
[71]: src/Pet/Dto

[70]: src/Dto
[80]: src/Core/Middleware

[80]: src/Middleware
[90]: src/Core/Model
[91]: src/Pet/Model

[90]: src/Model
[100]: src/Pet/Orm

[100]: src/Orm
[110]: src/Core/Parsing
[111]: src/Pet/Parsing

[110]: src/Parsing
[120]: src/Core/Repository
[121]: src/Pet/Repository

[120]: src/Repository
[130]: src/Core/RequestHandler

[130]: src/RequestHandler

[140]: src/ServiceFactory
[140]: src/Core/ServiceFactory
[141]: src/Pet/ServiceFactory
116 changes: 58 additions & 58 deletions config/prod.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,45 +2,45 @@

declare(strict_types=1);

use App\Middleware\ApiExceptionMiddleware;
use App\Middleware\ConvertHttpExceptionMiddleware;
use App\Model\Pet;
use App\Model\Vaccination;
use App\Orm\PetMapping;
use App\Orm\VaccinationMapping;
use App\Parsing\PetParsing;
use App\Repository\PetRepository;
use App\RequestHandler\Api\Crud\CreateRequestHandler;
use App\RequestHandler\Api\Crud\DeleteRequestHandler;
use App\RequestHandler\Api\Crud\ListRequestHandler;
use App\RequestHandler\Api\Crud\ReadRequestHandler;
use App\RequestHandler\Api\Crud\UpdateRequestHandler;
use App\RequestHandler\OpenapiRequestHandler;
use App\RequestHandler\PingRequestHandler;
use App\ServiceFactory\Command\CommandsFactory;
use App\ServiceFactory\DecodeEncode\TypeDecodersFactory;
use App\ServiceFactory\DecodeEncode\TypeEncodersFactory;
use App\ServiceFactory\Framework\CallableResolverFactory;
use App\ServiceFactory\Framework\InvocationStrategyFactory;
use App\ServiceFactory\Framework\RouteCollectorFactory;
use App\ServiceFactory\Framework\RouteParserFactory;
use App\ServiceFactory\Http\ResponseFactoryFactory;
use App\ServiceFactory\Http\StreamFactoryFactory;
use App\ServiceFactory\Logger\LoggerFactory;
use App\ServiceFactory\Middleware\ApiExceptionMiddlewareFactory;
use App\ServiceFactory\Middleware\ConvertHttpExceptionMiddlewareFactory;
use App\ServiceFactory\Negotiation\AcceptNegotiatorSupportedMediaTypesFactory;
use App\ServiceFactory\Negotiation\ContentTypeNegotiatorSupportedMediaTypesFactory;
use App\ServiceFactory\Parsing\ParserFactory;
use App\ServiceFactory\Parsing\PetParsingFactory;
use App\ServiceFactory\Repository\PetRepositoryFactory;
use App\ServiceFactory\RequestHandler\Api\Crud\PetCreateRequestHandlerFactory;
use App\ServiceFactory\RequestHandler\Api\Crud\PetDeleteRequestHandlerFactory;
use App\ServiceFactory\RequestHandler\Api\Crud\PetListRequestHandlerFactory;
use App\ServiceFactory\RequestHandler\Api\Crud\PetReadRequestHandlerFactory;
use App\ServiceFactory\RequestHandler\Api\Crud\PetUpdateRequestHandlerFactory;
use App\ServiceFactory\RequestHandler\OpenapiRequestHandlerFactory;
use App\ServiceFactory\RequestHandler\PingRequestHandlerFactory;
use App\Core\Middleware\ApiExceptionMiddleware;
use App\Core\Middleware\ConvertHttpExceptionMiddleware;
use App\Core\RequestHandler\Api\Crud\CreateRequestHandler;
use App\Core\RequestHandler\Api\Crud\DeleteRequestHandler;
use App\Core\RequestHandler\Api\Crud\ListRequestHandler;
use App\Core\RequestHandler\Api\Crud\ReadRequestHandler;
use App\Core\RequestHandler\Api\Crud\UpdateRequestHandler;
use App\Core\RequestHandler\OpenapiRequestHandler;
use App\Core\RequestHandler\PingRequestHandler;
use App\Core\ServiceFactory\Command\CommandsFactory;
use App\Core\ServiceFactory\DecodeEncode\TypeDecodersFactory;
use App\Core\ServiceFactory\DecodeEncode\TypeEncodersFactory;
use App\Core\ServiceFactory\Framework\CallableResolverFactory;
use App\Core\ServiceFactory\Framework\InvocationStrategyFactory;
use App\Core\ServiceFactory\Framework\RouteCollectorFactory;
use App\Core\ServiceFactory\Framework\RouteParserFactory;
use App\Core\ServiceFactory\Http\ResponseFactoryFactory;
use App\Core\ServiceFactory\Http\StreamFactoryFactory;
use App\Core\ServiceFactory\Logger\LoggerFactory;
use App\Core\ServiceFactory\Middleware\ApiExceptionMiddlewareFactory;
use App\Core\ServiceFactory\Middleware\ConvertHttpExceptionMiddlewareFactory;
use App\Core\ServiceFactory\Negotiation\AcceptNegotiatorSupportedMediaTypesFactory;
use App\Core\ServiceFactory\Negotiation\ContentTypeNegotiatorSupportedMediaTypesFactory;
use App\Core\ServiceFactory\Parsing\ParserFactory;
use App\Core\ServiceFactory\RequestHandler\OpenapiRequestHandlerFactory;
use App\Core\ServiceFactory\RequestHandler\PingRequestHandlerFactory;
use App\Pet\Model\Pet;
use App\Pet\Model\Vaccination;
use App\Pet\Orm\PetMapping;
use App\Pet\Orm\VaccinationMapping;
use App\Pet\Parsing\PetParsing;
use App\Pet\Repository\PetRepository;
use App\Pet\ServiceFactory\Parsing\PetParsingFactory;
use App\Pet\ServiceFactory\Repository\PetRepositoryFactory;
use App\Pet\ServiceFactory\RequestHandler\Api\Crud\PetCreateRequestHandlerFactory;
use App\Pet\ServiceFactory\RequestHandler\Api\Crud\PetDeleteRequestHandlerFactory;
use App\Pet\ServiceFactory\RequestHandler\Api\Crud\PetListRequestHandlerFactory;
use App\Pet\ServiceFactory\RequestHandler\Api\Crud\PetReadRequestHandlerFactory;
use App\Pet\ServiceFactory\RequestHandler\Api\Crud\PetUpdateRequestHandlerFactory;
use Chubbyphp\Cors\CorsMiddleware;
use Chubbyphp\Cors\ServiceFactory\CorsMiddlewareFactory;
use Chubbyphp\DecodeEncode\Decoder\DecoderInterface;
Expand All @@ -66,6 +66,7 @@
use Chubbyphp\Parsing\ParserInterface;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Tools\Console\ConnectionProvider;
use Doctrine\DBAL\Tools\DsnParser;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Tools\Console\EntityManagerProvider;
Expand All @@ -80,11 +81,10 @@
use Slim\Interfaces\RouteCollectorInterface;
use Slim\Interfaces\RouteParserInterface;
use Symfony\Component\Console\Command\Command;
use Doctrine\DBAL\Tools\DsnParser;

$rootDir = \realpath(__DIR__ . '/..');
$cacheDir = $rootDir . '/var/cache/' . $env;
$logDir = $rootDir . '/var/log';
$rootDir = realpath(__DIR__.'/..');
$cacheDir = $rootDir.'/var/cache/'.$env;
$logDir = $rootDir.'/var/log';

return [
'chubbyphp' => [
Expand All @@ -104,16 +104,16 @@
],
'factories' => [
AcceptMiddleware::class => AcceptMiddlewareFactory::class,
AcceptNegotiatorInterface::class . 'supportedMediaTypes[]' => AcceptNegotiatorSupportedMediaTypesFactory::class,
AcceptNegotiatorInterface::class.'supportedMediaTypes[]' => AcceptNegotiatorSupportedMediaTypesFactory::class,
AcceptNegotiatorInterface::class => AcceptNegotiatorFactory::class,
ApiExceptionMiddleware::class => ApiExceptionMiddlewareFactory::class,
CacheItemPoolInterface::class => ApcuAdapterFactory::class,
CallableResolverInterface::class => CallableResolverFactory::class,
Command::class . '[]' => CommandsFactory::class,
Command::class.'[]' => CommandsFactory::class,
Connection::class => ConnectionFactory::class,
ConnectionProvider::class => ContainerConnectionProviderFactory::class,
ContentTypeMiddleware::class => ContentTypeMiddlewareFactory::class,
ContentTypeNegotiatorInterface::class . 'supportedMediaTypes[]' => ContentTypeNegotiatorSupportedMediaTypesFactory::class,
ContentTypeNegotiatorInterface::class.'supportedMediaTypes[]' => ContentTypeNegotiatorSupportedMediaTypesFactory::class,
ContentTypeNegotiatorInterface::class => ContentTypeNegotiatorFactory::class,
ConvertHttpExceptionMiddleware::class => ConvertHttpExceptionMiddlewareFactory::class,
CorsMiddleware::class => CorsMiddlewareFactory::class,
Expand All @@ -126,11 +126,11 @@
MappingDriver::class => ClassMapDriverFactory::class,
OpenapiRequestHandler::class => OpenapiRequestHandlerFactory::class,
ParserInterface::class => ParserFactory::class,
Pet::class . CreateRequestHandler::class => PetCreateRequestHandlerFactory::class,
Pet::class . DeleteRequestHandler::class => PetDeleteRequestHandlerFactory::class,
Pet::class . ListRequestHandler::class => PetListRequestHandlerFactory::class,
Pet::class . ReadRequestHandler::class => PetReadRequestHandlerFactory::class,
Pet::class . UpdateRequestHandler::class => PetUpdateRequestHandlerFactory::class,
Pet::class.CreateRequestHandler::class => PetCreateRequestHandlerFactory::class,
Pet::class.DeleteRequestHandler::class => PetDeleteRequestHandlerFactory::class,
Pet::class.ListRequestHandler::class => PetListRequestHandlerFactory::class,
Pet::class.ReadRequestHandler::class => PetReadRequestHandlerFactory::class,
Pet::class.UpdateRequestHandler::class => PetUpdateRequestHandlerFactory::class,
PetParsing::class => PetParsingFactory::class,
PetRepository::class => PetRepositoryFactory::class,
PingRequestHandler::class => PingRequestHandlerFactory::class,
Expand All @@ -139,10 +139,10 @@
RouteParserInterface::class => RouteParserFactory::class,
StreamFactoryInterface::class => StreamFactoryFactory::class,
StreamFactoryInterface::class => StreamFactoryFactory::class,
TypeDecoderInterface::class . '[]' => TypeDecodersFactory::class,
TypeDecoderInterface::class . '[]' => TypeDecodersFactory::class,
TypeEncoderInterface::class . '[]' => TypeEncodersFactory::class,
TypeEncoderInterface::class . '[]' => TypeEncodersFactory::class,
TypeDecoderInterface::class.'[]' => TypeDecodersFactory::class,
TypeDecoderInterface::class.'[]' => TypeDecodersFactory::class,
TypeEncoderInterface::class.'[]' => TypeEncodersFactory::class,
TypeEncoderInterface::class.'[]' => TypeEncodersFactory::class,
],
],
'directories' => [
Expand All @@ -169,18 +169,18 @@
'orm' => [
'configuration' => [
'metadataDriverImpl' => MappingDriver::class,
'proxyDir' => $cacheDir . '/doctrine/orm/proxies',
'proxyDir' => $cacheDir.'/doctrine/orm/proxies',
'proxyNamespace' => 'DoctrineORMProxy',
'metadataCache' => CacheItemPoolInterface::class,
],
],
],
'fastroute' => [
'cache' => $cacheDir . '/router-cache.php',
'cache' => $cacheDir.'/router-cache.php',
],
'monolog' => [
'name' => 'petstore',
'path' => $logDir . '/application.log',
'path' => $logDir.'/application.log',
'level' => Level::Notice,
],
];
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

declare(strict_types=1);

namespace App\Collection;
namespace App\Core\Collection;

use App\Model\ModelInterface;
use App\Core\Model\ModelInterface;

abstract class AbstractCollection implements CollectionInterface
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

declare(strict_types=1);

namespace App\Collection;
namespace App\Core\Collection;

use App\Model\ModelInterface;
use App\Core\Model\ModelInterface;

interface CollectionInterface extends \JsonSerializable
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

declare(strict_types=1);

namespace App\Dto\Collection;
namespace App\Core\Dto\Collection;

use App\Dto\Model\ModelResponseInterface;
use App\Core\Dto\Model\ModelResponseInterface;

abstract class AbstractCollectionResponse implements CollectionResponseInterface
{
Expand Down Expand Up @@ -51,13 +51,13 @@ abstract class AbstractCollectionResponse implements CollectionResponseInterface
* ...
* }>,
* count: int,
* _type: string,
* _links: array<string, array{
* href: string,
* templated: bool,
* rel: array<string>,
* attributes: array<string, string>
* }>,
* _type: string
* }>
* }
*/
final public function jsonSerialize(): array
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace App\Dto\Collection;
namespace App\Core\Dto\Collection;

interface CollectionFiltersInterface extends \JsonSerializable
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@

declare(strict_types=1);

namespace App\Dto\Collection;
namespace App\Core\Dto\Collection;

use App\Collection\CollectionInterface;
use App\Core\Collection\CollectionInterface;

interface CollectionRequestInterface
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace App\Dto\Collection;
namespace App\Core\Dto\Collection;

interface CollectionResponseInterface extends \JsonSerializable
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

declare(strict_types=1);

namespace App\Dto\Collection;
namespace App\Core\Dto\Collection;

interface CollectionSortInterface extends \JsonSerializable
{
Expand Down
Loading