Skip to content
Open
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 .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.idea
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,28 @@

namespace CodelyTv\Application;

use CodelyTv\Debug;
use CodelyTv\Email\EmailNotifier;
use CodelyTv\FeatureFlags;
use CodelyTv\FeatureFlagsInmutable;
use CodelyTv\Flags;
use CodelyTv\Persistence\MySqlConnection;

final class Subscribe
{
public function __construct(private MySqlConnection $connection, private FeatureFlagsInmutable $featureFlags, private EmailNotifier $emailNotifier) {

}

public function __invoke(string $email, ?string $name = null): void
{
if (Debug::instance()->isDebugModeEnabled()) {
FeatureFlags::instance()->deactivateAll();
}

$flag = FeatureFlags::instance()->get(Flags::NEW_SUBSCRIPTION_PAGE_NAME);
$flag = $this->featureFlags->get(Flags::NEW_SUBSCRIPTION_PAGE_NAME);

if ($flag) {
// The new subscription added a "name" field
MySqlConnection::instance()->persist($email, $name);
$this->connection->persist($email, $name);
} else {
MySqlConnection::instance()->persist($email);
$this->connection->persist($email);
}

EmailNotifier::instance()->sendSubscriptionEmail($email);
$this->emailNotifier->sendSubscriptionEmail($email);
}
}
21 changes: 2 additions & 19 deletions examples/php/php-feature_flags-01_base/src/Debug.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,29 +6,12 @@

final class Debug
{
private static ?Debug $instance = null;

private bool $debugMode = false;

private function __construct()
{
}

public static function instance(): Debug
{
if (!self::$instance) {
self::$instance = new self();
}
return self::$instance;
}

public function enableDebugMode(): void
public function __construct(private bool $debugMode)
{
$this->debugMode = true;
}

public function isDebugModeEnabled(): bool
{
return $this->debugMode;
return $this->debugMode;
}
}
15 changes: 4 additions & 11 deletions examples/php/php-feature_flags-01_base/src/Email/EmailNotifier.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,17 @@

namespace CodelyTv\Email;

use CodelyTv\FeatureFlagsInmutable;

final class EmailNotifier
{
private static ?EmailNotifier $instance = null;

private function __construct()
{
}

public static function instance(): EmailNotifier
public function __construct(private FeatureFlagsInmutable $flags)
{
if (!self::$instance) {
self::$instance = new self();
}
return self::$instance;
}

public function sendSubscriptionEmail(string $to)
{
$flags = $this->flags;
echo "Email sent to $to";
require __DIR__ . '/subscription-email.php';
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<p>Message for all subscribers</p>

<?php if (\CodelyTv\FeatureFlags::instance()->get(\CodelyTv\Flags::NEW_SUBSCRIPTION_PAGE_NAME)): ?>
<?php
/** @var CodelyTv\FeatureFlagsInmutable $flags */
if ($flags->get(\CodelyTv\Flags::NEW_SUBSCRIPTION_PAGE_NAME)): ?>
<p>Additional message for subscribers with active flag</p>
<?php endif; ?>
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace CodelyTv;

class FeatureFlagsInmutable
{
public function __construct(private array $flags = [])
{
}

public function get(string $flagName): bool
{
if (!array_key_exists($flagName, $this->flags)) {
return false;
}

return $this->flags[$flagName];
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,20 @@

namespace CodelyTv\Persistence;

use CodelyTv\FeatureFlags;
use CodelyTv\FeatureFlagsInmutable;
use CodelyTv\Flags;

final class MySqlConnection
{
private static ?MySqlConnection $instance = null;

private function __construct()
public function __construct(private FeatureFlagsInmutable $flags)
{
}

public static function instance(): MySqlConnection
{
if (!self::$instance) {
self::$instance = new self();
}
return self::$instance;
}

public function persist(string $email, ?string $name = null): void
{
$subscription = ['email' => $email];

$flag = FeatureFlags::instance()->get(Flags::NEW_SUBSCRIPTION_PAGE_NAME);
$flag = $this->flags->get(Flags::NEW_SUBSCRIPTION_PAGE_NAME);
if ($flag) {
$subscription['name'] = $name;
}
Expand Down
33 changes: 27 additions & 6 deletions examples/php/php-feature_flags-01_base/src/SubscribeController.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,43 @@
namespace CodelyTv;

use CodelyTv\Application\Subscribe;
use CodelyTv\Email\EmailNotifier;
use CodelyTv\Persistence\MySqlConnection;
use Symfony\Component\HttpFoundation\Request;

final class SubscribeController
{
public function __invoke(Request $request)
public function __construct(private Debug $debug)
{
$flagHeader = $request->headers->get('X-FLAG');

if ($flagHeader === Flags::NEW_SUBSCRIPTION_PAGE_TOKEN) {
FeatureFlags::instance()->set('new_subscription_page', true);
}
}

public function __invoke(Request $request)
{
$flags = $this->getFeatures($request, $this->debug);
$subscribeUseCase = new Subscribe(
new MySqlConnection($flags),
$flags,
new EmailNotifier($flags)
);

$subscribeUseCase = new Subscribe();
$subscribeUseCase->__invoke(
$request->request->get('email'),
$request->request->get('name'),
);
}

private function getFeatures(Request $request, Debug $debug): FeatureFlagsInmutable
{
$result = new FeatureFlagsInmutable();
if ($debug->isDebugModeEnabled()) {
return $result;
}

$flagHeader = $request->headers->get('X-FLAG');
if ($flagHeader === Flags::NEW_SUBSCRIPTION_PAGE_TOKEN) {
return new FeatureFlagsInmutable(['new_subscription_page' => true]);
}
return $result;
}
}
4 changes: 2 additions & 2 deletions examples/php/php-feature_flags-01_base/src/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@
use CodelyTv\SubscribeController;
use Symfony\Component\HttpFoundation\Request;

Debug::instance()->enableDebugMode();
$debug = new Debug(true);

$request = Request::createFromGlobals();
$request->headers->set('X-FLAG', Flags::NEW_SUBSCRIPTION_PAGE_TOKEN);
$request->request->set('email', 'email@example.com');
$request->request->set('name', 'Codely');

$controller = new SubscribeController();
$controller = new SubscribeController($debug);
$controller->__invoke($request);