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 无法正常工作