Разработка пакета Laravel 8 — целевой класс маршрута не существует

#php #laravel #routes #package #laravel-8

#php #laravel #маршруты #пакет #laravel-8

Вопрос:

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

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

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

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

 <?php

use IlluminateSupportFacadesRoute;

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 для просмотра всех моих маршрутов, я получил эту ошибку :



gt; php artisan route:list

IlluminateContractsContainerBindingResolutionException

Target class [AlvariumDigitalWorkflowMakrHttpControllersActionController] does not exist.

at D:FilmsR_DLaravel packagesworkflow-makrvendorlaravelframeworksrcIlluminateContainerContainer.php:832
828▕
829▕ try {
830$reflector = new ReflectionClass($concrete);
831▕ } catch (ReflectionException $e) {
832throw 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
IlluminateFoundationConsoleRouteListCommand::IlluminateFoundationConsole{closure}(Object(IlluminateRoutingRoute))

2 D:FilmsR_DLaravel packagesworkflow-makrvendorlaravelframeworksrcIlluminateContainerContainer.php:830
ReflectionException::("Class AlvariumDigitalWorkflowMakrHttpControllersActionController does not exist")

Редактировать

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

 <?php

namespace AlvariumDigitalWorkflowMakrHttpControllers;

use AlvariumDigitalModelsAction;
use AlvariumDigitalWorkflowMakrHelpersConstants;
use IlluminateRoutingController;
use IlluminateHttpRequest;
use IlluminateSupportFacadesValidator;

class ActionController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return IlluminateHttpJsonResponse
     */
    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": "contact@alvariumdigital.com",
            "homepage": "http://www.alvariumdigital.com",
            "role": "Corporate"
        },
        {
            "name": "EL OUFIR Hatim",
            "email": "heloufir@alvariumdigital.com",
            "homepage": "https://www.linkedin.com/in/eloufirhatim/",
            "role": "Developer"
        }
    ],
    "support": {
        "email": "heloufir@alvariumdigital.com"
    },
    "minimum-stability": "dev",
    "require": {}
}
 

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

Спасибо

Комментарии:

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

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

3. кстати, Route::resource без «create» и «edit» это то же самое, что Route::apiResource

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

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

Ответ №1:

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

Комментарии:

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

2. @ELOUFIRHatim только что увидел ваш комментарий к моему ответу на проблему «Контроллер не найден»… что ж, рад, что тогда все получилось 🙂