Разработка пакета Laravel 8 - класс Route Target не существует

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

В настоящее время я разрабатываю пакет под Laravel ^ 8.12, ниже содержимого функции, которая регистрирует мои маршруты:

protected function registerRoutes(): void
{
    Route::prefix('workflowmakr')
        ->namespace('AlvariumDigital\WorkflowMakr\Http\Controllers')
        ->as('workflowmakr.')
        ->middleware(config('workflowmakr.routes_middleware'))
        ->group(__DIR__ . '/../routes/api.php');
}

А ниже содержимое файла routes/api.php:

<?php

use Illuminate\Support\Facades\Route;

Route::resource('actions', 'ActionController')->except(['created', 'edit']);
Route::resource('scenarios', 'ScenarioController')->except(['created', 'edit']);
Route::resource('statuses', 'StatusController')->except(['created', 'edit']);
Route::resource('transitions', 'TransitionController')->except(['created', 'edit']);

Для лучшего представления архитектуры проекта ниже приведен скриншот папки packages, содержащей разрабатываемый пакет:

И, наконец, ниже composer.json объявляет мой пакет:

...
   "extra": {
        "laravel": {
            "providers": [
                "AlvariumDigital\\WorkflowMakr\\WorkflowMakrServiceProvider"
            ]
        }
    },
    "autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/",

            "AlvariumDigital\\WorkflowMakr\\":  "packages/AlvariumDigital/WorkflowMakr/src/"
        }
    },
...

Когда я выполняю команду php artisan route:list для просмотра всех своих маршрутов, я получаю эту ошибку:

$> php artisan route:list

   Illuminate\Contracts\Container\BindingResolutionException 

  Target class [AlvariumDigital\WorkflowMakr\Http\Controllers\ActionController] does not exist.

  at D:\Films\R_D\Laravel packages\workflow-makr\vendor\laravel\framework\src\Illuminate\Container\Container.php:832
    828▕
    829▕         try {
    830▕             $reflector = new ReflectionClass($concrete);
    831▕         } catch (ReflectionException $e) {
  ➜ 832▕             throw new BindingResolutionException("Target class [$concrete] does not exist.", 0, $e);
    833▕         }
    834▕
    835▕         // If the type is not instantiable, the developer is attempting to resolve
    836▕         // an abstract type such as an Interface or Abstract Class and there is

  1   [internal]:0
      Illuminate\Foundation\Console\RouteListCommand::Illuminate\Foundation\Console\{closure}(Object(Illuminate\Routing\Route))

  2   D:\Films\R_D\Laravel packages\workflow-makr\vendor\laravel\framework\src\Illuminate\Container\Container.php:830
      ReflectionException::("Class AlvariumDigital\WorkflowMakr\Http\Controllers\ActionController does not exist")

РЕДАКТИРОВАТЬ

Ниже приведено содержимое файла ActionController:

<?php

namespace AlvariumDigital\WorkflowMakr\Http\Controllers;

use AlvariumDigital\Models\Action;
use AlvariumDigital\WorkflowMakr\Helpers\Constants;
use Illuminate\Routing\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;

class ActionController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function index()
    {
        $query = Action::query();
        if (config('workflowmakr.pagination_size') == -1) {
            return response()->json($query->get(), 200);
        }
        return response()->json($query->paginate(config('workflowmakr.pagination_size')), 200);
    }

   // ...
}

РЕДАКТИРОВАТЬ 2

Содержимое пакета composer.json файла:

{
    "name": "AlvariumDigital/WorkflowMakr",
    "description": "Generalize the management of your workflows",
    "type": "library",
    "license": "MIT",
    "authors": [
        {
            "name": "Alvarium Digital",
            "email": "[email protected]",
            "homepage": "http://www.alvariumdigital.com",
            "role": "Corporate"
        },
        {
            "name": "EL OUFIR Hatim",
            "email": "[email protected]",
            "homepage": "https://www.linkedin.com/in/eloufirhatim/",
            "role": "Developer"
        }
    ],
    "support": {
        "email": "[email protected]"
    },
    "minimum-stability": "dev",
    "require": {}
}

Я сделал что-то неправильное или неполное? Вы можете запросить более подробную информацию, если это необходимо.

Спасибо

какое пространство имен определено в этом файле php для этого контроллера?

lagbox 14.12.2020 17:26

@lagbox спасибо за ваш ответ, я только что добавил содержимое файла в свой пост.

EL OUFIR Hatim 14.12.2020 17:28

Кстати, Route::resource без «создать» и «редактировать» то же самое, что и Route::apiResource

lagbox 14.12.2020 17:30

@lagbox за apiResource приятно знать, спасибо

EL OUFIR Hatim 14.12.2020 17:31

Вы запускали composer dump-autoload после добавления записи пространства имен (psr4) в composer.json?

Donkarnash 14.12.2020 17:32

@Donkarnash Да, я бегал composer dump-autoload, php artisan config:cache и php artisan route:clear, если быть более точным.

EL OUFIR Hatim 14.12.2020 17:34

косые черты в пространстве имен немного сомнительны ... это точный код в поставщике услуг, регистрирующий эти маршруты? AlvariumDigital/WorkflowMakr/Http/Controllers\ActionControll‌​er все должно быть \

lagbox 14.12.2020 17:34

@lagbox да, я тоже это подозревал, я уже пробовал /, \ и \\, но всегда одна и та же ошибка

EL OUFIR Hatim 14.12.2020 17:36

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

lagbox 14.12.2020 17:39

@lagbox только что попытался удалить первый маршрут (связанный с ActionController) и получил ту же ошибку на следующем контроллере Target class [AlvariumDigital\WorkflowMakr\Http\Controllers\ScenarioContr‌​oller] does not exist.

EL OUFIR Hatim 14.12.2020 17:40

Только что заметил, что в вашем пакете также есть composer.json - какие в нем записи psr4? Если вы структурируете его как отдельный пакет, почему бы не использовать репозитории путей компоновщика, чтобы требовать пакет в вашем приложении, а не просто отображать пространство имен.

Donkarnash 14.12.2020 17:41

@Donkarnash Я только что добавил содержимое файла пакета composer.json в свой пост как РЕДАКТИРОВАТЬ 2, но я не понимаю вашу заметку. Если вы структурируете его как отдельный пакет, почему бы не использовать репозитории путей композитора, чтобы требовать пакет в вашем приложении, а не просто сопоставление пространства имен

EL OUFIR Hatim 14.12.2020 17:44

Ну, вы можете иметь запись psr4 в composer.json вашего пакета, а затем "repositories": [ {"type": "path", "url":"packages/AlvariumDigital/WorkflowMakr"}]в composer.json вашего приложения, а затем запустить composer require AlvariumDigital/WorkflowMakr, чтобы запросить ваш пакет в приложении. Однако, как предложил @lagbox, ваши файлы должны находиться в src, если вы указываете пространство имен на каталог src

Donkarnash 14.12.2020 17:49

@Donkarnash хорошо, я вижу, я тоже попробую ваше предложение, оно имеет больше смысла, и для решения с лагбоксом, да, это помогло :) спасибо

EL OUFIR Hatim 14.12.2020 17:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
14
1 060
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы неправильно структурировали этот каталог. У вас есть автозагрузка PSR4, загружающая каталог src в качестве пространства имен. Ваши контроллеры не находятся в папке src, там находится только поставщик услуг. Таким образом, для композитора нет файлов, которые он мог бы найти и автозагрузить на основе вашей автозагрузки PSR4.

СПАСИБО, все работает, я переместил все свои папки в папку src/, и все работает, еще раз спасибо

EL OUFIR Hatim 14.12.2020 17:47

@ELOUFIRHatim только что увидел ваш комментарий к моему ответу о проблеме с контроллером, не найденной ... ну, рад, что тогда все получилось :-)

lagbox 14.12.2020 18:35

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