Skip to content

Commit

Permalink
feat:event notify
Browse files Browse the repository at this point in the history
  • Loading branch information
RickWu1 committed Mar 19, 2024
1 parent f710c3e commit 9af9a23
Show file tree
Hide file tree
Showing 15 changed files with 237 additions and 3 deletions.
8 changes: 8 additions & 0 deletions src/CancelCourseEvent.php
@@ -0,0 +1,8 @@
<?php

namespace App;

class CancelCourseEvent extends Event
{

}
12 changes: 12 additions & 0 deletions src/Email.php
@@ -0,0 +1,12 @@
<?php

namespace App;


class Email extends Notifychannel
{
public function notify(string $message)
{
echo '[Email]' . $message . PHP_EOL;
}
}
24 changes: 24 additions & 0 deletions src/Event.php
@@ -0,0 +1,24 @@
<?php

namespace App;

class Event
{
// /**
// * @var NotifyChannel[]
// */
private $notifyChannels;

public function __construct(array $notifyChannels)
{
$this->notifyChannels = $notifyChannels;
}

public function dispatch(User $user)
{
foreach ($this->notifyChannels as $notifyChannel) {
$message = $user->getLanguage()->getContent(get_called_class());
$notifyChannel->notify($message);
}
}
}
2 changes: 1 addition & 1 deletion src/HelloWorld.php
Expand Up @@ -6,6 +6,6 @@ class HelloWorld
{
public function say()
{
return 'Hello, world';
return 'Hello, 123';
}
}
8 changes: 8 additions & 0 deletions src/Language.php
@@ -0,0 +1,8 @@
<?php

namespace App;

abstract class Language
{
public abstract function getContent($eventName): string;
}
22 changes: 22 additions & 0 deletions src/LanguageENUS.php
@@ -0,0 +1,22 @@
<?php

namespace App;

use App\Language;
use App\CancelCourseEvent;
use App\ReserveClassEvent;
use App\RegisterSuccessEvent;

class LanguageENUS extends Language
{
public function getContent($eventName): string
{
$map = [
RegisterSuccessEvent::class => 'register success',
ReserveClassEvent::class => 'reserve class',
CancelCourseEvent::class => 'cancel class',
];

return $map[$eventName];
}
}
23 changes: 23 additions & 0 deletions src/LanguageZHTW.php
@@ -0,0 +1,23 @@
<?php

namespace App;

use App\Language;
use App\CancelCourseEvent;
use App\ReserveClassEvent;
use App\RegisterSuccessEvent;

class LanguageZHTW extends Language
{
public function getContent($eventName): string
{
$map = [
RegisterSuccessEvent::class => '註冊成功',
ReserveClassEvent::class => '預約課程',
CancelCourseEvent::class => '取消課程',
];

return $map[$eventName];
}
}

8 changes: 8 additions & 0 deletions src/Notifychannel.php
@@ -0,0 +1,8 @@
<?php

namespace App;

abstract class NotifyChannel
{
public abstract function notify(string $message);
}
8 changes: 8 additions & 0 deletions src/RegisterSuccessEvent.php
@@ -0,0 +1,8 @@
<?php

namespace App;

class RegisterSuccessEvent extends Event
{

}
8 changes: 8 additions & 0 deletions src/ReserveClassEvent.php
@@ -0,0 +1,8 @@
<?php

namespace App;

class ReserveClassEvent extends Event
{

}
11 changes: 11 additions & 0 deletions src/Sms.php
@@ -0,0 +1,11 @@
<?php

namespace App;

class Sms extends NotifyChannel
{
public function notify(string $message)
{
echo '[SMS]' . $message . PHP_EOL;
}
}
16 changes: 16 additions & 0 deletions src/Student.php
@@ -0,0 +1,16 @@
<?php

namespace App;

class Student extends User
{
public function reserve()
{

}

public function cancel()
{

}
}
11 changes: 11 additions & 0 deletions src/Telegram.php
@@ -0,0 +1,11 @@
<?php

namespace App;

class Telegram extends NotifyChannel
{
public function notify(string $message)
{
echo '[Telegram]' . $message . PHP_EOL;
}
}
43 changes: 43 additions & 0 deletions src/User.php
@@ -0,0 +1,43 @@
<?php

namespace App;

use App\Sms;
use App\Email;
use App\Language;
use App\RegisterSuccessEvent;

class User
{
protected $language;

public function __construct(Language $language)
{
$this->language = $language;
}

public function getLanguage()
{
return $this->language;
}

public function register()
{
$notifyChannels = [new Email(), new Sms()];
$event = new RegisterSuccessEvent($notifyChannels);
$event->dispatch($this);
}

public function cancel()
{
$notifyChannels = [new Email(), new Telegram()];
$event = new CancelCourseEvent($notifyChannels);
$event->dispatch($this);
}
public function reserve()
{
$notifyChannels = [new Email(), new Telegram()];
$event = new ReserveClassEvent($notifyChannels);
$event->dispatch($this);
}
}
36 changes: 34 additions & 2 deletions src/index.php
Expand Up @@ -2,6 +2,38 @@
require_once 'vendor/autoload.php';

use App\HelloWorld;
use App\LanguageENUS;
use App\LanguageZHTW;
use App\User;

$helloWorld = new HelloWorld();
echo $helloWorld->say();
// $helloWorld = new HelloWorld();
// echo $helloWorld->say();
// $helloWorld = new HelloWorld();
// echo $helloWorld->say();


$rick = new User(new LanguageENUS());
$morty = new User(new LanguageZHTW());

// // 註冊成功: email & sms
// // [email] register success
// // [sms] register success
$rick->register();

// // [email] 註冊成功
// // [sms] 註冊成功
$morty->register();


// 學生預約課程: email & telegram
// [email] reserve class
// [telegram] reserve class
$rick->reserve();

// [email] 學生預約課程
// [telegram] 學生預約課程
$morty->reserve();

// 學生取消課程: email & telegram
$rick->cancel();
$morty->cancel();

0 comments on commit 9af9a23

Please sign in to comment.