Thanks so much for the fast reply Mark!
The classes were generated and are present in the src/Dto/
folder - I used the command:
bin/cake dto generate
Stack Trace just shows it failing in the Controller:
Request URL: /vehicles/
Client IP: 172.19.0.1
2023-11-30 02:38:46 error: [Error] Class "App\Dto\CarDto" not found in /var/www/html/src/Controller/VehiclesController.php on line 30
Stack Trace:
- /var/www/html/vendor/cakephp/cakephp/src/Controller/Controller.php:498
- /var/www/html/vendor/cakephp/cakephp/src/Controller/ControllerFactory.php:139
- /var/www/html/vendor/cakephp/cakephp/src/Controller/ControllerFactory.php:114
- /var/www/html/vendor/cakephp/cakephp/src/Http/BaseApplication.php:332
- /var/www/html/vendor/cakephp/cakephp/src/Http/Runner.php:86
- /var/www/html/vendor/cakephp/cakephp/src/Http/Middleware/CsrfProtectionMiddleware.php:169
- /var/www/html/vendor/cakephp/cakephp/src/Http/Runner.php:82
- /var/www/html/vendor/cakephp/cakephp/src/Http/Middleware/BodyParserMiddleware.php:157
- /var/www/html/vendor/cakephp/cakephp/src/Http/Runner.php:82
- /var/www/html/vendor/cakephp/cakephp/src/Routing/Middleware/RoutingMiddleware.php:118
- /var/www/html/vendor/cakephp/cakephp/src/Http/Runner.php:82
- /var/www/html/vendor/cakephp/cakephp/src/Routing/Middleware/AssetMiddleware.php:69
- /var/www/html/vendor/cakephp/cakephp/src/Http/Runner.php:82
- /var/www/html/vendor/cakephp/cakephp/src/Error/Middleware/ErrorHandlerMiddleware.php:115
- /var/www/html/vendor/cakephp/cakephp/src/Http/Runner.php:82
- /var/www/html/vendor/cakephp/debug_kit/src/Middleware/DebugKitMiddleware.php:60
- /var/www/html/vendor/cakephp/cakephp/src/Http/Runner.php:82
- /var/www/html/vendor/cakephp/cakephp/src/Http/Runner.php:67
- /var/www/html/vendor/cakephp/cakephp/src/Http/Server.php:103
- /var/www/html/webroot/index.php:37
- [main]:
The Include from DebugKit shows it’s loading the plugin:
[
'app' => [
'Controller' => [
(int) 0 => 'APP/Controller/VehiclesController.php',
(int) 1 => 'APP/Controller/AppController.php',
(int) 2 => 'APP/Controller/ErrorController.php',
],
'View' => [
(int) 0 => 'APP/View/AppView.php',
],
'other' => [
(int) 0 => 'APP/Application.php',
],
],
'cake' => [
'Cache' => [
(int) 0 => 'CAKE/Cache/Cache.php',
(int) 1 => 'CAKE/Cache/CacheRegistry.php',
(int) 2 => 'CAKE/Cache/CacheEngine.php',
(int) 3 => 'CAKE/Cache/CacheEngineInterface.php',
(int) 4 => 'CAKE/Cache/Engine/FileEngine.php',
],
'Collection' => [
(int) 0 => 'CAKE/Collection/functions.php',
(int) 1 => 'CAKE/Collection/CollectionInterface.php',
(int) 2 => 'CAKE/Collection/functions_global.php',
],
'Component' => [
(int) 0 => 'CAKE/Controller/Component/FlashComponent.php',
],
'Configure' => [
(int) 0 => 'CAKE/Core/Configure/Engine/PhpConfig.php',
(int) 1 => 'CAKE/Core/Configure/FileConfigTrait.php',
(int) 2 => 'CAKE/Core/Configure/ConfigEngineInterface.php',
],
'Controller' => [
(int) 0 => 'CAKE/Controller/ControllerFactory.php',
(int) 1 => 'CAKE/Controller/Controller.php',
(int) 2 => 'CAKE/Controller/ComponentRegistry.php',
(int) 3 => 'CAKE/Controller/Component.php',
],
'Database' => [
(int) 0 => 'CAKE/Database/Query/SelectQuery.php',
(int) 1 => 'CAKE/Database/Query.php',
(int) 2 => 'CAKE/Database/TypeMapTrait.php',
(int) 3 => 'CAKE/Database/ExpressionInterface.php',
(int) 4 => 'CAKE/Database/Connection.php',
(int) 5 => 'CAKE/Database/Driver.php',
(int) 6 => 'CAKE/Database/Driver/Mysql.php',
(int) 7 => 'CAKE/Database/Driver/Sqlite.php',
(int) 8 => 'CAKE/Database/Driver/TupleComparisonTranslatorTrait.php',
],
'Datasource' => [
(int) 0 => 'CAKE/Datasource/FactoryLocator.php',
(int) 1 => 'CAKE/Datasource/Locator/AbstractLocator.php',
(int) 2 => 'CAKE/Datasource/Locator/LocatorInterface.php',
(int) 3 => 'CAKE/Datasource/RulesAwareTrait.php',
(int) 4 => 'CAKE/Datasource/RepositoryInterface.php',
(int) 5 => 'CAKE/Datasource/QueryInterface.php',
(int) 6 => 'CAKE/Datasource/ResultSetInterface.php',
(int) 7 => 'CAKE/Datasource/ConnectionManager.php',
(int) 8 => 'CAKE/Datasource/ConnectionRegistry.php',
(int) 9 => 'CAKE/Datasource/ConnectionInterface.php',
],
'Error' => [
(int) 0 => 'CAKE/Error/functions.php',
(int) 1 => 'CAKE/Error/functions_global.php',
(int) 2 => 'CAKE/Error/ErrorTrap.php',
(int) 3 => 'CAKE/Error/ExceptionTrap.php',
(int) 4 => 'CAKE/Error/Middleware/ErrorHandlerMiddleware.php',
(int) 5 => 'CAKE/Error/ErrorLogger.php',
(int) 6 => 'CAKE/Error/ErrorLoggerInterface.php',
(int) 7 => 'CAKE/Error/Debugger.php',
(int) 8 => 'CAKE/Error/Renderer/WebExceptionRenderer.php',
(int) 9 => 'CAKE/Error/ExceptionRendererInterface.php',
(int) 10 => 'CAKE/Error/Debug/DebugContext.php',
(int) 11 => 'CAKE/Error/Debug/ClassNode.php',
(int) 12 => 'CAKE/Error/Debug/NodeInterface.php',
(int) 13 => 'CAKE/Error/Debug/ConsoleFormatter.php',
(int) 14 => 'CAKE/Error/Debug/FormatterInterface.php',
(int) 15 => 'CAKE/Error/Debug/HtmlFormatter.php',
(int) 16 => 'CAKE/Error/Debug/dumpHeader.html',
(int) 17 => 'CAKE/Error/Debug/ArrayNode.php',
(int) 18 => 'CAKE/Error/Debug/PropertyNode.php',
(int) 19 => 'CAKE/Error/Debug/ScalarNode.php',
(int) 20 => 'CAKE/Error/Debug/ArrayItemNode.php',
(int) 21 => 'CAKE/Error/Debug/SpecialNode.php',
(int) 22 => 'CAKE/Error/Debug/ReferenceNode.php',
],
'Event' => [
(int) 0 => 'CAKE/Event/EventDispatcherTrait.php',
(int) 1 => 'CAKE/Event/EventListenerInterface.php',
(int) 2 => 'CAKE/Event/EventDispatcherInterface.php',
(int) 3 => 'CAKE/Event/EventManager.php',
(int) 4 => 'CAKE/Event/EventManagerInterface.php',
(int) 5 => 'CAKE/Event/Event.php',
(int) 6 => 'CAKE/Event/EventInterface.php',
],
'I18n' => [
(int) 0 => 'CAKE/I18n/functions.php',
(int) 1 => 'CAKE/I18n/functions_global.php',
],
'Log' => [
(int) 0 => 'CAKE/Log/Log.php',
(int) 1 => 'CAKE/Log/Engine/ArrayLog.php',
(int) 2 => 'CAKE/Log/Engine/BaseLog.php',
(int) 3 => 'CAKE/Log/Formatter/DefaultFormatter.php',
(int) 4 => 'CAKE/Log/Formatter/AbstractFormatter.php',
(int) 5 => 'CAKE/Log/LogTrait.php',
(int) 6 => 'CAKE/Log/LogEngineRegistry.php',
(int) 7 => 'CAKE/Log/Engine/FileLog.php',
],
'ORM' => [
(int) 0 => 'CAKE/ORM/bootstrap.php',
(int) 1 => 'CAKE/ORM/Locator/TableLocator.php',
(int) 2 => 'CAKE/ORM/Locator/LocatorInterface.php',
(int) 3 => 'CAKE/ORM/Table.php',
(int) 4 => 'CAKE/ORM/Query/SelectQuery.php',
(int) 5 => 'CAKE/ORM/Query/CommonQueryTrait.php',
(int) 6 => 'CAKE/ORM/Query.php',
(int) 7 => 'CAKE/ORM/Query/QueryFactory.php',
(int) 8 => 'CAKE/ORM/Locator/LocatorAwareTrait.php',
],
'Routing' => [
(int) 0 => 'CAKE/Routing/functions.php',
(int) 1 => 'CAKE/Routing/RoutingApplicationInterface.php',
(int) 2 => 'CAKE/Routing/Router.php',
(int) 3 => 'CAKE/Routing/RouteCollection.php',
(int) 4 => 'CAKE/Routing/functions_global.php',
(int) 5 => 'CAKE/Routing/Middleware/AssetMiddleware.php',
(int) 6 => 'CAKE/Routing/Middleware/RoutingMiddleware.php',
(int) 7 => 'CAKE/Routing/RouteBuilder.php',
(int) 8 => 'CAKE/Routing/Route/DashedRoute.php',
(int) 9 => 'CAKE/Routing/Route/Route.php',
(int) 10 => 'CAKE/Routing/Asset.php',
],
'Utility' => [
(int) 0 => 'CAKE/Utility/bootstrap.php',
(int) 1 => 'CAKE/Utility/Inflector.php',
(int) 2 => 'CAKE/Utility/Hash.php',
(int) 3 => 'CAKE/Utility/Security.php',
],
'Validation' => [
(int) 0 => 'CAKE/Validation/ValidatorAwareTrait.php',
(int) 1 => 'CAKE/Validation/ValidatorAwareInterface.php',
],
'View' => [
(int) 0 => 'CAKE/View/ViewVarsTrait.php',
(int) 1 => 'CAKE/View/ViewBuilder.php',
(int) 2 => 'CAKE/View/View.php',
(int) 3 => 'CAKE/View/CellTrait.php',
(int) 4 => 'CAKE/View/ViewBlock.php',
(int) 5 => 'CAKE/View/HelperRegistry.php',
(int) 6 => 'CAKE/View/Helper.php',
(int) 7 => 'CAKE/View/Helper/HtmlHelper.php',
(int) 8 => 'CAKE/View/StringTemplateTrait.php',
(int) 9 => 'CAKE/View/StringTemplate.php',
(int) 10 => 'CAKE/View/Helper/UrlHelper.php',
],
'other' => [
(int) 0 => 'CAKE/Core/functions.php',
(int) 1 => 'CAKE/Http/Server.php',
(int) 2 => 'CAKE/Http/BaseApplication.php',
(int) 3 => 'CAKE/Core/ConsoleApplicationInterface.php',
(int) 4 => 'CAKE/Core/ContainerApplicationInterface.php',
(int) 5 => 'CAKE/Core/HttpApplicationInterface.php',
(int) 6 => 'CAKE/Core/PluginApplicationInterface.php',
(int) 7 => 'CAKE/Core/Plugin.php',
(int) 8 => 'CAKE/Core/PluginCollection.php',
(int) 9 => 'CAKE/Core/Configure.php',
(int) 10 => 'CAKE/Http/Runner.php',
(int) 11 => 'CAKE/functions.php',
(int) 12 => 'CAKE/Core/functions_global.php',
(int) 13 => 'CAKE/Core/InstanceConfigTrait.php',
(int) 14 => 'CAKE/Core/StaticConfigTrait.php',
(int) 15 => 'CAKE/Mailer/TransportFactory.php',
(int) 16 => 'CAKE/Mailer/Mailer.php',
(int) 17 => 'CAKE/Http/ServerRequest.php',
(int) 18 => 'CAKE/Core/BasePlugin.php',
(int) 19 => 'CAKE/Core/PluginInterface.php',
(int) 20 => 'CAKE/Core/ObjectRegistry.php',
(int) 21 => 'CAKE/Http/ServerRequestFactory.php',
(int) 22 => 'CAKE/Http/UriFactory.php',
(int) 23 => 'CAKE/Http/Session.php',
(int) 24 => 'CAKE/Http/FlashMessage.php',
(int) 25 => 'CAKE/Http/MiddlewareQueue.php',
(int) 26 => 'CAKE/Core/Container.php',
(int) 27 => 'CAKE/Core/ContainerInterface.php',
(int) 28 => 'CAKE/Http/Middleware/BodyParserMiddleware.php',
(int) 29 => 'CAKE/Http/Middleware/CsrfProtectionMiddleware.php',
(int) 30 => 'CAKE/Core/App.php',
(int) 31 => 'CAKE/Mailer/Transport/MailTransport.php',
(int) 32 => 'CAKE/Mailer/AbstractTransport.php',
(int) 33 => 'CAKE/Http/ControllerFactoryInterface.php',
(int) 34 => 'CAKE/Http/Response.php',
(int) 35 => 'CAKE/Http/Cookie/CookieCollection.php',
],
],
'plugins' => [
'CakeDto' => [
'other' => [
(int) 0 => 'CakeDto/src/CakeDtoPlugin.php',
],
],
'DebugKit' => [
'Cache' => [
(int) 0 => 'DebugKit/src/Cache/Engine/DebugEngine.php',
],
'Config' => [
(int) 0 => 'DebugKit/config/bootstrap.php',
(int) 1 => 'DebugKit/config/routes.php',
],
'Database' => [
(int) 0 => 'DebugKit/src/Database/Log/DebugLog.php',
],
'Log' => [
(int) 0 => 'DebugKit/src/Log/Engine/DebugKitLog.php',
],
'other' => [
(int) 0 => 'DebugKit/src/DebugKitPlugin.php',
(int) 1 => 'DebugKit/src/ToolbarService.php',
(int) 2 => 'DebugKit/src/Panel/PanelRegistry.php',
(int) 3 => 'DebugKit/src/DebugPanel.php',
(int) 4 => 'DebugKit/src/Middleware/DebugKitMiddleware.php',
(int) 5 => 'DebugKit/src/Panel/CachePanel.php',
(int) 6 => 'DebugKit/src/Panel/SessionPanel.php',
(int) 7 => 'DebugKit/src/Panel/RequestPanel.php',
(int) 8 => 'DebugKit/src/Panel/SqlLogPanel.php',
(int) 9 => 'DebugKit/src/Panel/TimerPanel.php',
(int) 10 => 'DebugKit/src/Panel/LogPanel.php',
(int) 11 => 'DebugKit/src/Panel/VariablesPanel.php',
(int) 12 => 'DebugKit/src/Panel/EnvironmentPanel.php',
(int) 13 => 'DebugKit/src/Panel/IncludePanel.php',
(int) 14 => 'DebugKit/src/DebugInclude.php',
(int) 15 => 'DebugKit/src/Panel/HistoryPanel.php',
(int) 16 => 'DebugKit/src/Panel/RoutesPanel.php',
(int) 17 => 'DebugKit/src/Panel/PackagesPanel.php',
(int) 18 => 'DebugKit/src/Panel/MailPanel.php',
(int) 19 => 'DebugKit/src/Panel/DeprecationsPanel.php',
(int) 20 => 'DebugKit/src/DebugMemory.php',
(int) 21 => 'DebugKit/src/DebugTimer.php',
],
],
],
'vendor' => [
'cakephp/cakephp' => [
(int) 0 => 'config/bootstrap.php',
(int) 1 => 'templates/layout/dev_error.php',
(int) 2 => 'templates/element/dev_error_stacktrace.php',
(int) 3 => 'config/config.php',
],
'composer/composer' => [
(int) 0 => 'src/Composer/Json/JsonFile.php',
(int) 1 => 'src/Composer/Util/Filesystem.php',
],
'composer/pcre' => [
(int) 0 => 'src/Preg.php',
],
'laminas/laminas-diactoros' => [
(int) 0 => 'src/functions/create_uploaded_file.php',
(int) 1 => 'src/functions/marshal_headers_from_sapi.php',
(int) 2 => 'src/functions/marshal_method_from_sapi.php',
(int) 3 => 'src/functions/marshal_protocol_version_from_sapi.php',
(int) 4 => 'src/functions/normalize_server.php',
(int) 5 => 'src/functions/normalize_uploaded_files.php',
(int) 6 => 'src/functions/parse_cookie_header.php',
(int) 7 => 'src/UriFactory.php',
(int) 8 => 'src/Uri.php',
(int) 9 => 'src/Stream.php',
(int) 10 => 'src/MessageTrait.php',
],
'league/container' => [
(int) 0 => 'src/Container.php',
(int) 1 => 'src/DefinitionContainerInterface.php',
(int) 2 => 'src/Definition/DefinitionAggregate.php',
(int) 3 => 'src/ContainerAwareTrait.php',
(int) 4 => 'src/Definition/DefinitionAggregateInterface.php',
(int) 5 => 'src/ContainerAwareInterface.php',
(int) 6 => 'src/ServiceProvider/ServiceProviderAggregate.php',
(int) 7 => 'src/ServiceProvider/ServiceProviderAggregateInterface.php',
(int) 8 => 'src/Inflector/InflectorAggregate.php',
(int) 9 => 'src/Inflector/InflectorAggregateInterface.php',
(int) 10 => 'src/Definition/Definition.php',
(int) 11 => 'src/Argument/ArgumentResolverTrait.php',
(int) 12 => 'src/Argument/ArgumentResolverInterface.php',
(int) 13 => 'src/Definition/DefinitionInterface.php',
],
'myclabs/deep-copy' => [
(int) 0 => 'src/DeepCopy/deep_copy.php',
],
'phpunit/phpunit' => [
(int) 0 => 'src/Framework/Assert/Functions.php',
],
'psr/container' => [
(int) 0 => 'src/ContainerInterface.php',
],
'psr/http-factory' => [
(int) 0 => 'src/ServerRequestFactoryInterface.php',
(int) 1 => 'src/UriFactoryInterface.php',
],
'psr/http-message' => [
(int) 0 => 'src/ServerRequestInterface.php',
(int) 1 => 'src/RequestInterface.php',
(int) 2 => 'src/MessageInterface.php',
(int) 3 => 'src/UriInterface.php',
(int) 4 => 'src/StreamInterface.php',
(int) 5 => 'src/ResponseInterface.php',
],
'psr/http-server-handler' => [
(int) 0 => 'src/RequestHandlerInterface.php',
],
'psr/http-server-middleware' => [
(int) 0 => 'src/MiddlewareInterface.php',
],
'psr/log' => [
(int) 0 => 'src/AbstractLogger.php',
(int) 1 => 'src/LoggerTrait.php',
(int) 2 => 'src/LoggerInterface.php',
(int) 3 => 'src/LoggerAwareTrait.php',
],
'psr/simple-cache' => [
(int) 0 => 'src/CacheInterface.php',
],
'react/promise' => [
(int) 0 => 'src/functions_include.php',
(int) 1 => 'src/functions.php',
],
'symfony/deprecation-contracts' => [
(int) 0 => 'function.php',
],
'symfony/polyfill-ctype' => [
(int) 0 => 'bootstrap.php',
(int) 1 => 'bootstrap80.php',
],
'symfony/polyfill-intl-grapheme' => [
(int) 0 => 'bootstrap.php',
],
'symfony/polyfill-intl-normalizer' => [
(int) 0 => 'bootstrap.php',
(int) 1 => 'bootstrap80.php',
],
'symfony/polyfill-mbstring' => [
(int) 0 => 'bootstrap.php',
(int) 1 => 'bootstrap80.php',
],
'symfony/polyfill-php73' => [
(int) 0 => 'bootstrap.php',
],
'symfony/polyfill-php80' => [
(int) 0 => 'bootstrap.php',
],
'symfony/polyfill-php81' => [
(int) 0 => 'bootstrap.php',
],
'symfony/string' => [
(int) 0 => 'Resources/functions.php',
],
],
'other' => [
(int) 0 => 'ROOT/webroot/index.php',
(int) 1 => 'ROOT/vendor/autoload.php',
(int) 2 => 'ROOT/vendor/composer/autoload_real.php',
(int) 3 => 'ROOT/vendor/composer/platform_check.php',
(int) 4 => 'ROOT/vendor/composer/ClassLoader.php',
(int) 5 => 'ROOT/vendor/composer/autoload_static.php',
(int) 6 => 'ROOT/vendor/cakephp-plugins.php',
(int) 7 => 'ROOT/config/bootstrap.php',
(int) 8 => 'ROOT/config/paths.php',
(int) 9 => 'ROOT/config/app.php',
(int) 10 => 'ROOT/config/app_local.php',
(int) 11 => 'ROOT/config/plugins.php',
(int) 12 => 'ROOT/config/routes.php',
(int) 13 => 'ROOT/templates/Error/error.php',
],
]
As a summary here were the steps I did:
- In an Apache + PHP 8.2 docker container, installed CakePHP 5 via Composer
- Created a basic ‘vehicles’ DB table and baked it
- Installed the Dto Plugin:
composer require dereuromark/cakephp-dto
- Loaded the plugin:
bin/cake plugin load CakeDto
- Ran init:
bin/cake dto init
- Created
config/dto/Car.dto.xml
and copied in the XML from the ReadMe
- Ran
bin/cake dto generate
- files were generated in src/Dto/
as expected
- Added use
App\Dto\CarDto; use App\Dto\CarsDto;
to VehiclesController.php
- Added
$carDto = new CarDto();
to the index()
function
Thanks so much for your help!