Package on_start woes (9.5)

Two Questions:

  1. Has anyone noticed that on_start of a package controller get’s called multiple times during a page load? Is it supposed to be this way? If so, is there a way to prevent multiple executions? I try where i can to eliminate tings that are slow and in my on_start I am
  • registering assets i use in various places across my package
  • loading routes
  • registering events pulled from a database
  • Load some overrides

Although most of them are pretty fast, the culmination of many pretty fast things sometimes becomes not so fast anymore. I’d like to eliminate the redundancy.

  1. Namespace not found. Occasionally, when the on_start executes, i get a namespace not found error on my entity. The events that i register from the database, come form a pretty simple doctrine query outlined below. When the error occurs, if i comment the code block out, reload the page, then uncomment the line. It’s fine for awhile (hours to days) until it’s not. It’s occurred both on my test deployment (pre-production) server and on my development machine. I’ve current wrapped it in a class_exists function to see if that helps.

It feels like some of the registered namespaces aren’t getting loaded before this part of my code executes.

 if(class_exists(ravidCannedCommunication::class)){
            //build query and retrieve all comm's with events
            $qb=$em->createQueryBuilder();
            $qb->select('c')
                ->from(ravidCannedCommunication::class,'c')
                ->where("c.seqNo=:seqNo OR c.seqNo IS NULL")
                ->andWhere("c.triggers!=:emptyString")
                ->setParameter('emptyString','')
                ->setParameter('seqNo',1);
            $commList=$qb->getQuery()->getResult();
            foreach($commList AS $comm){            
                $commId=$comm->getId(); 
                //each communication could have multiple triggers, register event for each
                foreach($comm->getTriggers() AS $trigger){
                    Events::addListener($trigger,function($event) use ($commId{
                      RavidCrmHelpers::sendCannedCommunication($event,$commId);
                    });     
                }
            }
        }else{
            \Log::addDebug("Attempted to use ravidCannedCommunicatoin on on_start method of package, class was not found.");
        }

Here is the use statement:

use Concrete\Package\RavidCrm\Entity\ravidCannedCommunication;

…and the namespace of my entity:

namespace Concrete\Package\RavidCrm\Entity;

Help?

I’m thinking about implementing a workaround to eliminate the database query and just store the necessary events in a flat file that get’s included in the on_start method. It would likely be a little faster than the database query and hide the problem; i’d still like to know why it’s happening.

Here’s the exact error message: “The class ‘Concrete\Package\RavidCrm\Entity\ravidCannedCommunication’ was not found in the chain configured namespaces Concrete\Core\Entity, RavidTools, Concrete\Package\RavidTools\Entity\Attribute”

Doctrine\Persistence\Mapping\MappingException:
The class 'Concrete\Package\RavidCrm\Entity\ravidCannedCommunication' was not found in the chain configured namespaces Concrete\Core\Entity, RavidTools, Concrete\Package\RavidTools\Entity\Attribute

  at /var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/vendor/doctrine/persistence/src/Persistence/Mapping/MappingException.php:26
  at Doctrine\Persistence\Mapping\MappingException::classNotFoundInNamespaces('Concrete\\Package\\RavidCrm\\Entity\\ravidCannedCommunication', array('Concrete\\Core\\Entity', 'RavidTools', 'Concrete\\Package\\RavidTools\\Entity\\Attribute'))
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/vendor/doctrine/persistence/src/Persistence/Mapping/Driver/MappingDriverChain.php:89)
  at Doctrine\Persistence\Mapping\Driver\MappingDriverChain->loadMetadataForClass('Concrete\\Package\\RavidCrm\\Entity\\ravidCannedCommunication', object(ClassMetadata))
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/vendor/doctrine/orm/lib/Doctrine/ORM/Mapping/ClassMetadataFactory.php:133)
  at Doctrine\ORM\Mapping\ClassMetadataFactory->doLoadMetadata(object(ClassMetadata), null, false, array())
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/vendor/doctrine/persistence/src/Persistence/Mapping/AbstractClassMetadataFactory.php:343)
  at Doctrine\Persistence\Mapping\AbstractClassMetadataFactory->loadMetadata('Concrete\\Package\\RavidCrm\\Entity\\ravidCannedCommunication')
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/vendor/doctrine/persistence/src/Persistence/Mapping/AbstractClassMetadataFactory.php:207)
  at Doctrine\Persistence\Mapping\AbstractClassMetadataFactory->getMetadataFor('Concrete\\Package\\RavidCrm\\Entity\\ravidCannedCommunication')
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/vendor/doctrine/orm/lib/Doctrine/ORM/EntityManager.php:318)
  at Doctrine\ORM\EntityManager->getClassMetadata('Concrete\\Package\\RavidCrm\\Entity\\ravidCannedCommunication')
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php:1782)
  at Doctrine\ORM\Query\Parser->RangeVariableDeclaration()
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php:1620)
  at Doctrine\ORM\Query\Parser->IdentificationVariableDeclaration()
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php:1350)
  at Doctrine\ORM\Query\Parser->FromClause()
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php:880)
  at Doctrine\ORM\Query\Parser->SelectStatement()
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php:849)
  at Doctrine\ORM\Query\Parser->QueryLanguage()
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php:256)
  at Doctrine\ORM\Query\Parser->getAST()
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/vendor/doctrine/orm/lib/Doctrine/ORM/Query/Parser.php:356)
  at Doctrine\ORM\Query\Parser->parse()
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/vendor/doctrine/orm/lib/Doctrine/ORM/Query.php:274)
  at Doctrine\ORM\Query->parse()
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/vendor/doctrine/orm/lib/Doctrine/ORM/Query.php:286)
  at Doctrine\ORM\Query->_doExecute()
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/vendor/doctrine/orm/lib/Doctrine/ORM/AbstractQuery.php:1212)
  at Doctrine\ORM\AbstractQuery->executeIgnoreQueryCache(null, 1)
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/vendor/doctrine/orm/lib/Doctrine/ORM/AbstractQuery.php:1166)
  at Doctrine\ORM\AbstractQuery->execute(null, 1)
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/vendor/doctrine/orm/lib/Doctrine/ORM/AbstractQuery.php:901)
  at Doctrine\ORM\AbstractQuery->getResult()
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/web/packages/ravid_crm/controller.php:242)
  at Concrete\Package\RavidCrm\Controller->on_start()
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/web/concrete/src/Application/Application.php:275)
  at Concrete\Core\Application\Application->setupPackages()
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/web/concrete/src/Foundation/Runtime/Run/DefaultRunner.php:235)
  at Concrete\Core\Foundation\Runtime\Run\DefaultRunner->setupPackages()
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/web/concrete/src/Foundation/Runtime/Run/DefaultRunner.php:329)
  at Concrete\Core\Foundation\Runtime\Run\DefaultRunner->trySteps(array('setSystemLocale', 'initializeSystemTimezone', 'handleUpdates', 'setupPackages', 'preloadClassAliases', 'initializeSiteTimezone', 'initializeLegacyUrlDefinitions', 'registerLegacyConfigValues', 'handlePermissionKeys', 'handleEventing'))
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/web/concrete/src/Foundation/Runtime/Run/DefaultRunner.php:76)
  at Concrete\Core\Foundation\Runtime\Run\DefaultRunner->run()
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/web/concrete/src/Foundation/Runtime/DefaultRuntime.php:102)
  at Concrete\Core\Foundation\Runtime\DefaultRuntime->run()
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/web/concrete/dispatcher.php:45)
  at require('/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/web/concrete/dispatcher.php')
     (/var/www/96ac8f1d-883f-4868-99e2-e30b6fbd8a25/crmdemo.ravidenterprises.com/web/index.php:3)          

A few general observations

  • It looks like you may be trying to use the legacy namespace system from v7. Whilst it has not been removed, it is not given any TLC, so consider reworking using the current namespace system.
  • You cannot rely on the execution sequence of package controller on_start methods.
  • There is also an on_start event. You can use the on_start method to configure an event handler for the on_start event. Within the event handler you can rely on all package on_start methods being executed and namespaces being registered.
  • The on_start event only happens once.

Thanks for response and observations.

I was starting to question the sequential reliability of the package on_start method . I will check out the event, that sounds like it might work a wee bit better for me.

I assume by legacy namespace you mean for my entity. Should be Concrete\Package\RavidCrmSrc\Entity… oops