Nano Hash - криптовалюты, майнинг, программирование

Как получить доступ к методам пакетов?

Я разрабатываю пакет laravel, внутри пакета у меня есть репозиторий, который обрабатывает данные.

Когда пользователь устанавливает пакет, как я могу заставить его взаимодействовать с репозиторием в своем приложении?

Должен ли я настроить фасад, чтобы они могли делать что-то вроде:

SuperPackage::getSomeData();

Или я должен использовать другой способ?

В документах указано:

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

Я предполагаю, что это просто предназначено для внутренних частей пакета, внешнего вызова пакета, фасады все еще в порядке?


Ответы:


1

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

Ваш контракт:

namespace Your\Package;

public interface YourPackageContract
{
    public function availableMethod();
}

Ваша реализация:

namespace Your\Package;

class YourPackage implements YourContract
{
    public function availableMethod()
    {
        //  Implement your method
    }
}

Ваш поставщик услуг:

namespace Your\Package;

use Illuminate\Support\ServiceProvider;

class YourPackageServiceProvider extends ServiceProvider
{
    public function register()
    {
        // Tell Laravel that when an instance of YourPackageContract is requested, an instance of YourPackage should be returned
        $this->app->singleton('Your\Package\YourPackageContract', function($app) {
            return new YourPackage();
        });
    }

    public function provides()
    {
        return ['Your\Package\YourPackageContract'];
    }
}

Ваш фасад:

namespace Your\Package\Facades;

use Illuminate\Support\Facades\Facade;

class YourPackage extends Facade
{
    public function getFacadeAccessor()
    {
        return 'Your\Package\YourPackageContract';
    }
}

Использование в контроллере:

class SomeController
{
    public function index(YourPackageContract $yourPackage)
    {
        // $yourPackage should now be an instance of YourPackage
        $yourPackage->availableMethod();

        // You can also use the Facade which refers to the same instance
        YourPackage::availableMethod();
    }
}

Вы всегда можете использовать метод ->alias() в своем поставщике услуг, если хотите создать несколько способов доступа к вашему классу с более читаемыми именами и т. д.

Примечание. Я только что написал это прямо здесь, у меня не было возможности проверить это.

24.11.2016
  • Спасибо, как пользователь может получить доступ к методу в репозитории через внедрение зависимостей? Придется ли им внедрять класс репозитория? Или они могут просто использовать имя пакета? Не могли бы вы показать мне грубый пример? Меня беспокоит, что если это класс репозитория, то это зависит от того, знает ли пользователь имя репозитория, тогда как фасад кажется проще. 24.11.2016
  • Я обновил свой ответ примером, но ничего не тестировал. 24.11.2016
  • Спасибо за обновленный ответ, поэтому мне нужно будет сослаться на интерфейс репозиториев для внедрения зависимостей. У меня есть еще вопрос, предположим, что у меня есть около 10 репозиториев, работающих с различными частями данных из пакета. Для внедрения зависимостей я предполагаю, что просто ввожу репозиторий, который хочу, как это будет работать с фасадом? Понадобится ли мне несколько фасадов, по одному на каждый репозиторий? Или есть другой способ? 24.11.2016
  • Можете ли вы привести пример того, что вы имеете в виду? Боюсь, довольно сложно ответить без особого контекста. 24.11.2016
  • Скажем, у меня была таблица для пользователей, сообщений, продуктов, обзоров и т. д. У меня также был репозиторий, содержащий данные для каждого, поэтому репозиторий пользователей, репозиторий сообщений и т. д. Я хочу, чтобы пользователь мог получить доступ к этим репозиториям с фасада, - как? Более одного фасада? Другой путь? 24.11.2016
  • В этом случае я бы использовал одного поставщика услуг, один фасад и одну реализацию с методами, которые вы можете использовать для получения экземпляров репозиториев. Вы можете сделать метод userRepository доступным в вашем контракте/реализации, который, например, возвращает экземпляр вашего пользовательского репозитория. Затем вы можете использовать внедрение зависимостей ИЛИ свой фасад для доступа к нему: YourPackage::userRepository()->methodOnUserRepository(). Как это звучит? 24.11.2016
  • Да, похоже, это нормальный способ, MyPackage::user-›all(); 24.11.2016
  • Если вы возьмете, например, Socialite, он позволит вам использовать несколько провайдеров, выполнив что-то вроде Socialite->with($provider)->redirect(), где $provider может быть любой из доступных реализаций, 24.11.2016
  • Ничего страшного, рад, что помогло :) 24.11.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..