Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat:event notify #2

Merged
merged 1 commit into from Mar 19, 2024
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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();