registry Реєстр (англ. Registry) - це шаблон, призначений для зберігання записів, які в нього поміщають, і відповідно повернення цих записів (за ключем), якщо вони будуть потрібні.

Як на нормальному підприємстві, коли у нас з’являється новий працівник – у бухгалтерії з’являється новий запис із його даними. Журнал працівників і є Реєстром, а кожен об’єкт інформації працівника - запис у реєстрі. Реєстр нерідко є Одинаком, проте це не завжди має бути саме так. Наприклад, ми можемо завести у бухгалтерії кілька журналів. В одному працівники від “А” до “М”. В іншому від “Н” до “Я”. Кожен такий журнал буде Реєстром, але не Одинаком, тому що журналів вже 2.

Примітка: Зауважимо, що Реєстр дуже схожий на Мультитон та Пул об’єктів. Сам шаблон Реєстр не є _ “породжувальним шаблоном”_ у сенсі цього терміна, проте його зручно розглядати саме у взаємозв’язку з ними. На відміну від Мультитона та Пула, він не вміє породжувати нові сутності. Реєстр - це сховище!

  • Registry.php
                  
    <?php
    
    namespace DesignPatterns\Structural\Registry;
    
    use InvalidArgumentException;
    
    /**
     * Class Registry
     * @package DesignPatterns\Structural\Registry
     */
    class Registry
    {
    
        /**
         * @var WorkerData[]
         */
        protected $workerDataRegistry = [];
    
        /**
         * @param string $key
         * @param WorkerData $workerData
         *
         * @return void
         * @throws InvalidArgumentException
         */
        public function addWorker(string $key, WorkerData $workerData)
        {
            $key = $this->prepareKey($key);
    
            if (!key_exists($key, $this->workerDataRegistry)) {
                $this->workerDataRegistry[$key] = $workerData;
            } else {
                throw new InvalidArgumentException('Worker with key: #' . $key . ' exists.');
            }
        }
    
        /**
         * @param string $key
         *
         * @return WorkerData
         */
        public function getWorker(string $key)
        {
            $key = $this->prepareKey($key);
    
            if (key_exists($key, $this->workerDataRegistry)) {
                return $this->workerDataRegistry[$key];
            } else {
                throw new \InvalidArgumentException('Worker with key: #' . $key . ' not exists.');
            }
        }
    
        /**
         * @param string $key
         *
         * @return string
         */
        private function prepareKey(string $key)
        {
            return trim(strtolower($key));
        }
    }
    
                  
  • WorkerData.php
                  
    <?php
    
    namespace DesignPatterns\Structural\Registry;
    
    /**
     * Class WorkerData
     * @package DesignPatterns\Structural\Registry
     */
    class WorkerData
    {
        /**
         * @var string
         */
        protected $firstName;
    
        /**
         * @var string
         */
        protected $lastName;
    
        /**
         * @var string
         */
        protected $fullName;
    
        /**
         * @var int
         */
        protected $age;
    
        /**
         * @var string
         */
        protected $phone;
    
        /**
         * WorkerData constructor.
         *
         * @param string $firstName
         * @param string $lastName
         * @param int $age
         * @param int $phone
         */
        public function __construct(string $firstName, string $lastName, int $age, int $phone)
        {
            $this->firstName = $this->prepareName($firstName);
            $this->lastName = $this->prepareName($lastName);
            $this->fullName = $this->setFullName();
            $this->age = $age;
            $this->phone = $phone;
        }
    
        /**
         * @return string
         */
        public function getFirstName(): string
        {
            return $this->firstName;
        }
    
        /**
         * @param string $firstName
         *
         * @return void
         */
        public function setFirstName(string $firstName)
        {
            $this->firstName = $firstName;
        }
    
        /**
         * @return string
         */
        public function getLastName(): string
        {
            return $this->lastName;
        }
    
        /**
         * @param string $lastName
         *
         * @return void
         */
        public function setLastName(string $lastName)
        {
            $this->lastName = $lastName;
        }
    
        /**
         * @return string
         */
        public function getFullName(): string
        {
            return $this->fullName;
        }
    
        /**
         * @return string
         */
        public function setFullName()
        {
            return $this->firstName . ' ' . $this->lastName;
        }
    
        /**
         * @return int
         */
        public function getAge(): int
        {
            return $this->age;
        }
    
        /**
         * @param int $age
         *
         * @return void
         */
        public function setAge(int $age)
        {
            $this->age = $age;
        }
    
        /**
         * @return string
         */
        public function getPhone(): string
        {
            return $this->phone;
        }
    
        /**
         * @param string $phone
         *
         * @return void
         */
        public function setPhone(string $phone)
        {
            $this->phone = $phone;
        }
    
        /**
         * @param string $name
         *
         * @return string
         */
        private function prepareName(string $name)
        {
            return ucfirst(strtolower($name));
        }
    }
    
                  
  • Test case:

    RegistryTest.php
      
    <?php
    namespace DesignPatterns\Tests\Structural\Registry;
    
    use DesignPatterns\Structural\Registry\Registry;
    use DesignPatterns\Structural\Registry\WorkerData;
    use InvalidArgumentException;
    
    class RegistryTest extends \PHPUnit_Framework_TestCase
    {
        private $ivanDataFixture = [
            'firstName' => 'ivan',
            'lastName'  => 'ivanov',
            'age'       => 21,
            'phone'     => 380936547896,
        ];
    
        private $petrDataFixture = [
            'firstName' => 'petr',
            'lastName'  => 'petrov',
            'age'       => 18,
            'phone'     => 380668524785,
        ];
    
        public function testCanSetUpWorkerToRegistry()
        {
            $ivanWorkerData = new WorkerData(
                $this->ivanDataFixture['firstName'],
                $this->ivanDataFixture['lastName'],
                $this->ivanDataFixture['age'],
                $this->ivanDataFixture['phone']
            );
            $petrWorkerData = new WorkerData(
                $this->petrDataFixture['firstName'],
                $this->petrDataFixture['lastName'],
                $this->petrDataFixture['age'],
                $this->petrDataFixture['phone']
            );
    
            $registry = new Registry();
    
            $registry->addWorker('Ivan', $ivanWorkerData);
            $registry->addWorker('Petr', $petrWorkerData);
    
            $this->assertInstanceOf('DesignPatterns\Structural\Registry\WorkerData', $registry->getWorker('Ivan'));
            $this->assertInstanceOf('DesignPatterns\Structural\Registry\WorkerData', $registry->getWorker('Petr'));
        }
    
        public function testException()
        {
            $this->expectException(InvalidArgumentException::class);
            $registry = new Registry();
    
            $ivanWorkerData = new WorkerData(
                $this->ivanDataFixture['firstName'],
                $this->ivanDataFixture['lastName'],
                $this->ivanDataFixture['age'],
                $this->ivanDataFixture['phone']
            );
            $petrWorkerData = new WorkerData(
                $this->petrDataFixture['firstName'],
                $this->petrDataFixture['lastName'],
                $this->petrDataFixture['age'],
                $this->petrDataFixture['phone']
            );
    
            $registry->addWorker('Ivan', $ivanWorkerData);
            $registry->addWorker('Ivan', $petrWorkerData);
        }
    }