Amr Mohammad Rashad Ответов: 1

Красноречивое обновление модели неоднозначного поведения


У меня возникла проблема с обновлением моего профиля/пользовательских данных. Я использую смешанный шаблон method\chain of responsibility design patterns, чтобы быть моими сценариями обновления во всей системе, так что процесс обновления начинается в транзакции, как будто произошла какая-то ошибка, все откатывается назад.
abstract class UpdateProcessor
{
    protected abstract function BeginTransaction();

    protected abstract function Execute();

    protected abstract function Commit();

    protected abstract function Rollback();

    public function ProcessUpdate()
    {
        try {
            $this->BeginTransaction();
            $this->Execute();
            $this->Commit();
        } catch (\Exception $e) {
            $this->Rollback();
        }
    }
}
abstract class BaseProcessor extends UpdateProcessor
{
    public function BeginTransaction()
    {
        DB::beginTransaction();
    }

    public function Commit()
    {
        DB::commit();
    }

    public function Rollback()
    {
        DB::rollBack();
    }
}
class UserUpdateProcessor extends BaseProcessor
{
    private $repository;
    private $reqs;

    public function __construct(BaseRepository $repo, $reqsArray)
    {
        $this->repository = $repo;
        $this->reqs = $reqsArray;
    }

    public function Execute()
    {
        $handler1 = new UpdateProfiler($this->repository);
        $handler2 = new UpdateAccount($this->repository->helperRepo);
        $handler1->nextHandler = $handler2;

        $handler1->process($this->reqs);
    }
}
class UpdateProfiler extends Handler
{
    public $nextHandler;
    private $repository;
    private $keys = [
        'id', 'user_login', 'phone_login', 'user_pass', 'user_email', 'notk'];

    public function __construct(BaseRepository $repo)
    {
        $this->repository = $repo;
    }

    public function process($reqsArray)
    {
        $this->repository->update(array_diff_key($reqsArray, array_flip($this->keys)),
            $reqsArray[$this->repository->primaryKey]);

        if (!is_null($this->nextHandler) && $this->nextHandler instanceof Handler)
            $this->nextHandler->process($reqsArray);
    }
}
class UpdateAccount extends Handler
{
    public $nextHandler;
    private $repository;
    private $keys = [
        'id', 'user_login', 'phone_login', 'user_pass', 'user_email', 'notk'];

    public function __construct(BaseRepository $repo)
    {
        $this->repository = $repo;
    }

    public function process($reqsArray)
    {
        $this->repository->update(array_intersect_key($reqsArray, array_flip($this->keys)),
            $reqsArray[$this->repository->primaryKey]);

        if (!is_null($this->nextHandler) && $this->nextHandler instanceof Handler)
            $this->nextHandler->process($reqsArray);
    }
}
class DatabaseHelper
{
...
public function UpdateAccount()
    {
        $manager = new AccountManager($this->repository, $this->reqs);
        $manager->UpdateAccount();
    }
}
public function update(array $attributes, $id)
{
...
$model = $this->model->findOrFail($id);
$model->fill($attributes);
$model->save(); 
}
Все работает нормально, и если происходит какое-либо исключение, все откатывается, однако модель пользователя не обновляется, и при регистрации запроса, выданного ORM, я нахожу это
string(122) "update `wp_users` set `user_login` = ?, `user_pass` = ?, `user_email` = ?, `notk` = ?, `updated_at` = ? where `id` is null"
array(5) {
  [0]=>
  string(8) "wp_admin"
  [1]=>
  string(15) "wp_wordpress123"
  [2]=>
  string(31) "amr.mohammad.rashad87@yahoo.com"
  [3]=>
  string(16) "clut0tLDj4ESXftv"
  [4]=>
  string(19) "2019-01-07 00:55:04"
}
Я не знаю, почему он запрашивает идентификатор без нулевого значения
where `id` is null
оператор обновления профиля работает точно так же, и он просто отлично работает, и в предложении where он запрашивает идентификатор профилировщика. Может ли кто - нибудь помочь мне исправить это двусмысленное поведение!

Что я уже пробовал:

Я пытаюсь найти решение в google в течение нескольких часов...

Richard MacCutchan

Вы написали этот код, так как же вы ожидаете, что кто-то еще узнает, почему этот пункт существует?

Amr Mohammad Rashad

Я понял причину, по которой он не работал должным образом. Однако мне нужно задать вам вопрос, почему почти всегда, когда я задаю вопрос, я получаю ответы, подобные тому, что вы мне дали! если мы не вставляли код, нас обвиняли/спрашивали как Аскеров! если мы не вставляли код, нас обвиняли/просили не вставлять код.

Я надеюсь, вы знаете, что если я знаю ответ, то не буду спрашивать, и при вставке моего кода я сделал это так, если кто-то видит в нем дефект или он может сказать мне проверить что-то, так как вставленный код не имеет дефектов. Кроме того, когда я выясню ответ, я поставлю его так, чтобы те, у кого есть подобная проблема, могли извлечь выгоду из моего решения.

1 Ответов

Рейтинг:
10

Amr Mohammad Rashad

Я понял причину этой проблемы. К сожалению, я не заметил, что класс модели пользователя Laravel по умолчанию наполнитель имущество, объявленное как защищенный и похоже, что пакет репозитория, который я использую, пытается получить доступ к наполнитель и уж точно он не сможет этого сделать из-за своего уровня доступности...!