Как реализовать шаблон Observer в CodeIgniter для общих задач c - PullRequest
5 голосов
/ 01 апреля 2020

Я создаю приложение в настройке classi c CI mvc, где у пользователя есть общий / generi c список задач. Основная цель задачи - указать пользователю, что он должен выполнить указанное действие c, и перенаправить его на страницу, где ему необходимо выполнить это действие.

Очень просто c схема БД задачи выглядит следующим образом: enter image description here

Сам список задач будет в некотором роде списком, который перенаправляет пользователя: enter image description here

Моя проблема в том, что когда пользователь перенаправляется на указанную c страницу, на которой должно произойти действие, мы теряем контекст указанной задачи c. Таким образом, даже если задача выполнена (в этом примере, например, документ загружен), сама задача не знает об этом, и у нас на самом деле нет соединения для обновления задачи.

После некоторого исследования Шаблон проектирования наблюдателя выглядит как тот, который может удовлетворить эту потребность. Но во всех примерах я не могу сказать, как на самом деле реализовать это в нашей нынешней системе.

В контроллере, обрабатывающем загрузку документа, есть функция upload_do c () {}, которая при успешном выполнении должна также обновлять задачу, которая подключена или подписана на загрузку этого документа.

class Dashboard extends MY_Controller{

public function __construct()
{
    parent::__construct();

    // Force SSL
    $this->force_ssl();
}

public function upload_doc(){
   //Handle doc upload and update task
}
}

Может ли кто-нибудь помочь мне в дружеской манере, как я могу выполнить эту настройку в рамках CI?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Если я правильно понимаю вашу проблему и намерения (установить связь между записью, созданной в одном месте, и каким-либо действием, происходящим в другом месте), то Observer (если мы ссылаемся на ту же идею из той же книги) победит ' Чтобы решить эту проблему, это даже не применимо здесь из-за PHP & универсальной c природы сети без сохранения состояния, то есть выполнения, охватывающего несколько вызовов программы. Шаблоны classi c из книги GoF разработаны и предназначены для одного выполнения в рамках одной программы.

Вам необходимо связать пользовательский лог c, который связывает воедино запись задачи и пользователя действия, которые следуют Простейшим подходом было бы добавить cook ie в браузер пользователя с идентификатором задачи, чтобы идентификатор был доступен для контроллера загрузки документов и обновлял остальную часть системы. И там вы можете использовать classi c Observer, в значительной степени согласно ответу Кристофа или любому другому примеру на inte rnet.

0 голосов
/ 05 апреля 2020

Если дело касается шаблонов проектирования, я всегда стараюсь найти справочную документацию / репозиторий github с примерами шаблонов проектирования для требуемого языка. Для PHP я могу горячо рекомендовать это здесь:

https://designpatternsphp.readthedocs.io/en/latest/Behavioral/Observer/README.html

Пример реализации может выглядеть следующим образом. Внимание: у меня нет опыта работы с CodeIgniter. Это просто способ проиллюстрировать, как вы можете реализовать это с помощью данного примера кода.

class Dashboard extends MY_Controller 
{
    private function makeFile()
    {
        // I would put this method into a file factory within your container.
        // This allows you to extend on a per module-basis.

        $file = new File();        
        $file->attach(new UpdateTask);
        $file->attach(new DeleteFileFromTempStorage);
        $file->attach(new IncrementStorageSize);
        $file->attach(new AddCustomerNotification);
        return $file;
    }

    public function upload_doc() 
    {
        // My expectation is that you have some task-id reference 
        // when uploading a file. This would allow all observers 
        // to "find" the right task to update.
        $file = $this->newFile();

        // enhance your file model with your request parameters
        $file->fill($params);

        // save your file. Either your model has this functionality already
        // or you have a separated repository which handles this for you.
        $fileRepo->persist($file);

        // Finally notify your observers
        $file->notify();  
    }
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...