Invalid block type: [Namespace]\[Module]\Block\Timeline

  • I've been trying to add a block to the footer but so far it keeps returning Invalid block type: [Namespace]\[Module]\Block\Timeline

    The source of what I have so far can also be found here: https://github.com/sandermangel/magento2-twitterfeed

    my layout/default.xml

    <?xml version="1.0"?>
    <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
        <body>
            <referenceBlock name="footer">
                <block class="[Namespace]\[Module]\Block\Timeline" name="twitterfeed-timeline" template="footer/timeline.phtml"></block>
            </referenceBlock>
        </body>
    </page>
    

    and my block class in vendor/[namespace]/[module]/Block/Timeline.php

    namespace [Namespace]\[Module]\Block;
    
    use Magento\Framework\View\Element\Template;
    
    class Timeline extends Template
    {
    
        /**
         * Timeline constructor.
         * @param Template\Context $context
         * @param array $data
         */
        public function __construct(
            Template\Context $context,
            array $data = []
        ) {
            parent::__construct($context, $data);
        }
    
        /**
         * @return mixed
         */
        public function getTweets()
        {
            // ---
        }
    }
    

    composer.json

    {
      "name": "[namespace]/[module]",
      "description": "Lipsum",
      "version": "0.1.0",
      "license": "OSL-3.0",
      "require": {
        "abraham/twitteroauth": "*"
      },
      "type": "magento2-module",
      "repositories": [
        {
          "type": "git",
          "url": "https://github.com/url.git"
        },
        {
          "type": "git",
          "url": "https://github.com/abraham/twitteroauth.git"
        }
      ],
      "autoload": {
        "files": [
          "registration.php"
        ],
        "psr-4": {
          "[Namespace]\\[Module]\\": ""
        }
      }
    }
    

    And the exception.log error

    [2015-11-29 16:56:55] main.CRITICAL: exception 'Magento\Framework\Exception\LocalizedException' with message 'Invalid block type: [Namespace]\[Module]\Block\Timeline' in vendor/magento/framework/View/Layout/Generator/Block.php:262
    Stack trace:
    #0 vendor/magento/framework/View/Layout/Generator/Block.php(237): Magento\Framework\View\Layout\Generator\Block->getBlockInstance('[Namespace]\\[Module]...', Array)
    #1 vendor/magento/framework/View/Layout/Generator/Block.php(216): Magento\Framework\View\Layout\Generator\Block->createBlock('[Namespace]\\[Module]...', 'twitterfeed-tim...', Array)
    #2 vendor/magento/framework/View/Layout/Generator/Block.php(124): Magento\Framework\View\Layout\Generator\Block->generateBlock(Object(Magento\Framework\View\Layout\ScheduledStructure), Object(Magento\Framework\View\Layout\Data\Structure), 'twitterfeed-tim...')
    #3 vendor/magento/framework/View/Layout/GeneratorPool.php(86): Magento\Framework\View\Layout\Generator\Block->process(Object(Magento\Framework\View\Layout\Reader\Context), Object(Magento\Framework\View\Layout\Generator\Context))
    #4 vendor/magento/framework/View/Layout.php(327): Magento\Framework\View\Layout\GeneratorPool->process(Object(Magento\Framework\View\Layout\Reader\Context), Object(Magento\Framework\View\Layout\Generator\Context))
    #5 var/generation/Magento/Framework/View/Layout/Interceptor.php(89): Magento\Framework\View\Layout->generateElements()
    #6 vendor/magento/framework/View/Layout/Builder.php(129): Magento\Framework\View\Layout\Interceptor->generateElements()
    #7 vendor/magento/framework/View/Page/Builder.php(55): Magento\Framework\View\Layout\Builder->generateLayoutBlocks()
    #8 vendor/magento/framework/View/Layout/Builder.php(65): Magento\Framework\View\Page\Builder->generateLayoutBlocks()
    #9 vendor/magento/framework/View/Page/Config.php(166): Magento\Framework\View\Layout\Builder->build()
    #10 vendor/magento/framework/View/Page/Config.php(475): Magento\Framework\View\Page\Config->build()
    #11 vendor/magento/framework/View/Page/Config.php(433): Magento\Framework\View\Page\Config->getElementAttribute('body', 'class')
    #12 vendor/magento/module-catalog/Helper/Product/View.php(159): Magento\Framework\View\Page\Config->addBodyClass('catalog-product...')
    #13 vendor/magento/module-catalog/Helper/Product/View.php(214): Magento\Catalog\Helper\Product\View->initProductLayout(Object(Magento\Framework\View\Result\Page\Interceptor), Object(Magento\Catalog\Model\Product\Interceptor), Object(Magento\Framework\DataObject))
    #14 vendor/magento/module-catalog/Controller/Product/View.php(109): Magento\Catalog\Helper\Product\View->prepareAndRender(Object(Magento\Framework\View\Result\Page\Interceptor), 1, Object(Magento\Catalog\Controller\Product\View\Interceptor), Object(Magento\Framework\DataObject))
    #15 var/generation/Magento/Catalog/Controller/Product/View/Interceptor.php(24): Magento\Catalog\Controller\Product\View->execute()
    #16 vendor/magento/framework/App/Action/Action.php(102): Magento\Catalog\Controller\Product\View\Interceptor->execute()
    #17 [internal function]: Magento\Framework\App\Action\Action->dispatch(Object(Magento\Framework\App\Request\Http))
    #18 vendor/magento/framework/Interception/Interceptor.php(74): call_user_func_array(Array, Array)
    #19 vendor/magento/framework/Interception/Chain/Chain.php(70): Magento\Catalog\Controller\Product\View\Interceptor->___callParent('dispatch', Array)
    #20 vendor/magento/framework/Interception/Chain/Chain.php(63): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\\Catalog...', 'dispatch', Object(Magento\Catalog\Controller\Product\View\Interceptor), Array, 'designLoader')
    #21 vendor/magento/framework/App/Action/Plugin/Design.php(39): Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}(Object(Magento\Framework\App\Request\Http))
    #22 [internal function]: Magento\Framework\App\Action\Plugin\Design->aroundDispatch(Object(Magento\Catalog\Controller\Product\View\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
    #23 vendor/magento/framework/Interception/Chain/Chain.php(68): call_user_func_array(Array, Array)
    #24 vendor/magento/framework/Interception/Chain/Chain.php(63): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\\Catalog...', 'dispatch', Object(Magento\Catalog\Controller\Product\View\Interceptor), Array, 'customer-app-ac...')
    #25 vendor/magento/module-customer/Model/App/Action/ContextPlugin.php(61): Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}(Object(Magento\Framework\App\Request\Http))
    #26 [internal function]: Magento\Customer\Model\App\Action\ContextPlugin->aroundDispatch(Object(Magento\Catalog\Controller\Product\View\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
    #27 vendor/magento/framework/Interception/Chain/Chain.php(68): call_user_func_array(Array, Array)
    #28 vendor/magento/framework/Interception/Chain/Chain.php(63): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\\Catalog...', 'dispatch', Object(Magento\Catalog\Controller\Product\View\Interceptor), Array, 'storeCheck')
    #29 vendor/magento/module-store/App/Action/Plugin/StoreCheck.php(44): Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}(Object(Magento\Framework\App\Request\Http))
    #30 [internal function]: Magento\Store\App\Action\Plugin\StoreCheck->aroundDispatch(Object(Magento\Catalog\Controller\Product\View\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
    #31 vendor/magento/framework/Interception/Chain/Chain.php(68): call_user_func_array(Array, Array)
    #32 vendor/magento/framework/Interception/Chain/Chain.php(63): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\\Catalog...', 'dispatch', Object(Magento\Catalog\Controller\Product\View\Interceptor), Array, 'contextPlugin')
    #33 vendor/magento/module-store/App/Action/Plugin/Context.php(98): Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}(Object(Magento\Framework\App\Request\Http))
    #34 [internal function]: Magento\Store\App\Action\Plugin\Context->aroundDispatch(Object(Magento\Catalog\Controller\Product\View\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
    #35 vendor/magento/framework/Interception/Chain/Chain.php(68): call_user_func_array(Array, Array)
    #36 vendor/magento/framework/Interception/Interceptor.php(136): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\\Catalog...', 'dispatch', Object(Magento\Catalog\Controller\Product\View\Interceptor), Array, 'tax-app-action-...')
    #37 vendor/magento/module-tax/Model/App/Action/ContextPlugin.php(91): Magento\Catalog\Controller\Product\View\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))
    #38 [internal function]: Magento\Tax\Model\App\Action\ContextPlugin->aroundDispatch(Object(Magento\Catalog\Controller\Product\View\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
    #39 vendor/magento/framework/Interception/Interceptor.php(141): call_user_func_array(Array, Array)
    #40 var/generation/Magento/Catalog/Controller/Product/View/Interceptor.php(39): Magento\Catalog\Controller\Product\View\Interceptor->___callPlugins('dispatch', Array, Array)
    #41 vendor/magento/framework/App/FrontController.php(55): Magento\Catalog\Controller\Product\View\Interceptor->dispatch(Object(Magento\Framework\App\Request\Http))
    #42 [internal function]: Magento\Framework\App\FrontController->dispatch(Object(Magento\Framework\App\Request\Http))
    #43 vendor/magento/framework/Interception/Interceptor.php(74): call_user_func_array(Array, Array)
    #44 vendor/magento/framework/Interception/Chain/Chain.php(70): Magento\Framework\App\FrontController\Interceptor->___callParent('dispatch', Array)
    #45 vendor/magento/framework/Interception/Chain/Chain.php(63): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\\Framewo...', 'dispatch', Object(Magento\Framework\App\FrontController\Interceptor), Array, 'requestPreproce...')
    #46 vendor/magento/module-store/App/FrontController/Plugin/RequestPreprocessor.php(89): Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}(Object(Magento\Framework\App\Request\Http))
    #47 [internal function]: Magento\Store\App\FrontController\Plugin\RequestPreprocessor->aroundDispatch(Object(Magento\Framework\App\FrontController\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
    #48 vendor/magento/framework/Interception/Chain/Chain.php(68): call_user_func_array(Array, Array)
    #49 vendor/magento/framework/Interception/Chain/Chain.php(63): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\\Framewo...', 'dispatch', Object(Magento\Framework\App\FrontController\Interceptor), Array, 'install')
    #50 vendor/magento/framework/Module/Plugin/DbStatusValidator.php(69): Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}(Object(Magento\Framework\App\Request\Http))
    #51 [internal function]: Magento\Framework\Module\Plugin\DbStatusValidator->aroundDispatch(Object(Magento\Framework\App\FrontController\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
    #52 vendor/magento/framework/Interception/Chain/Chain.php(68): call_user_func_array(Array, Array)
    #53 vendor/magento/framework/Interception/Chain/Chain.php(63): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\\Framewo...', 'dispatch', Object(Magento\Framework\App\FrontController\Interceptor), Array, 'storeCookieVali...')
    #54 vendor/magento/module-store/Model/Plugin/StoreCookie.php(78): Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}(Object(Magento\Framework\App\Request\Http))
    #55 [internal function]: Magento\Store\Model\Plugin\StoreCookie->aroundDispatch(Object(Magento\Framework\App\FrontController\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
    #56 vendor/magento/framework/Interception/Chain/Chain.php(68): call_user_func_array(Array, Array)
    #57 vendor/magento/framework/Interception/Chain/Chain.php(63): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\\Framewo...', 'dispatch', Object(Magento\Framework\App\FrontController\Interceptor), Array, 'front-controlle...')
    #58 vendor/magento/module-page-cache/Model/App/FrontController/VarnishPlugin.php(55): Magento\Framework\Interception\Chain\Chain->Magento\Framework\Interception\Chain\{closure}(Object(Magento\Framework\App\Request\Http))
    #59 [internal function]: Magento\PageCache\Model\App\FrontController\VarnishPlugin->aroundDispatch(Object(Magento\Framework\App\FrontController\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
    #60 vendor/magento/framework/Interception/Chain/Chain.php(68): call_user_func_array(Array, Array)
    #61 vendor/magento/framework/Interception/Interceptor.php(136): Magento\Framework\Interception\Chain\Chain->invokeNext('Magento\\Framewo...', 'dispatch', Object(Magento\Framework\App\FrontController\Interceptor), Array, 'front-controlle...')
    #62 vendor/magento/module-page-cache/Model/App/FrontController/BuiltinPlugin.php(68): Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}(Object(Magento\Framework\App\Request\Http))
    #63 [internal function]: Magento\PageCache\Model\App\FrontController\BuiltinPlugin->aroundDispatch(Object(Magento\Framework\App\FrontController\Interceptor), Object(Closure), Object(Magento\Framework\App\Request\Http))
    #64 vendor/magento/framework/Interception/Interceptor.php(141): call_user_func_array(Array, Array)
    #65 var/generation/Magento/Framework/App/FrontController/Interceptor.php(26): Magento\Framework\App\FrontController\Interceptor->___callPlugins('dispatch', Array, Array)
    #66 vendor/magento/framework/App/Http.php(115): Magento\Framework\App\FrontController\Interceptor->dispatch(Object(Magento\Framework\App\Request\Http))
    #67 vendor/magento/framework/App/Bootstrap.php(258): Magento\Framework\App\Http->launch()
    #68 index.php(39): Magento\Framework\App\Bootstrap->run(Object(Magento\Framework\App\Http))
    #69 {main} [] []
    

    Any idea on what might be wrong is appreciated

    'vendor/[namespace]/[module]/Block/Timeline.php' this path should be 'app/code/[Namespace]/[Module]/Block/Timeline.php'

    Do you have errors in logs?

    @KAndy I've updated with the exception log. It's the error + backtrace

    It means that your class cannot be loaded. Do you have you module registered in composer? Can you add composer.json.

    @KAndy sorry for the late reply. Added the composer.json. You're right. It fails to get an instance in `Magento\Framework\View\Layout\Generator\Block::getBlockInstance` but I wasn't able to determine why

    is can also be cause by using the php extension in block definition xml by mistake...eg: `

  • I defined a use in the block class before the class definition. In this use I forgot a leading \ which cases an error. But since that error is caught and suppressed in Magento\Framework\View\Layout\Generator\Block::getBlockInstance it throws a completely unrelated error.

    In short: causing a PHP error above the class definition will always result in the Invalid block type: error

    I also had a similar problem now: I forgot to declare some "use" statements for some classes. The reported "Invalid block type" had nothing to do with the real problem. It took me a long time to figure it out.

  • To me was fixed when I changed the name of the file to the same of the class name and XML call. Like this:

    app/code/Rafaelcg/Smartlook/view/frontend/layout/default.xml

    <referenceContainer name="after.body.start">
                <block class="Rafaelcg\Smartlook\Block\Code" name="smartlook" as="smartlook" template="smartlook.phtml"/>
     </referenceContainer>
    

    app/code/Rafaelcg/Smartlook/Block/Code.php

    <?php   
    
    namespace Rafaelcg\Smartlook\Block;
    
    use \Magento\Framework\View\Element\Template;
    
    class Code extends Template
    {
    
  • If you are using Composer to include your module, here is another possible reason for that error:

    You could have a wrong PSR-4 definition in your composer.json. Normally, it should look like this:

    "autoload": {
        "psr-4": {
            "Namespace\\Module\\": ""
        }
    }
    

    However, if your module name is not Module, then your autoloading is broken and no class will be found. In this case, you need to fix the module name and run composer require namespace/module again to update the definition in the composer.lock and to re-generate your autoload files.

License under CC-BY-SA with attribution


Content dated before 7/24/2021 11:53 AM

Tags used