Проблемы, возникающие при использовании require_once в папке Laravel - PullRequest
1 голос
/ 05 марта 2020

У меня есть ситуация, когда я был вынужден использовать что-то, что ДОЛЖНО быть пакетом composer в моем проекте Laravel, вместо этого, как часть моих файлов проекта (пакет composer, насколько я могу сказать, что содержит ошибки, которые я не могу устранить, и я использую папку с аналогичными файлами php, которые предоставил мне мой коллега)

Я постараюсь дать как можно больше контекста:

Я установил все файлы в папку в этом каталоге: \app\Channels\V1\Helpers\MarketplaceWebService\. Файлы похожи на этого проекта , но отличаются

Чтобы загрузить классы из указанной выше папки, я добавил строку в мой файл composer. json. :

   "autoload": {
        "psr-4": {
            "App\\": "app/"
        },
        "classmap": [
            "database/seeds",
            "database/factories",
            "app/Channels/V1/Helpers/MarketplaceWebService"
        ]
    },

Эта последняя строка в массиве classmap - я использовал ее для загрузки своих классов в свой проект, так что теперь я могу требовать их через use MarketplaceWebService_Client; в верхней части любого из моих обычных laravel files

Теперь для многих случаев это работает - я могу инициировать классы, и они извлекаются из правильного места.

Однако, каждый раз, когда я использую один из MarketplaceWebService, у которого есть относительный require_once, он не работает

У меня есть еще один пакет composer от того же парня по имени amazon-mws-orders, и он выглядит на основании полученного сообщения об ошибке, что эти относительные require_once вызовы по какой-то странной причине сделаны относительно этого пакета, а не относительно расположения файла, в котором я нахожусь.

Так, например, если файл имеет require_once ('Interface.php');, а Interface.php находится в та же папка, что и этот файл, он работает просто отлично, НО если файл имеет require_once ('../Model.php'), я получаю это прекрасное сообщение:

500 - {"message":"MarketplaceWebService_Client::main(): 
    Failed opening required '../Model.php' 
   (include_path='/home/devchannelapi/laravel/vendor/tilleuls/amazon-mws-orders/src:.:/opt/alt/php72/usr/share/pear')",exception":"Symfony\\Component\\Debug\\Exception\\FatalErrorException",

 "file":"/home/devchannelapi/laravel/app/Channels/V1/Helpers/MarketplaceWebService/Model/SubmitFeedResponse.php","line":22

И я установил некоторые точки останова в Xdebug, и это, фактически, строка 22 на /Model/SubmitFeedResponse.php, где написано require_once('../Model.php'), и Класс Model.php действительно находится на один каталог выше этого файла, поэтому можно ожидать, что оператор require_once сработает. И на самом деле, если я сделаю копию Model.php и поместу ее в папку /Model, и изменим инструкцию require на require_once('Model.php'), это на самом деле работает! Но всякий раз, когда я оставляю относительное требование, оно выдает мне сообщение об ошибке, как указано выше, как будто оно ищет относительное требование в /home/devchannelapi/laravel/vendor/tilleuls/amazon-mws-orders/src

Теперь я уже сделал composer dump-autoload, я не знаю достаточно о Laravel загрузке классов, чтобы понять, почему еще это может происходить.

Любая помощь будет оценена.

1 Ответ

1 голос
/ 05 марта 2020

Мне удалось заменить все относительные импорты на __DIR__ импорт

например, require_once('../Model.php); становится require_once(__DIR__ . '/../Model.php);

Было немного больно редактировать каждый файл в папке, но Sublime Text очень помог!

...