Я знаю, что название темы похоже на другие вопросы, но я просмотрел множество тем в 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": {}
}
Я сделал что-то неправильное или неполное? Вы можете запросить более подробную информацию, если это необходимо.
Спасибо
@lagbox спасибо за ваш ответ, я только что добавил содержимое файла в свой пост.
Кстати, Route::resource
без «создать» и «редактировать» то же самое, что и Route::apiResource
@lagbox за apiResource
приятно знать, спасибо
Вы запускали composer dump-autoload
после добавления записи пространства имен (psr4) в composer.json?
@Donkarnash Да, я бегал composer dump-autoload
, php artisan config:cache
и php artisan route:clear
, если быть более точным.
косые черты в пространстве имен немного сомнительны ... это точный код в поставщике услуг, регистрирующий эти маршруты? AlvariumDigital/WorkflowMakr/Http/Controllers\ActionController
все должно быть \
@lagbox да, я тоже это подозревал, я уже пробовал /, \ и \\, но всегда одна и та же ошибка
если вы удалите определение маршрута для этого ресурса, будут ли зарегистрированы остальные маршруты или вы получите ту же ошибку для следующего контроллера?
@lagbox только что попытался удалить первый маршрут (связанный с ActionController
) и получил ту же ошибку на следующем контроллере Target class [AlvariumDigital\WorkflowMakr\Http\Controllers\ScenarioController] does not exist.
Только что заметил, что в вашем пакете также есть composer.json - какие в нем записи psr4? Если вы структурируете его как отдельный пакет, почему бы не использовать репозитории путей компоновщика, чтобы требовать пакет в вашем приложении, а не просто отображать пространство имен.
@Donkarnash Я только что добавил содержимое файла пакета composer.json
в свой пост как РЕДАКТИРОВАТЬ 2, но я не понимаю вашу заметку. Если вы структурируете его как отдельный пакет, почему бы не использовать репозитории путей композитора, чтобы требовать пакет в вашем приложении, а не просто сопоставление пространства имен
Ну, вы можете иметь запись psr4 в composer.json вашего пакета, а затем "repositories": [ {"type": "path", "url":"packages/AlvariumDigital/WorkflowMakr"}]
в composer.json вашего приложения, а затем запустить composer require AlvariumDigital/WorkflowMakr
, чтобы запросить ваш пакет в приложении. Однако, как предложил @lagbox, ваши файлы должны находиться в src
, если вы указываете пространство имен на каталог src
@Donkarnash хорошо, я вижу, я тоже попробую ваше предложение, оно имеет больше смысла, и для решения с лагбоксом, да, это помогло :) спасибо
Вы неправильно структурировали этот каталог. У вас есть автозагрузка PSR4, загружающая каталог src
в качестве пространства имен. Ваши контроллеры не находятся в папке src
, там находится только поставщик услуг. Таким образом, для композитора нет файлов, которые он мог бы найти и автозагрузить на основе вашей автозагрузки PSR4.
СПАСИБО, все работает, я переместил все свои папки в папку src/
, и все работает, еще раз спасибо
@ELOUFIRHatim только что увидел ваш комментарий к моему ответу о проблеме с контроллером, не найденной ... ну, рад, что тогда все получилось :-)
какое пространство имен определено в этом файле php для этого контроллера?