Проблема с пространством имен в пользовательском пакете php, невозможно "использовать joelwmale / RSSFeedPHP"

Я создал свой собственный пакет композитора, но у меня возникают проблемы с загрузкой и использованием его вне самого пакета (то есть в моем приложении 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

Вы запускали composer dump-autoload и проверяли вывод?

Calos 28.12.2018 08:56

У меня, да, он просто ничего не печатает, кроме "Сброс автозагрузки" :(

joelwmale 28.12.2018 09:15

Предлагаю вам внимательно прочитать о том, как работает PSR-4: php-fig.org/psr/psr-4.

GiamPy 28.12.2018 09:22

Я понимаю, как это работает. Ваш комментарий не очень помогает, так как я уже слежу за PSR-4. Я даже посмотрел на файл композитора Carbon (который работает как Carbon\Carbon, но по какой-то причине это не работает для меня. Прямо сейчас я могу заставить его работать, выполняя use RSSFeedPHP\RSSFeedPHP, но я хочу достичь пространства имен vendor/package, например: use joelwmale\RSSFeedPHP

joelwmale 28.12.2018 09:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
83
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
"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 в исходное сообщение, извините.

joelwmale 28.12.2018 09:14

Вы можете использовать любое пространство имен, какое захотите. Имя, которое заканчивается в каталоге /продавец, является тем именем, которое вы указываете под ключом name в composer.json. Например. если name вашего пакета - joelwmale/rssfeed, тогда вы увидите каталог / продавец / joelwmale / rssfeed. Вы можете использовать любое пространство имен там, но рекомендуется выбрать уникальное для вашей упаковки, например Joelwmale. Затем вы можете выпустить use Joelwmale/RSSFeedPHP; или use Joelwmale/Feed/RSSFeed; или что-то еще, если вы хотите «подпаковать».

minitauros 28.12.2018 09:31

Ага полностью понял. Если бы я хотел, чтобы мое пространство имен было use joelwmale/RSSFeedPHP;, как бы я смог добиться этого с помощью composer.json в файле выше? Проблема с банкоматом в том, что я могу заставить это работать, но мне нужно сделать: use joelwmale/RSSFeedPHP/RSSFeedPHP, чтобы использовать основной класс. Я думал, что можно как-то сказать композитору, если класс не предоставлен, чтобы затем использовать этот класс. Итак, что делать: use joelwmale/RSSFeedPHP автоматически загрузит файл RSSFeedPHP.php? и поэтому доступны статические методы.

joelwmale 28.12.2018 09:51

Было бы. Если RSSFeedPHP.php находится в src / RSSFeedPHP, и ваш композитор говорит - под ключом psr-4 - "RSSFeedPHP\\": "src/RSSFeedPHP/", то, когда вы вызываете use RSSFeedPHP/RSSFeedPHP;, он загрузит ваш класс. Итак, чтобы изменить это пространство имен, измените "RSSFeedPHP\\": "src/RSSFeedPHP/" на "joelwmale\\": "src/RSSFeedPHP/", и вы сможете вызвать use joelwmale\RSSFeedPHP;.

minitauros 28.12.2018 10:02

Ах, это имеет смысл. Красивый. Спасибо большое за помощь!

joelwmale 28.12.2018 10:10

Другие вопросы по теме