Как использовать фасады Laravel (Cache, Log, Storage) в упаковке вне Laravel - PullRequest
0 голосов
/ 22 сентября 2019

Пожалуйста, укажите любые наивные или неверные предположения о Laravel, Composer, PHPUnit и т. Д., Которые я делаю

У меня был класс SpeechToTextHelper, который был внутри проекта Laravel, и он использовал такие фасады, как это:

use Cache;
use Log;
use Storage;

Затем, так как я хотел поделиться им между несколькими проектами Laravel, я переместил его в отдельный репозиторий и потребовал (в первом проекте) в качестве зависимости через Composer.

Кажется, что код работает нормально.

Мой вопрос отличается от Использование Laravel Facades за пределами Laravel

То, что я хочу знать, это:

  1. Теперь, когда я также хочу написать тесты PHPUnit для SpeechToTextHelper в моем новом инструментальном репозитории, я вижу ошибки, подобные RuntimeException: A facade root has not been set. и Error: Class 'Log' not found, предположительно, потому что этот инструментальный репозиторий не знает о Laravel.Я предполагаю, что это означает, что мой производственный код работал только с побочным эффектом.
  2. В моем новом инструментальном репозитории (где сейчас находится мой SpeechToTextHelper), как я должен указать (возможно, где-то в composer.json?)что код будет работать только в том случае, если фасады Laravel существуют и правильно инициализированы?

Как я могу исправить код моего отдельного репо, чтобы его тесты могли выполняться, а также чтобы он мог быть только "требуется "для проекта Laravel?

PS https://laravel.com/docs/5.7/facades говорит" При создании стороннего пакета, взаимодействующего с Laravel, лучше вводить контракты Laravel (https://laravel.com/docs/5.7/contracts) [которые работаютв их собственном GitHub-репозитории] вместо использования фасадов. "" Если вы создаете пакет, вам следует серьезно рассмотреть возможность использования контрактов, поскольку их будет проще тестировать в контексте пакета. "

Но я не вижуконтракты на бревно или хранение вообще.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Я не уверен, что это лучший подход, поэтому я хотел бы, чтобы другие предоставили лучшие ответы.

Для производственного кода

У моего composer.json все еще есть это в разделе «требуется»: "laravel/framework": "5.7.*",.

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

Дляtests

Что касается тестов, то, по-видимому, необходимо было добавить эти файлы из https://github.com/laravel/laravel/tree/2a1f3761e89df690190e9f50a6b4ac5ebb8b35a3:

app/Console/Kernel.php
app/Providers/AppServiceProvider.php
app/Providers/AuthServiceProvider.php
app/Providers/EventServiceProvider.php
app/Providers/RouteServiceProvider.php
bootstrap/cache/.gitignore
bootstrap/app.php
bootstrap/autoload.php
config/app.php
config/database.php
config/logging.php
config/view.php
storage/logs/laravel.log
tests/CreatesApplication.php
tests/TestCase.php

Возможно, это минимальный набор файлов barebone Laravel, без которыхтесты не могут быть запущены.

Затем я убедился, что каждый тестовый класс расширяется tests/TestCase.php.И я скорректировал пространства имен.

0 голосов
/ 22 сентября 2019

Я думаю, что вы ищете репозитории компонентов Laravel

  1. Кэш - Этот компонент показывает, как использовать функции кэша Laravel в приложениях, не относящихся к Laravel.

  2. Журнал - Этот компонент показывает, как использовать функции Журнала Laravel в приложениях без Laravel.

Это video показывает, как вы можете использовать eloquent вне laravel, я думаю, что это даст вам лучшую идею.

...