Search code examples
phpdependency-injectiontypo3extbasetypo3-9.x

TYPO3 v9.5.11 Extbase: Inject ServiceObject generated by a ContainerClass into Repository


I am trying to inject an service object into my Repository. I have created different Service Classes under the directory Classes/Services. There is also one class that I created called ContainerService, which creates and instantiate one ServiceObject for each Service Class.

ContainerService Class:

namespace VendorName\MyExt\Service;

use VendorName\MyExt\Service\RestClientService;

class ContainerService {

    private $restClient;     
    private $otherService;

    /**
     * @return RestClientService
     */
    public function getRestClient() {

        $objectManager = GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Object\ObjectManager::class);

        if ($this->restClient === null) {
            $this->restClient = $objectManager->get(RestClientService::class);            
        }

        return $this->restClient;
    }
...

As I said, I create my ServiceObjects in the ContainerService Class. Now I want to inject the ContainerService into my Repository and use it.

MyRepository Class:

namespace VendorName\MyExt\Domain\Repository;

use VendorName\MyExt\Service\ContainerService;

class MyRepository extends Repository
{    
    /**
     * @var ContainerService
     */
    public $containerService;

    /**
     * inject the ContainerService
     *     
     * @param ContainerService $containerService 
     * @return void
     */
    public function injectContainerService(ContainerService $containerService) {
        $this->containerService = $containerService;
    }

    // Use Objects from The ContainerService

    public function findAddress($addressId) {
        $url = 'Person/getAddressbyId/' 
        $someData = $this->containerService->getRestClient()->sendRequest($url)
    return $someData;
    }

In MyController I recieve the $someData from my findAddress function and do some work with it.

But when I call my Page, I get following ErrorMessage:

(1/2) #1278450972 TYPO3\CMS\Extbase\Reflection\Exception\UnknownClassException

Class ContainerService does not exist. Reflection failed.

Already tried to reload all Caches and dumping the Autoload didn't help either. Didn't install TYPO3 with composer. I appreciate any advice or help! Thanks!


Solution

  • Actually found the Issue. In MyRepository Class there was a Problem with the Annotations and the TypeHint:

    namespace VendorName\MyExt\Domain\Repository;
    
    use VendorName\MyExt\Service\ContainerService;
    
    class MyRepository extends Repository
    {    
        /**
         *** @var \VendorName\MyExt\Service\ContainerService**
         */
        public $containerService;
    
        /**
         * inject the ContainerService
         *     
         * @param \VendorName\MyExt\Service\ContainerService $containerService 
         * @return void
         */
        public function injectContainerService(\VendorName\MyExt\Service\ContainerService $containerService) {
            $this->containerService = $containerService;
        }
    
        // Use Objects from The ContainerService
    
        public function findAddress($addressId) {
            $url = 'Person/getAddressbyId/' 
            $someData = $this->containerService->getRestClient()->sendRequest($url)
        return $someData;
        }
    

    Now it works.