PHP - Доступ к частной переменной родителя в рамках метода цепочки - PullRequest
0 голосов
/ 11 июля 2020

Я решаюсь создавать собственные классы и службы в своем приложении Laravel.

В настоящий момент я создаю службу для хранения файлов в моем хранилище, однако я хотел бы вернуть данные в Speci c формат, и я его не понимаю.

Это мои классы:

<?php

namespace App\Services\Storage;

use Ramsey\Uuid\Uuid;

class StorageService
{
    private $context;

    private $file;

    private $fileName;

    public static function context($context)
    {
        return new StorageService($context);
    }

    private function __construct($context)
    {
        $this->context = $context;
    }

    public function store($file)
    {
        $this->file = $file;

        $this->fileName = (string)Uuid::uuid4();

        // Functions to store the file
        
        return new FileData($this);
    }
}

Этот класс вызывается сразу после сохранения файла и в основном служит для возврата данных связанный с файлом:

<?php

namespace App\Services\Storage;

class FileData
{
    private $file;

    public function __construct($storage)
    {
        $this->file = $storage;
    }

    public function getContext()
    {
        return $this->file->context;
    }

    public function getName()
    {
        return $this->file->fileName;
    }

    public function getDataAsArray()
    {
        return [
            'context' => $this->getContext(),
            'name' => $this->getName()
        ];
    }
}

Я хотел бы сохранить файл и вернуть его данные следующим образом:

$file = StorageService::context('support')
            ->store($request->file('file'))
            ->getDataAsArray();

Model::create($file);

При использовании вышеуказанного метода я получаю следующую ошибку:

Cannot access private property App\Services\Storage\StorageService::$context

class: "App\Services\Storage\FileData"
file: "/app/Services/Storage/FileData.php"
function: "getContext"

Я не могу объявить переменные publi c, так как не хочу, чтобы это происходило:

StorageService::context('support')->context;

Есть ли другой способ передать данные из StorageService::class в FileData::class без необходимости передавать все переменные по отдельности в __construct ()?

Спасибо

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Вы не можете получить частную собственность из другого объекта. добавьте следующий метод в класс StorageService

public function getContext()
{
    return $this->context;
}

и в методе изменения класса FileData getContext () на

public function getContext()
{
    return $this->file->getContext();
}
0 голосов
/ 11 июля 2020

Вы правильно передаете объекты. Единственное, что PHP не может предоставить вам доступ к частным свойствам, которые вы определили в службе хранилища.

У вас есть 2 варианта:

  1. Создать выделенные getter функции для определенных свойств c, например, getFileName(), и внутри возвращает значение частного свойства
  2. Определите метод magi c __get, в котором вы проверяете, существует ли запрошенное свойство, и если да, вы возвращаете это значение

Оба эти параметра находятся внутри вашего StorageServer. В первом варианте вам необходимо отредактировать код в файле FileData для доступа к функциям, а не свойствам. Со вторым вариантом PHP волшебным образом позаботится об этом.

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