CakeDto Plugin - Class Not Found

I’ve been following the ReadMe for @dereuromark CakeDto Plugin at:

cakephp-dto/docs/README.md at master · dereuromark/cakephp-dto (github.com)

This is a fresh CakePHP 5.0.3 + PHP 8.2 install - everything is working great up until I go to use a DTO:

<?php
declare(strict_types=1);

namespace App\Controller;
use App\Dto\CarDto;
use App\Dto\CarsDto;

class VehiclesController extends AppController
{    
    public function index()
    {
        $carDto = new CarDto();
       //etc....
     }
}

I get this error:

Class "App\Dto\CarsDto" not found

I’m new to Cake 5 so assuming this is a n00b mistake on my part - can anyone assist?

Thanks!

I assume you generated the classes
Whats the stack trace here, what exactly throws the error?

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:

  1. In an Apache + PHP 8.2 docker container, installed CakePHP 5 via Composer
  2. Created a basic ‘vehicles’ DB table and baked it
  3. Installed the Dto Plugin: composer require dereuromark/cakephp-dto
  4. Loaded the plugin: bin/cake plugin load CakeDto
  5. Ran init: bin/cake dto init
  6. Created config/dto/Car.dto.xml and copied in the XML from the ReadMe
  7. Ran bin/cake dto generate - files were generated in src/Dto/ as expected
  8. Added use App\Dto\CarDto; use App\Dto\CarsDto; to VehiclesController.php
  9. Added $carDto = new CarDto(); to the index() function

Thanks so much for your help!

Found the cause and it’s embarrassing - I didn’t check the permissions on the src/Dto folder :man_facepalming:

To anyone else that encounters this, check src/Dto has read permissions, e.g.

chmod 755 /var/ww/html/src/Dto

:man_facepalming: