Я создал свой собственный пакет композитора, но у меня возникают проблемы с загрузкой и использованием его вне самого пакета (то есть в моем приложении laravel).
Мой файл композитора выглядит так:
{
"name": "joelwmale/rss-feed-php",
"type": "library",
"description": "RSS Feeds for PHP is a very small, lightweight, and easy-to-use library for consuming an RSS feed.",
"keywords": [
"rss",
"feed",
"php"
],
"homepage": "https://github.com/joelwmale/rss-feed-php",
"support": {
"issues": "https://github.com/joelwmale/rss-feed-php/issues",
"source": "https://github.com/joelwmale/rss-feed-php"
},
"license": "MIT",
"authors": [
{
"name": "Joel Male",
"email": "[email protected]",
"homepage": "https://www.joelmale.com",
"role": "Author"
}
],
"minimum-stability": "dev",
"require": {
"php": "^7.1",
"ext-simplexml": "*",
"nesbot/carbon": "^1.26.3"
},
"require-dev": {
"phpunit/phpunit": "^7.5",
"phpstan/phpstan": "^0.11.0@dev"
},
"autoload": {
"psr-4": {
"RSSFeedPHP\\": "src/RSSFeedPHP/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"scripts": {
"test": [
"@phpunit",
"@phpcs"
],
"phpunit": "vendor/bin/phpunit",
"phpcs": "php-cs-fixer fix -v --diff --dry-run",
"phpstan": "phpstan analyse --configuration phpstan.neon --level 3 src tests"
},
"extra": {
"laravel": {
"providers": [
"RSSFeedPHP\\Laravel\\ServiceProvider"
]
}
}
}
И мой основной класс находится в: src/RSSFeedPHP/RSSFeedPHP.php. Однако, когда я пытаюсь загрузить его в свое приложение laravel:
use joelwmale\RSSFeedPHP;
Я получил:
"Class 'joelwmale\RSSFeedPHP' not found"
Хотя мне это требовалось в моем приложении laravel. Я вижу папку joelwmale внутри vendor, а также мой пакет и его файл composer.
Должно быть что-то не так с composer.json или с тем, как я настроил проект, но я не могу этого понять.
Любые идеи?
Обновлено: ссылка репо: https://github.com/joelwmale/rss-feed-php
У меня, да, он просто ничего не печатает, кроме "Сброс автозагрузки" :(
Предлагаю вам внимательно прочитать о том, как работает PSR-4: php-fig.org/psr/psr-4.
Я понимаю, как это работает. Ваш комментарий не очень помогает, так как я уже слежу за PSR-4. Я даже посмотрел на файл композитора Carbon (который работает как Carbon\Carbon, но по какой-то причине это не работает для меня. Прямо сейчас я могу заставить его работать, выполняя use RSSFeedPHP\RSSFeedPHP, но я хочу достичь пространства имен vendor/package, например: use joelwmale\RSSFeedPHP






"autoload": {
"psr-4": {
"RSSFeedPHP\\": "src/RSSFeedPHP/"
}
},
Это зарегистрирует ваш класс в пространстве имен RSSFeedPHP. Все, что находится в каталоге src / RSSFeedPHP /, теперь может быть загружено, как если бы оно находилось в этом пространстве имен. Попробуйте использовать
use RSSFeedPHP\RSSFeedPHP;
Обратите внимание, что имя вашего класса должно быть RSSFeedPHP, если ваш файл называется RSSFeedPHP.php, и его пространство имен, таким образом, также должно быть RSSFeedPHP, т.е.
<?php
namespace RSSFeedPHP;
class RSSFeedPHP {}
Как мне следовать типичному пространству имен vendor/package? Раньше у меня был joelwmale/RSSFeedPHP, но затем, когда я использовал пространство имен, которое мне нужно было сделать: use joelwmale/RSSFeedPHP/RSSFeedPHP, я просто хочу иметь возможность: use joelwmale/RSSFeedPHP, и он автоматически загружает класс. Я добавил свое репозиторий на github в исходное сообщение, извините.
Вы можете использовать любое пространство имен, какое захотите. Имя, которое заканчивается в каталоге /продавец, является тем именем, которое вы указываете под ключом name в composer.json. Например. если name вашего пакета - joelwmale/rssfeed, тогда вы увидите каталог / продавец / joelwmale / rssfeed. Вы можете использовать любое пространство имен там, но рекомендуется выбрать уникальное для вашей упаковки, например Joelwmale. Затем вы можете выпустить use Joelwmale/RSSFeedPHP; или use Joelwmale/Feed/RSSFeed; или что-то еще, если вы хотите «подпаковать».
Ага полностью понял. Если бы я хотел, чтобы мое пространство имен было use joelwmale/RSSFeedPHP;, как бы я смог добиться этого с помощью composer.json в файле выше? Проблема с банкоматом в том, что я могу заставить это работать, но мне нужно сделать: use joelwmale/RSSFeedPHP/RSSFeedPHP, чтобы использовать основной класс. Я думал, что можно как-то сказать композитору, если класс не предоставлен, чтобы затем использовать этот класс. Итак, что делать: use joelwmale/RSSFeedPHP автоматически загрузит файл RSSFeedPHP.php? и поэтому доступны статические методы.
Было бы. Если RSSFeedPHP.php находится в src / RSSFeedPHP, и ваш композитор говорит - под ключом psr-4 - "RSSFeedPHP\\": "src/RSSFeedPHP/", то, когда вы вызываете use RSSFeedPHP/RSSFeedPHP;, он загрузит ваш класс. Итак, чтобы изменить это пространство имен, измените "RSSFeedPHP\\": "src/RSSFeedPHP/" на "joelwmale\\": "src/RSSFeedPHP/", и вы сможете вызвать use joelwmale\RSSFeedPHP;.
Ах, это имеет смысл. Красивый. Спасибо большое за помощь!
Вы запускали
composer dump-autoloadи проверяли вывод?