Steve McConnellã«ãããPerfect Codeããšããæ¬ã¯ãéçºè ãçŽé¢ããäž»ãªèª²é¡ã¯ã³ãŒãã®è€éãã管çããããšã§ãããšããæããå²åŠçã¢ã€ãã¢ã説æããŠããŸãã è€éãã管çãã1ã€ã®æ¹æ³ã¯ãå解ã§ãã å®éã«ã¯ã倧ããªã³ãŒããããåçŽãªã³ãŒããšå°ããªã³ãŒãã«åå²ããæ¹æ³ã«ã€ããŠèª¬æããŸãã
ã¢ãžã¥ãŒã«
Zend Frameworkã§ã¯ãã³ãŒããã¢ãžã¥ãŒã«ã«åå²ã§ããŸã ã è»èŒªã®åçºæãããããã¬ãŒã ã¯ãŒã¯ã«æ²¿ã£ãŠé²ãããã«ãZend Frameworkã®èŠ³ç¹ãããããžã§ã¯ããè«ççã«ã¢ãžã¥ãŒã«ã«åå²ãããéšåãèš±å¯ããŸãã ã¢ãžã¥ãŒã«éçžäºäœçšãæçµçã«æ±ºå®ããã®ã¯ ãåã¢ãžã¥ãŒã«ãããããã®è²¬ä»»ç¯å²ã§ã®ã¿æ©èœããä»ã®ã¢ãžã¥ãŒã«ã«ã€ããŠã¯äœãç¥ããªãããã«ããããã§ãã
åã¢ãžã¥ãŒã«ã¯ã ã³ã³ãããŒã©ãŒãã€ãã³ããªã¹ããŒãã€ãã³ããã³ãã©ãŒãã³ãã³ããã³ãã©ãŒããµãŒãã¹ãã³ãã³ããã€ãã³ãããã£ã«ã¿ãŒããšã³ãã£ãã£ãããã³ãªããžããªãŒãšããå žåçãªç®çãæã€äžé£ã®ã¯ã©ã¹ã§æ§æãããŠããŸã ã ãããã®ã¿ã€ãã®ã¯ã©ã¹ã¯ãã¹ãŠãç¹å®ã®éå±€ã«ç·šæãããäžäœå±€ã¯äžäœå±€ãèªèããŸãããäžäœå±€ã¯äžäœå±€ã«ã€ããŠäœãèªèããŸããïŒãããéå±€åã¢ãŒããã¯ãã£ãåãã§ãïŒã
è«çéå±€ã®æäžéšã«ã¯ã ã³ã³ãããŒã©ãŒãšã€ãã³ããªã¹ããŒããããŸãã åè ã¯http-requestsã®åœ¢åŒã§ãŠãŒã¶ãŒããã³ãã³ããåãåããåŸè ã¯ä»ã®ã¢ãžã¥ãŒã«ã®ã€ãã³ãã«å¿çããŸãã
ã³ã³ãããŒã©ãŒã®ãã¹ãŠã¯æ確ã§ããããã¯ããã¬ãŒã ã¯ãŒã¯ã«ãã£ãŠæäŸãããæšæºã®æšæºMVCã³ã³ãããŒã©ãŒã§ãã ã€ãã³ãã®ãªã¹ããŒã§ããããããã¹ãŠã®ã¢ãžã¥ãŒã«ã«1ã€äœæããããšã«ããŸããã ãªã¹ããŒã¢ã°ãªã²ãŒã¿ãŒZend \ EventManager \ ListenerAggregateInterfaceã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããã€ãã³ããã³ãã©ãŒãã€ãã³ãã«ãã€ã³ãããåã¢ãžã¥ãŒã«ã®æ§æãã説æãååŸããŸãã
ãªã¹ããŒã³ãŒã
class ListenerAggregator implements ListenerAggregateInterface { /** * @var array */ protected $eventsMap; /** * @var ContainerInterface */ private $container; /** * Attach one or more listeners * * Implementors may add an optional $priority argument; the EventManager * implementation will pass this to the aggregate. * * @param EventManagerInterface $events * * @param int $priority */ public function attach(EventManagerInterface $events, $priority = 1) { $events->addIdentifiers([Event::DOMAIN_LOGIC_EVENTS_IDENTIFIER]); $map = $this->getEventsMap(); $container = $this->container; foreach ($map as $eventClass => $handlers) { foreach ($handlers as $handlerClass) { $events->getSharedManager()->attach(Event::EVENTS_IDENTIFIER, $eventClass, function ($event) use ($container, $handlerClass) { /* @var $handler EventHandlerInterface */ $handler = $container->get($handlerClass); $handler->handle($event); } ); } } } }
次ã«ãåã¢ãžã¥ãŒã«ã§ããã®ã¢ãžã¥ãŒã«ã®ãªã¹ããŒããµãã¹ã¯ã©ã€ãããã€ãã³ãã®ããããèšå®ãããŸãã
'events' => [ UserRegisteredEvent::class => [ UserRegisteredHandler::class, ], ]
å®éãã¢ãžã¥ãŒã«ã¯ã³ã³ãããŒã©ãŒãšã€ãã³ããä»ããŠæä»çã«çžäºã«éä¿¡ããŸãã
å¥ã®ã¢ãžã¥ãŒã«ïŒãŠã£ãžã§ããïŒããäœããã®ããŒã¿èŠèŠåããã«ã¢ããããå¿ èŠãããå Žåã¯ãforwardïŒïŒãä»ããŠå¥ã®ã¢ãžã¥ãŒã«ã®ã³ã³ãããŒã©ãŒåŒã³åºãã䜿çšããçµæãçŸåšã®ãã¥ãŒã¢ãã«ã«è¿œå ããŸãã
$comments = $this->forward()->dispatch( 'Dashboard\Controller\Comment', [ 'action' => 'browse', 'entity' => 'blog_posts', 'entityId' => $post->getId() ] ); $view->addChild($comments, 'comments');
ä»ã®ã¢ãžã¥ãŒã«ã«äœããçºçããããšãéç¥ããå¿ èŠãããå Žåãä»ã®ã¢ãžã¥ãŒã«ãå¿çããããã«ã€ãã³ããã¹ããŒããŸãã
ãµãŒãã¹ã¯ã©ã¹
äžèšã®ã³ã³ãããŒã©ãŒãšã€ãã³ããªã¹ããŒã調ã¹ãŸããã次ã«ãã¢ãžã¥ãŒã«ã®æ®ãã®ã¯ã©ã¹ïŒã€ãã³ããã³ãã©ãŒãã³ãã³ããã³ãã©ãŒããµãŒãã¹ãããã³ãªããžããªãŒïŒãè«çéå±€ã§å æããæ®ãã®ã¯ã©ã¹ã調ã¹ãŸãã
ãããããåŸè ããå§ããŸãããã ãªããžããªã æŠå¿µçã«ã¯ãããã¯ããªã¢ãŒããªããžããªã®ã©ããã«ããŒã¿ãä¿åã§ããç¹å®ã®çš®é¡ã®ãšã³ãã£ãã£ãæäœããããã®ã³ã¬ã¯ã·ã§ã³ã§ãã ç§ãã¡ã®å ŽåãããŒã¿ããŒã¹å ã ãããã¯ãæšæºã®Zendã®TableGatewayãšQueryBuilderã䜿çšããããORMãæ¥ç¶ããããšã§å®è£ ã§ããŸãã Doctrine 2ã¯ããããã倧ããªã¢ããªã¹ã§ããŒã¿ããŒã¹ãæäœããããã®æè¯ã®ããŒã«ã§ãã ãããŠãæŠå¿µãšããŠã®ãªããžããªãŒã¯ãã§ã«ç®±ããåºããŠããŸãã
ããšãã°ãDoctrine 2ã®ã³ã³ããã¹ãã§ã¯ããªããžããªã¯æ¬¡ã®ããã«ãªããŸãã
ãªããžããªã³ãŒã
class UserRepository extends BaseRepository { /** * @param UserFilter $filter * @return City|null */ public function findOneUser(UserFilter $filter) { $query = $this->createQuery($filter); Return $query->getQuery()->getOneOrNullResult(); } /** * @param UserFilter $filter * @return \Doctrine\ORM\QueryBuilder */ private function createQuery(UserFilter $filter) { $qb = $this->createQueryBuilder('user'); if ($filter->getEmail()) { $qb->andWhere('user.email = :email') ->setParameter('email', $filter->getEmail()); } if ($filter->getHash()) { $qb->andWhere('user.confirmHash =:hash') ->setParameter('hash', $filter->getHash()); } return $qb; } }
ãªããžããªãŒãããšã³ãã£ãã£ãŒãååŸããã«ã¯ãåçŽãªã¿ã€ãã®ãã©ã¡ãŒã¿ãŒãšãããŒã¿ããŒã¹ããéžæãç·šæããããã«å¿ èŠãªäžé£ã®ãã©ã¡ãŒã¿ãŒãæ ŒçŽããDTOãªããžã§ã¯ãã®äž¡æ¹ã䜿çšã§ããŸãã ç§ãã¡ã®çšèªã§ã¯ããããã¯ãã£ã«ã¿ãŒãšåŒã°ããŸãïŒåŒã³åºãããããããªããžããªããè¿ããããšã³ãã£ãã£ããã£ã«ã¿ãŒããããã§ãïŒã
ãµãŒãã¹ -ã¢ããªã±ãŒã·ã§ã³ããžãã¯ã®ãã¡ãµãŒããšããŠæ©èœããã¯ã©ã¹ããŸãã¯å€éšã©ã€ãã©ãªãšAPIãæäœããããžãã¯ãã«ãã»ã«åããã¯ã©ã¹ã
ã€ãã³ããã³ãã©ãŒãšã³ãã³ããã³ãã©ãŒã¯ãå®éã«ã¯1ã€ã®ãããªãã¯ãã³ãã«ïŒïŒã¡ãœãããæã€ãµãŒãã¹ã§ãããä»ã®ãã³ãã¬ãŒãã¯ã©ã¹ã§ã¯å®è¡ãããªãã·ã¹ãã ã®ç¶æ ã®å€æŽã«é¢äžããŸãã ã·ã¹ãã ã®ç¶æ ãå€æŽãããšã¯ãããŒã¿ããŒã¹ããã¡ã€ã«ã·ã¹ãã ã«æžã蟌ã¿ããµãŒãããŒãã£APIã«ã³ãã³ããéä¿¡ããã¢ã¯ã·ã§ã³ãæå³ããŸããããã«ããããã®APIã«ãã£ãŠè¿ãããããŒã¿ãå€æŽãããŸãã
å®è£ ã§ã¯ãã€ãã³ããã³ãã©ãŒã¯ããã©ã¡ãŒã¿ãŒãšããŠæž¡ãããDTOãZendã€ãã³ãããç¶æ¿ããããšããç¹ã§ã®ã¿ã³ãã³ããã³ãã©ãŒãšç°ãªããŸãã äžæ¹ããšã³ãã£ãã£ã®åœ¢åŒã®ã³ãã³ãã¯ãã³ãã³ããã³ãã©ã«éãããŸãã
ã€ãã³ããã³ãã©ãŒã®äŸ
class UserRegisteredHandler implements EventHandlerInterface { /** * @var ConfirmEmailSender */ private $emailSender; /** * @var EventManagerInterface */ private $eventManager; public function __construct( ConfirmEmailSender $emailSender, EventManagerInterface $eventManager ) { $this->emailSender = $emailSender; $this->eventManager = $eventManager; } public function handle(Event $event) { if (!($event instanceof UserRegisteredEvent)) { throw new \RuntimeException(' '); } $user = $event->getUser(); if (!$user->isEmailConfirmed()) { $this->send($user); } } protected function send(User $user) { $hash = md5($user->getEmail() . '-' . time() . '-' . $user->getName()); $user->setConfirmHash($hash); $this->emailSender->send($user); $this->eventManager->triggerEvent(new ConfirmationEmailSentEvent($user)); } }
ã³ãã³ããã³ãã©ãŒã®äŸ
class RegisterHandler { /** * @var UserRepository */ private $userRepository; /** * @var PasswordService */ private $passwordService; /** * @var EventManagerInterface */ private $eventManager; /** * RegisterCommand constructor. * @param UserRepository $userRepository * @param PasswordService $passwordService * @param EventManagerInterface $eventManager */ public function __construct( UserRepository $userRepository, PasswordService $passwordService, EventManagerInterface $eventManager ) { $this->userRepository = $userRepository; $this->passwordService = $passwordService; $this->eventManager = $eventManager; } public function handle(RegisterCommand $command) { $user = clone $command->getUser(); $this->validate($user); $this->modify($user); $repo = $this->userRepository; $repo->saveAndRefresh($user); $this->eventManager->triggerEvent(new UserRegisteredEvent($user)); } protected function modify(User $user) { $this->passwordService->encryptPassword($user); } /** * @throws CommandException */ protected function validate(User $user) { if (!$user) { throw new ParameterIsRequiredException(' user RegisterCommand'); } $this->validateIdentity($user); } protected function validateIdentity(User $user) { $repo = $this->userRepository; $persistedUser = $repo->findByEmail($user->getEmail()); if ($persistedUser) { throw new EmailAlreadyExists(' email '); } } }
DTOãªããžã§ã¯ã
ã¢ããªã±ãŒã·ã§ã³ã®ããžãã¯ãšãã¢ããªã±ãŒã·ã§ã³ãšå€éšAPIããã³ã©ã€ãã©ãªãšã®çžäºäœçšãå®è£ ããäžè¬çãªã¯ã©ã¹ã¯ãäžèšã§èª¬æãããŠããŸãã ããããäžèšã®ãã¹ãŠã®èª¿æŽãããäœæ¥ã«ã¯ããæ¥çå€ããå¿ èŠã§ãã ãã®ãããªãæ¥çå€ãã¯ãã¢ããªã±ãŒã·ã§ã³ã®ããŸããŸãªéšåéã®éä¿¡ã代衚ããããŒã¿è»¢éãªããžã§ã¯ãã§ãã
ç§ãã¡ã®ãããžã§ã¯ãã§ã¯ã圌ãã¯åé¢ããŠããŸãïŒ
-ãšã³ãã£ãã£-ãŠãŒã¶ãŒãèŸæžãåèªãªã©ãã·ã¹ãã ã®åºæ¬æŠå¿µãè¡šãããŒã¿ åºæ¬çã«ããããã¯ããŒã¿ããŒã¹ããéžæããããã¥ãŒã¹ã¯ãªããã§äœããã®åœ¢åŒã§è¡šç€ºãããŸãã
-ã€ãã³ã-ã€ãã³ãã¯ã©ã¹ããç¶æ¿ãããDTOãäžéšã®ã¢ãžã¥ãŒã«ã§å€æŽãããå 容ã«é¢ããããŒã¿ãå«ãŸããŸãã ã³ãã³ããã³ãã©ãŒãŸãã¯ã€ãã³ããã³ãã©ãŒã«ãã£ãŠã¹ããŒã§ããŸãã ãããŠãã€ãã³ããã³ãã©ãŒã®ã¿ãããããåãå ¥ããŠæäœããŸãã
-ã³ãã³ã-ããã»ããµã«å¿ èŠãªããŒã¿ãå«ãDTOã ã³ã³ãããŒã©ãŒã§åœ¢æãããŸãã ã³ãã³ããã³ãã©ãŒã§äœ¿çšãããŸãã
-ãã£ã«ã¿ãŒ-ããŒã¿ããŒã¹ããã®éžæã®ãã©ã¡ãŒã¿ãŒãå«ãDTOã 誰ã§ã圢ãäœãããšãã§ããŸãã ããŒã¿ããŒã¹ã¯ãšãªãäœæããããã«ãªããžããªã§äœ¿çšãããŸãã
ã·ã¹ãã ã®åéšã®çžäºäœçšã¯ã©ã®ããã«è¡ãããŸãã
ã·ã¹ãã ãšã®çžäºäœçšã¯ãããŒã¿ã®èªã¿åããšããŒã¿ã®å€æŽã«åããããŸãã èŠæ±ãããURLãããŒã¿ã®ã¿ãè¿ãå Žåã察話ã¯æ¬¡ã®ããã«æ§ç¯ãããŸãã
1ïŒçã®åœ¢åŒã®ãŠãŒã¶ãŒããã®ããŒã¿ã¯ãã³ã³ãããŒã©ãŒã®ã¢ã¯ã·ã§ã³ã«å ¥ããŸãã
2ïŒZendã®InputFilterã䜿çšããŠããã£ã«ã¿ãªã³ã°ããŠæ€èšŒããŸãã
3ïŒããããæå¹ãªå Žåãã³ã³ãããŒã©ãŒã§DTOãã£ã«ã¿ãŒã圢æããŸãã
4ïŒãã®å ŽåãçµæããŒã¿ã1ã€ã®ãªããžããªããååŸãããããè€æ°ã®ãªããžããªããã³ã³ãã€ã«ããããã«ãã£ãŠãã¹ãŠãç°ãªããŸãã 1ã€ã®å Žåãã³ã³ãããŒã©ãããªããžããªãåŒã³åºãã3çªç®ã®ã¹ãããã§çæããããªããžã§ã¯ããæ€çŽ¢ã¡ãœããã«æž¡ããŸãã ããŒã¿ãã³ã³ãã€ã«ããå¿ èŠãããå Žåã¯ãããã€ãã®ãªããžããªã®ãã¡ãµãŒããšããŠæ©èœãããµãŒãã¹ãäœæããDTOãæ¢ã«ããã«è»¢éããŸãã ãµãŒãã¹ã¯å¿ èŠãªãªããžããªããã«ããããããããŒã¿ãäœæããŸãã
5ïŒåä¿¡ããããŒã¿ãViewModelã«æž¡ãããã®åŸããã¥ãŒã¹ã¯ãªãããã¬ã³ããªã³ã°ãããŸãã
ã¹ããŒã ã䜿çšããŠãããŒã¿ã®ååŸã«é¢é£ããã³ã³ããŒãã³ããããã³ãã®ããŒã¿ã®ç§»åãèŠèŠåã§ããŸãã
èŠæ±ãããURLãã·ã¹ãã ã®ç¶æ ãå€æŽããå¿ èŠãããå ŽåïŒ
1ïŒçã®åœ¢åŒã®ãŠãŒã¶ãŒããã®ããŒã¿ã¯ãã³ã³ãããŒã©ãŒã®ã¢ã¯ã·ã§ã³ã«å ¥ããŸãã
2ïŒZendã®InputFilterã䜿çšããŠããã£ã«ã¿ãªã³ã°ããŠæ€èšŒããŸãã
3ïŒããããæå¹ãªå Žåãã³ã³ãããŒã©ãŒã§DTOã³ãã³ããäœæããŸãã
4ïŒã³ã³ãããŒã©ãŒã§ã³ãã³ããã³ãã©ãŒãå®è¡ããããã«ã³ãã³ããæž¡ããŸãã ã³ãã³ããã³ãã³ããã¹ã«è»¢éããããšã¯æ£ãããšèããããŸãã ç§ãã¡ã¯æŠè¡çãªãã¹ãšããŠäœ¿çšããŸããã ããããæçµçã«ããã³ãã©ãŒãçŽæ¥éå§ããããšã«ããŸããã ããŒã ãã¹ã§ã¯ãçè«çã«ã¯ã³ãã³ãã®äžéšãéåæçã«å®è¡ããæ©äŒãäžããããè¿œå ã®æœè±¡åã¬ãã«ãåãåããŸããããããŒã ã®å¿çããµãã¹ã¯ã©ã€ãããŠãã®éçºçµæãèŠã€ããå¿ èŠãããããšã«äžäŸ¿ã«ãªããŸããã ãããŠãåæ£ã·ã¹ãã ããªããéåæã§äœããå®è¡ãããããããã¯ã«ãŒã«ã§ã¯ãªãäŸå€ã§ãã䜿ããããã®ããã«æœè±¡åãç¡èŠããããšã«ããŸããã
5ïŒã³ãã³ããã³ãã©ãŒã¯ããµãŒãã¹ãšãªããžããªã䜿çšããŠããŒã¿ãå€æŽããã€ãã³ããçæããŠãå€æŽãããããŒã¿ãããã«æž¡ããŸãã 次ã«ãã€ãã³ããã€ãã³ããã¹ã«ã¹ããŒããŸãã
6ïŒã€ãã³ããã³ãã©ãŒã¯ã€ãã³ãããã£ãããããã®å€æãå®è¡ããŸãã å¿ èŠã«å¿ããŠãè¡ãããå€æã«é¢ããæ å ±ãå«ãã€ãã³ããã¹ããŒããŸãã
7ïŒãã¹ãŠã®ã€ãã³ããã³ãã©ãŒã®åŠçåŸãå¶åŸ¡ãããŒã¯ã³ãã³ãããã³ã³ãããŒã©ãŒã«æ»ããå¿ èŠã«å¿ããŠãã³ãã³ããã³ãã©ãŒã«ãã£ãŠè¿ãããçµæãååŸãããViewModelã«éä¿¡ãããŸãã
æŠç¥çã«ãèŠçŽ éã®é¢ä¿ãããã³ã³ã³ããŒãã³ãéã®åŒã³åºãã®çºçæ¹æ³ãå³ã«ç€ºããŸãã
ã¢ãžã¥ãŒã«éçžäºäœçšã®äŸ
æãç°¡åã§æçœãªäŸã¯ãã¡ãŒã«ã¢ãã¬ã¹ã確èªããããã«ã¡ãŒã«ãéä¿¡ãããŠãŒã¶ãŒãç»é²ããããšã§ãã ãã®ãã§ãŒã³ã§ã¯ã2ã€ã®ã¢ãžã¥ãŒã«ããã¹ããããŸãããŠãŒã¶ãŒïŒãŠãŒã¶ãŒã«é¢ãããã¹ãŠã®ããšãç¥ã£ãŠããããŠãŒã¶ãŒããšã³ãã£ãã£ïŒç»é²ãå«ãïŒã§æäœã§ããããã«ããã³ãŒãããããŸãã éä¿¡æ¹æ³ã察象ãéä¿¡å ãææ¡ããŠããã¡ãŒã«ã¢ãžã¥ãŒã«ããããŸãã
ãŠãŒã¶ãŒã¢ãžã¥ãŒã«ã¯ãç»é²ãã©ãŒã ããã³ã³ãããŒã©ãŒã«ããŒã¿ãåéãããŠãŒã¶ãŒãããŒã¿ããŒã¹ã«ä¿åããŸãããã®åŸãUserRegisteredEventïŒ$ userïŒã€ãã³ããçæããä¿åãããŠãŒã¶ãŒãããã«æž¡ããŸãã
public function handle(RegisterCommand $command) { $user = clone $command->getUser(); $this->validate($user); $this->modify($user); $repo = $this->userRepository; $repo->saveAndRefresh($user); $this->eventManager->triggerEvent(new UserRegisteredEvent($user)); }
0ããä»ã®ã¢ãžã¥ãŒã«ã®è€æ°ã®ãªã¹ããŒããã®ã€ãã³ãã«ãµãã¹ã¯ã©ã€ãã§ããŸãã ãã®äŸã§ã¯ã確èªããã·ã¥ãçæããEmailã¢ãžã¥ãŒã«ãããã·ã¥ãã¡ãã»ãŒãžãã³ãã¬ãŒãã«è»¢éããçæãããã¡ãã»ãŒãžããŠãŒã¶ãŒã«éä¿¡ããŸãã ãã®åŸãConfirmationEmailSentEventïŒ$ userïŒã€ãã³ããåã³çºçãã確èªããã·ã¥ãè¿œå ããããŠãŒã¶ãŒãšã³ãã£ãã£ã眮ãæããŸãã
protected function send(User $user) { $hash = md5($user->getEmail() . '-' . time() . '-' . $user->getName()); $user->setConfirmHash($hash); $this->emailSender->send($user); $this->eventManager->triggerEvent(new ConfirmationEmailSentEvent($user)); }
ãã®åŸãUserã¢ãžã¥ãŒã«ã¯ã¬ã¿ãŒãéä¿¡ããã€ãã³ãããã£ãããã確èªããã·ã¥ãããŒã¿ããŒã¹ã«ä¿åããå¿ èŠããããŸãã
ãã®ã¢ãžã¥ãŒã«éçžäºäœçšã¯å®äºããå¿ èŠããããŸãã ã¯ããå€ãã®å Žåãè¿é£ã®ã¢ãžã¥ãŒã«ããã³ãŒããçŽæ¥ãã«ãããå ŽåããããŸãããããã¯ã¢ãžã¥ãŒã«ã®æ¥ç¶æ§ã«ã€ãªãããé·ãç®ã§èŠãã°ã«ãŒãã殺ããåã¢ãžã¥ãŒã«ãåå¥ã®ãããžã§ã¯ãã«åã蟌ãããšãã§ããŸãã
çµè«ã®ä»£ããã«
ãããã£ãŠãå®éã«ã¯ãã³ãŒãã®åçŽãªæ§é åã«ããããããžã§ã¯ããç¬ç«ããå°ããªéšåã«åé¢ããããšãã§ããŸãã åæ§ã®éšåã«ã«ããããããããžã§ã¯ãã¯ãã¯ã³ããŒã¹ã®ãããžã§ã¯ããããç¶æãã¯ããã«ç°¡åã§ãã
ããã«ããã®ã¢ãããŒãã䜿çšããŠã³ãŒããéçºãããšããã€ã¯ããµãŒãã¹ã¢ãããŒããžã®åãæ¿ããã¯ããã«ç°¡åã«ãªããŸãã ãªããªã 1ã€ã®ãããžã§ã¯ãã®ã³ã³ããã¹ãã§ã¯ãããŸããããã€ã¯ããµãŒãã¹ã¯ãã§ã«ååšããŸãã ç¬èªã®åå¥ã®ãããžã§ã¯ãã§åã¢ãžã¥ãŒã«ãåãåºããZendã€ãã³ããã¹ããã®å®è£ ã«çœ®ãæããã ãã§ååã§ãããã®å®è£ ã¯ãHTTPãŸãã¯RabbitMQãä»ããŠã€ãã³ããéä¿¡ããŸãã ããããããã¯çŽç²ã«çè«çãªæšæž¬ã§ãããæèã®ç³§ã§ãã
Habrã®èªè ã®ããã®ããŒãã¹
ãªã³ã©ã€ã³è¬åº§
ããªã³ã©ã€ã³ã³ãŒã¹ãã®ç¬ç«ããåŠç¿ã®ããã«ãè±èªã³ãŒã¹ã«1幎éã¢ã¯ã»ã¹ã§ããŸãã
ã¢ã¯ã»ã¹ããã«ã¯ãåã«ãªã³ã¯ãã¯ãªãã¯ããŠãã ãã ã ã¢ã¯ãã£ããŒã·ã§ã³ã³ãŒãã¯2017幎9æ1æ¥ãŸã§æå¹ã§ãã
Skypeã§åå¥ã«
å€æéäžè±èªã³ãŒã¹-ã¢ããªã±ãŒã·ã§ã³ãããã«æ®ããŸã ã
ã¯ã©ã¹ã¯ãã€ã§ãéå¬ã§ããŸãã
35ïŒ å²åŒã³ãŒã ïŒ 6habra25
5æ22æ¥ãŸã§æå¹ã æ¯æãæã«å ¥åãããã ãªã³ã¯ã䜿çšããŸãã