Laravel 8 包开发——Route Target 类不存在

Posted

技术标签:

【中文标题】Laravel 8 包开发——Route Target 类不存在【英文标题】:Laravel 8 package development - Route Target class does not exist 【发布时间】:2021-03-25 07:13:43 【问题描述】:

我知道标题主题听起来与其他问题相似,但我在 *** 上搜索了许多主题,但没有一个能解决我的问题。

我目前正在 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": "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": 

我做错了什么或不完整? 如果需要,您可以询问更多详细信息。

谢谢

【问题讨论】:

在那个 php 文件中为那个控制器定义了什么命名空间? @lagbox 感谢您的回复,我刚刚在我的帖子中添加了文件的内容。 顺便说一句,Route::resource 没有“创建”和“编辑”与Route::apiResource 相同 在 composer.json 添加命名空间 (psr4) 条目后,您是否运行了composer dump-autoload 好吧,你可以在你的包的 composer.json 中有 psr4 条目,然后在你的应用程序的 composer.json 中添加 "repositories": [ "type": "path", "url":"packages/AlvariumDigital/WorkflowMakr"],然后运行 ​​composer require AlvariumDigital/WorkflowMakr 以在应用程序中要求你的包。但是,正如@lagbox 所建议的,如果您将命名空间指向 src 目录,您的文件应该位于 src 【参考方案1】:

您的目录结构不正确。您让 PSR4 自动加载加载 src 目录作为命名空间。您的控制器不在src 文件夹中,只有服务提供者在其中。所以对于作曲家来说,没有文件可以根据您的 PSR4 自动加载来查找和自动加载。

【讨论】:

谢谢,它有效,我将所有文件夹移动到src/ 文件夹中,它有效,再次感谢 @ELOUFIRHatim 刚刚看到您对我对未找到控制器问题的回答的评论......好吧,很高兴这一切都解决了 :-)

以上是关于Laravel 8 包开发——Route Target 类不存在的主要内容,如果未能解决你的问题,请参考以下文章

laravel 8 auth Route [login] 未定义

Laravel 8 api post route 无法正常工作

刀片中的 Laravel 8 路线

Laravel 8 返回空白页

Laravel 5.3+ 中的 Route::controller() 替代方案

Laravel 8速率限制器不适用于路线