#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) {
➜ 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
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 только что увидел ваш комментарий к моему ответу на проблему «Контроллер не найден»… что ж, рад, что тогда все получилось 🙂