Skip to content

Commit 3cb0898

Browse files
authored
Merge pull request #18 from dotkernel/issue-16
Issue #16: Implemented core and sending email functionality
2 parents c56ae2b + f2b8e82 commit 3cb0898

91 files changed

Lines changed: 6061 additions & 51 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
require_once 'vendor/autoload.php';
6+
7+
const ENVIRONMENT_DEVELOPMENT = 'development';
8+
const ENVIRONMENT_PRODUCTION = 'production';
9+
10+
// phpcs:disable PSR1.Files.SideEffects.FoundWithSymbols
11+
12+
/**
13+
* @param array{source: string, destination: string, environment: array<string>} $file
14+
*/
15+
function copyFile(array $file): void
16+
{
17+
if (! in_array(getEnvironment(), $file['environment'])) {
18+
echo "Skipping the copy of {$file['source']} due to environment settings." . PHP_EOL;
19+
return;
20+
}
21+
22+
if (is_readable($file['destination'])) {
23+
echo "File {$file['destination']} already exists. Skipping..." . PHP_EOL;
24+
return;
25+
}
26+
27+
if (! copy($file['source'], $file['destination'])) {
28+
echo "Cannot copy {$file['source']} file to {$file['destination']}" . PHP_EOL;
29+
} else {
30+
echo "File {$file['source']} copied successfully to {$file['destination']}." . PHP_EOL;
31+
}
32+
}
33+
34+
function getEnvironment(): string
35+
{
36+
return getenv('COMPOSER_DEV_MODE') === '1' ? ENVIRONMENT_DEVELOPMENT : ENVIRONMENT_PRODUCTION;
37+
}
38+
39+
/**
40+
* When adding files to the below array:
41+
* - `source` and `destination` paths must be relative to the project root folder
42+
* - `environment` key will indicate on what environments the file will be copied
43+
*/
44+
$files = [
45+
[
46+
'source' => 'config/autoload/local.php.dist',
47+
'destination' => 'config/autoload/local.php',
48+
'environment' => [ENVIRONMENT_DEVELOPMENT, ENVIRONMENT_PRODUCTION],
49+
],
50+
[
51+
'source' => 'vendor/dotkernel/dot-mail/config/mail.global.php.dist',
52+
'destination' => 'config/autoload/mail.global.php',
53+
'environment' => [ENVIRONMENT_DEVELOPMENT, ENVIRONMENT_PRODUCTION],
54+
],
55+
];
56+
57+
echo "Using environment setting: " . getEnvironment() . PHP_EOL;
58+
59+
array_walk($files, 'copyFile');

composer.json

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,23 @@
4444
},
4545
"require": {
4646
"php": "~8.2.0 || ~8.3.0 || ~8.4",
47+
"ext-sockets": "*",
48+
"clue/socket-raw": "^v1.6.0",
49+
"dotkernel/dot-cache": "^4.3",
4750
"dotkernel/dot-cli": "^3.9",
48-
"dotkernel/dot-errorhandler": "^4.2.1",
51+
"dotkernel/dot-data-fixtures": "^1.4.0",
52+
"dotkernel/dot-dependency-injection": "^1.2",
53+
"dotkernel/dot-log": "4.0.4",
54+
"dotkernel/dot-mail": "^5.3.0",
55+
"dotkernel/dot-twigrenderer": "3.6.0",
4956
"laminas/laminas-component-installer": "^3.5",
5057
"laminas/laminas-config-aggregator": "^1.18",
5158
"mezzio/mezzio": "^3.20",
59+
"mezzio/mezzio-authentication-oauth2": "^2.11",
5260
"netglue/laminas-messenger": "^2.3.0",
61+
"ramsey/uuid": "^4.5.0",
62+
"ramsey/uuid-doctrine": "^2.1.0",
63+
"roave/psr-container-doctrine": "^5.2.2",
5364
"symfony/redis-messenger": "^v7.2.3"
5465
},
5566
"require-dev": {
@@ -63,7 +74,12 @@
6374
},
6475
"autoload": {
6576
"psr-4": {
66-
"Queue\\": "src/"
77+
"Queue\\": "src/",
78+
"Core\\Admin\\": "src/Core/src/Admin/src",
79+
"Core\\App\\": "src/Core/src/App/src",
80+
"Core\\Security\\": "src/Core/src/Security/src",
81+
"Core\\Setting\\": "src/Core/src/Setting/src",
82+
"Core\\User\\": "src/Core/src/User/src"
6783
}
6884
},
6985
"autoload-dev": {
@@ -72,6 +88,9 @@
7288
}
7389
},
7490
"scripts": {
91+
"post-update-cmd": [
92+
"php bin/composer-post-install-script.php"
93+
],
7594
"check": [
7695
"@cs-check",
7796
"@test",

config/autoload/local.php.dist

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,41 @@
99

1010
declare(strict_types=1);
1111

12+
$baseUrl = 'http://localhost:8080';
13+
14+
$databases = [
15+
'default' => [
16+
'host' => 'localhost',
17+
'dbname' => 'dotkernel',
18+
'user' => '',
19+
'password' => '',
20+
'port' => 3306,
21+
'driver' => 'pdo_mysql',
22+
'charset' => 'utf8mb4',
23+
'collate' => 'utf8mb4_general_ci',
24+
],
25+
// you can add more database connections into this array
26+
];
27+
1228
return [
29+
'application' => [
30+
'name' => $app['name'] ?? '',
31+
'url' => $baseUrl,
32+
],
33+
'databases' => $databases,
34+
'doctrine' => [
35+
'connection' => [
36+
'orm_default' => [
37+
'params' => $databases['default'],
38+
],
39+
],
40+
],
41+
'notification' => [
42+
'server' => [
43+
'protocol' => '',
44+
'host' => '',
45+
'port' => '',
46+
'eof' => "\n",
47+
],
48+
],
1349
];

config/autoload/log.local.php.dist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,4 @@ return [
2222
]
2323
],
2424
],
25-
];
25+
];
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Dot\Twig\Extension\DateExtension;
6+
use Dot\Twig\Extension\TranslationExtension;
7+
use Laminas\ServiceManager\Factory\InvokableFactory;
8+
use Mezzio\Template\TemplateRendererInterface;
9+
use Mezzio\Twig\TwigEnvironmentFactory;
10+
use Mezzio\Twig\TwigRendererFactory;
11+
use Twig\Environment;
12+
13+
return [
14+
'dependencies' => [
15+
'factories' => [
16+
DateExtension::class => InvokableFactory::class,
17+
Environment::class => TwigEnvironmentFactory::class,
18+
TemplateRendererInterface::class => TwigRendererFactory::class,
19+
TranslationExtension::class => InvokableFactory::class,
20+
],
21+
],
22+
'debug' => false,
23+
'templates' => [
24+
'extension' => 'html.twig',
25+
],
26+
'twig' => [
27+
'assets_url' => '/',
28+
'assets_version' => null,
29+
'auto_reload' => true,
30+
'autoescape' => 'html',
31+
'cache_dir' => 'data/cache/twig',
32+
'extensions' => [
33+
DateExtension::class,
34+
TranslationExtension::class,
35+
],
36+
'globals' => [
37+
'appName' => $app['name'] ?? '',
38+
],
39+
'optimizations' => -1,
40+
'runtime_loaders' => [],
41+
// 'timezone' => '',
42+
],
43+
];

config/config.php

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,29 @@
1515
$aggregator = new ConfigAggregator([
1616
// Include cache configuration
1717
new ArrayProvider($cacheConfig),
18-
\Mezzio\ConfigProvider::class,
19-
\Dot\ErrorHandler\ConfigProvider::class,
20-
\Dot\Log\ConfigProvider::class,
21-
\Dot\Cli\ConfigProvider::class,
22-
\Netglue\PsrContainer\Messenger\ConfigProvider::class,
18+
Mezzio\ConfigProvider::class,
19+
Mezzio\Twig\ConfigProvider::class,
20+
Netglue\PsrContainer\Messenger\ConfigProvider::class,
2321

2422
// Default App module config
25-
\Queue\App\ConfigProvider::class,
26-
\Queue\Swoole\ConfigProvider::class,
23+
Queue\App\ConfigProvider::class,
24+
Queue\Swoole\ConfigProvider::class,
25+
26+
// Dotkernel packages
27+
Dot\Log\ConfigProvider::class,
28+
Dot\Cli\ConfigProvider::class,
29+
Dot\DataFixtures\ConfigProvider::class,
30+
Dot\DependencyInjection\ConfigProvider::class,
31+
Dot\Mail\ConfigProvider::class,
32+
Dot\Twig\ConfigProvider::class,
33+
Dot\Cache\ConfigProvider::class,
34+
35+
// Core modules
36+
Core\Admin\ConfigProvider::class,
37+
Core\App\ConfigProvider::class,
38+
Core\Security\ConfigProvider::class,
39+
Core\Setting\ConfigProvider::class,
40+
Core\User\ConfigProvider::class,
2741

2842
// Load application config in a pre-defined order in such a way that local settings
2943
// overwrite global settings. (Loaded as first to last):

config/pipeline.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
declare(strict_types=1);
44

5-
use Dot\ErrorHandler\ErrorHandlerInterface;
65
use Mezzio\Application;
76
use Mezzio\MiddlewareFactory;
87
use Psr\Container\ContainerInterface;
@@ -14,7 +13,6 @@
1413
return function (Application $app, MiddlewareFactory $factory, ContainerInterface $container): void {
1514
// The error handler should be the first (most outer) middleware to catch
1615
// all Exceptions.
17-
$app->pipe(ErrorHandlerInterface::class);
1816

1917
// Pipe more middleware here that you want to execute on every request:
2018
// - bootstrapping

phpcs.xml.dist renamed to phpcs.xml

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,10 @@
1919
<exclude-pattern>config/routes.php</exclude-pattern>
2020

2121
<!-- Include all rules from the Laminas Coding Standard -->
22-
<rule ref="LaminasCodingStandard"/>
23-
24-
<rule ref="Squiz.Classes.ClassFileName.NoMatch">
25-
<exclude-pattern>src/ConfigProvider.*.php</exclude-pattern>
26-
</rule>
27-
28-
<rule ref="PSR12.Files.FileHeader.IncorrectOrder">
22+
<rule ref="LaminasCodingStandard">
23+
<!-- Exclude rule -->
24+
<exclude name="SlevomatCodingStandard.Namespaces.ReferenceUsedNamesOnly.ReferenceViaFullyQualifiedName" />
25+
<exclude-pattern>src/Core/src/App/src/Migration/*</exclude-pattern>
2926
<exclude-pattern>config/pipeline.php</exclude-pattern>
30-
<exclude-pattern>src/MezzioInstaller/Resources/config/routes-*.php</exclude-pattern>
3127
</rule>
3228
</ruleset>

phpstan.neon

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,3 @@ parameters:
77
- src
88
- test
99
treatPhpDocTypesAsCertain: false
10-
ignoreErrors:
11-
- '#Constant Queue\\Swoole\\Command\\StartCommand::PROGRAMMATIC_CONFIG_FILES is unused#'

src/App/ConfigProvider.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44

55
namespace Queue\App;
66

7+
use Dot\DependencyInjection\Factory\AttributedServiceFactory;
78
use Netglue\PsrContainer\Messenger\Container\MessageBusStaticFactory;
89
use Netglue\PsrContainer\Messenger\Container\Middleware\BusNameStampMiddlewareStaticFactory;
910
use Netglue\PsrContainer\Messenger\Container\Middleware\MessageHandlerMiddlewareStaticFactory;
1011
use Netglue\PsrContainer\Messenger\Container\Middleware\MessageSenderMiddlewareStaticFactory;
1112
use Netglue\PsrContainer\Messenger\HandlerLocator\OneToManyFqcnContainerHandlerLocator;
1213
use Queue\App\Message\ExampleMessage;
1314
use Queue\App\Message\ExampleMessageHandler;
14-
use Queue\App\Message\ExampleMessageHandlerFactory;
1515
use Symfony\Component\Messenger\MessageBusInterface;
1616

1717
class ConfigProvider
@@ -25,6 +25,7 @@ public function __invoke(): array
2525
'buses' => $this->busConfig(),
2626
],
2727
],
28+
'templates' => $this->getTemplates(),
2829
];
2930
}
3031

@@ -36,14 +37,23 @@ private function getDependencies(): array
3637
"message_bus_stamp_middleware" => [BusNameStampMiddlewareStaticFactory::class, "message_bus"],
3738
"message_bus_sender_middleware" => [MessageSenderMiddlewareStaticFactory::class, "message_bus"],
3839
"message_bus_handler_middleware" => [MessageHandlerMiddlewareStaticFactory::class, "message_bus"],
39-
ExampleMessageHandler::class => ExampleMessageHandlerFactory::class,
40+
ExampleMessageHandler::class => AttributedServiceFactory::class,
4041
],
4142
"aliases" => [
4243
MessageBusInterface::class => "message_bus",
4344
],
4445
];
4546
}
4647

48+
public function getTemplates(): array
49+
{
50+
return [
51+
'paths' => [
52+
'notification-email' => [__DIR__ . '/templates'],
53+
],
54+
];
55+
}
56+
4757
private function busConfig(): array
4858
{
4959
return [

0 commit comments

Comments
 (0)