изменение значений свойств объекта возвращает ноль в поле зрения - PullRequest
0 голосов
/ 31 декабря 2018

Я пытаюсь изменить некоторые значения свойств моего account объекта.Я пытаюсь установить значение на domain и password

Когда я регистрирую свой объект перед тем, как отправить его на внешний интерфейс (используя vue), объект, кажется, изменяется в соответствии с моими потребностями, но когда я console.log() это в браузере, значения свойств равны нулю.

Я использую Laravel Excel для создания учетных записей.После создания учетной записи я использую события со слушателями, чтобы отправить объекты своей учетной записи в мое представление с помощью кнопки pusher.

Как мне сделать это правильно?

AccountsImport

class AccountsImport implements ToCollection, withHeadingRow
{
    use Importable;

    private $data;

    public function __construct(array $data = [])
    {
        $this->data = $data;
    }

    public function collection(Collection $rows)
    {
        $rows->each(function ($row, $key) {
           $account = Account::create(array_merge([
                'name' => mb_convert_encoding($row['student'], "UTF-8", mb_detect_encoding($row['student'], "UTF-8, ISO-8859-1, ISO-8859-15", true)),
                'email' => $row['school_e_mailadres'],
            ], $this->data));
            event(new AccountCreation($account));
        });
    }
}

Событие AccountCreation запускается и SetHostingAccountслушатель будет работать

public function handle(AccountCreation $event) 
{
    $generator = new ComputerPasswordGenerator();
    $generator->setUppercase()->setLowercase()->setNumbers()->setSymbols(false)->setLength(20);
    $password = $generator->generatePassword();

    $domain = preg_replace('/\s+/', '.', mb_strtolower($event->account->name . ' mtantwerp.eu'));
    $event->account->{"domain"} = $domain;
    $event->account->{"password"} = $password;

    \Log::debug($event->account);

    return $event->account; 
}

Vue

 created() {
    Echo.channel("account-channel").listen("AccountCreation", e => {
      console.log(e.account);
      this.accounts.unshift(e.account);
    });      
  }

Журнал результатов

Пример результата \Log::debug($event->account)

{"name":"John Doe","email":"john.doe@student.kdg.be","package":"KDG student","id":577,"domain":"john.doe.mtantwerp.eu","password":"r5RSEvQBYnTF7RkPtL8Y"}

Console.log(e.account) в поле зрения

Object
domain: null
email: "john.doe@student.kdg.be"
id: 703
name: "Doe John"
package: "KDG student"
password: null
status: "created"

1 Ответ

0 голосов
/ 31 декабря 2018

Кажется, вы не сохраняете свои данные в модели.

public function handle(AccountCreation $event) 
{
    $generator = new ComputerPasswordGenerator();
    $generator->setUppercase()->setLowercase()->setNumbers()->setSymbols(false)->setLength(20);
    $password = $generator->generatePassword();

    $domain = preg_replace('/\s+/', '.', mb_strtolower($event->account->name . ' mtantwerp.eu'));
    $event->account->{"domain"} = $domain;
    $event->account->{"password"} = $password;

    // persist 
    $event->account->save();

    return $event->account; 
}

Редактировать: Я думаю, что есть два способа справиться с этим.

Либо вы повторно транслируете событие после обновления данных своей учетной записи:

public function handle(AccountCreation $event) 
{
    $generator = new ComputerPasswordGenerator();
    $generator->setUppercase()->setLowercase()->setNumbers()->setSymbols(false)->setLength(20);
    $password = $generator->generatePassword();

    $domain = preg_replace('/\s+/', '.', mb_strtolower($event->account->name . ' mtantwerp.eu'));
    $event->account->{"domain"} = $domain;
    $event->account->{"password"} = $password;

    // persist 
    $event->account->save();

    // broadcast will have updated account details 
    // after it was persisted
    broadcast($event);

    return $event->account; 
}

В этом случае вам также необходимо проверить, есть ли у учетной записи домен на Vueсоставная часть.

if(e.account.domain) {
    this.accounts.unshift(e.account);
}

Это должно работать.Тем не менее, я бы предпочел, чтобы вы рассмотрели создание нового события, которое будет лучше описывать то, что вы пытаетесь сделать.В этом случае учетная запись обновляется.Таким образом, вы создадите новое AccountWasUpdated событие, и вместо этого вы будете Echo слушать его.

public function handle(AccountCreation $event) 
{
    $generator = new ComputerPasswordGenerator();
    $generator->setUppercase()->setLowercase()->setNumbers()->setSymbols(false)->setLength(20);
    $password = $generator->generatePassword();

    $domain = preg_replace('/\s+/', '.', mb_strtolower($event->account->name . ' mtantwerp.eu'));
    $event->account->{"domain"} = $domain;
    $event->account->{"password"} = $password;

    // persist 
    $event->account->save();

    event(new AccountWasUpdated($event->account)); 

    return $event->account; 
}

Вместо того, чтобы Echo прослушивал событие AccountCreation, он будет слушать событие AccountWasUpdated и будет содержать новый объект Account.

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