When it is good to use viewModel ? What is difference between viewModel and Block?












4















I am bit confuse about using viewModel in Magento. I am not getting exact difference between viewModel and Block.
In which case using viewModel is best case?



Any help will be appreciated.










share|improve this question



























    4















    I am bit confuse about using viewModel in Magento. I am not getting exact difference between viewModel and Block.
    In which case using viewModel is best case?



    Any help will be appreciated.










    share|improve this question

























      4












      4








      4


      3






      I am bit confuse about using viewModel in Magento. I am not getting exact difference between viewModel and Block.
      In which case using viewModel is best case?



      Any help will be appreciated.










      share|improve this question














      I am bit confuse about using viewModel in Magento. I am not getting exact difference between viewModel and Block.
      In which case using viewModel is best case?



      Any help will be appreciated.







      magento2.2 blocks viewmodel






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Feb 4 at 6:36









      Dhaval SolankiDhaval Solanki

      1,3711932




      1,3711932






















          2 Answers
          2






          active

          oldest

          votes


















          5














          Magento veteran Jessie has a well famous blog on viewModel which you can find it here. It answers your question at the end. It says:




          When to use ViewModels?



          When would you want to use ViewModels? Well, when Magento 2.2 comes out and your code doesn't need to be
          backwards compatible with Magento 2.1 any more, my answer will be:
          Always! However, reality is that we most likely need to maintain
          backwards compatibility for some time. And the procedure above is a
          bit lengthy to follow if Block classes are still simple enough without
          any custom constructor.



          I would say that you create some kind of ViewModel functionality as
          soon as you start overriding the Block constructor to inject your own
          dependency into it. A Block class that extends from a parent and
          simply reuses the parents dependencies is not that bad, as long as you
          don't have a huge dislike of $context. However, as soon as the Block
          becomes more complex, it's always better offload features to other
          classes. And ViewModels are meant to be the good addition to that.




          What is the difference b/w a block and viewModel?



          Magento2, in its presentation level, uses Model-View-ViewModel(MVVM) design pattern. Here don't confuse the viewModel in the MVVM with the viewModel which is in your question.



          enter image description hereimage credits: wiki - mvvm



          Here View layer is delivered by the phtml files and ViewModel layer is the block classes. It is the block classes responsibility to prepare the data that needs to present to the phtml file (View layer) from the models.
          Now every block in Magento extends the class MageCoreBlockTemplate in order to get the presentational power.



          So this means, if you want to add some customization or change in the presentation of a block, then that change has to
          be done on the block class either through preference on plugins or by adding a new layer of block and phtml file.



          In some occassions, you need to do a minor change in the presentation level, but in order to do it you may need to add a
          new block or add a preference to the block in context. This seems costly as in either case, we need to deal with the
          dependcy injection of the parent class MageCoreBlockTemplate, which looks unfair in order to accomplish the change
          you look forward to do in the presentational level.



          Here is where the ViewModel in your question emerges with its true power. The concept is simple, we can inject any number
          of viewModel layers into a block as an argument and thus can use them in the presentation level. The glory resides in the
          fact that we can completely rid off the whole hell of dependency of the core class MageCoreBlockTemplate inside a viewModel.



          __construct of the ViewModel only holds those dependencies which require to prepare the data for the presentational phtml file.
          This makes it cleaner and more reliable solution to do customization in the presentational level. Since the __constuct of a
          ViewModel does not want to deal with unwanted parental dependencies, this will eventually lead to the performance boost.



          Thus, I would say, the viewModels is a well engineered, well-structured add-on to the blocks, which should be our best call when
          we do customization in the presentational level.






          share|improve this answer


























          • Yes Thanks for reply I read this blog but after reading this it is not clear what is difference between viewmodel and block ?

            – Dhaval Solanki
            Feb 5 at 4:29











          • @DhavalSolanki I made an edit to answer your question. I hope that helps

            – Rajeev K Tomy
            Feb 5 at 6:42











          • Thanks for detailed explanation

            – Dhaval Solanki
            Feb 7 at 5:59



















          2














          The most important part of using ViewModel is it simplifies the load time as we only implements MagentoFrameworkViewElementBlockArgumentInterface. If we use a custom block instead of ViewModel, we should extend the core block MagentoFrameworkViewElementTemplate which includes so many handy things like some extra blocks, loggers etc. And we can easily access the ViewModel by $block->getViewModel()






          share|improve this answer























            Your Answer








            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "479"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmagento.stackexchange.com%2fquestions%2f260331%2fwhen-it-is-good-to-use-viewmodel-what-is-difference-between-viewmodel-and-bloc%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            2 Answers
            2






            active

            oldest

            votes








            2 Answers
            2






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            5














            Magento veteran Jessie has a well famous blog on viewModel which you can find it here. It answers your question at the end. It says:




            When to use ViewModels?



            When would you want to use ViewModels? Well, when Magento 2.2 comes out and your code doesn't need to be
            backwards compatible with Magento 2.1 any more, my answer will be:
            Always! However, reality is that we most likely need to maintain
            backwards compatibility for some time. And the procedure above is a
            bit lengthy to follow if Block classes are still simple enough without
            any custom constructor.



            I would say that you create some kind of ViewModel functionality as
            soon as you start overriding the Block constructor to inject your own
            dependency into it. A Block class that extends from a parent and
            simply reuses the parents dependencies is not that bad, as long as you
            don't have a huge dislike of $context. However, as soon as the Block
            becomes more complex, it's always better offload features to other
            classes. And ViewModels are meant to be the good addition to that.




            What is the difference b/w a block and viewModel?



            Magento2, in its presentation level, uses Model-View-ViewModel(MVVM) design pattern. Here don't confuse the viewModel in the MVVM with the viewModel which is in your question.



            enter image description hereimage credits: wiki - mvvm



            Here View layer is delivered by the phtml files and ViewModel layer is the block classes. It is the block classes responsibility to prepare the data that needs to present to the phtml file (View layer) from the models.
            Now every block in Magento extends the class MageCoreBlockTemplate in order to get the presentational power.



            So this means, if you want to add some customization or change in the presentation of a block, then that change has to
            be done on the block class either through preference on plugins or by adding a new layer of block and phtml file.



            In some occassions, you need to do a minor change in the presentation level, but in order to do it you may need to add a
            new block or add a preference to the block in context. This seems costly as in either case, we need to deal with the
            dependcy injection of the parent class MageCoreBlockTemplate, which looks unfair in order to accomplish the change
            you look forward to do in the presentational level.



            Here is where the ViewModel in your question emerges with its true power. The concept is simple, we can inject any number
            of viewModel layers into a block as an argument and thus can use them in the presentation level. The glory resides in the
            fact that we can completely rid off the whole hell of dependency of the core class MageCoreBlockTemplate inside a viewModel.



            __construct of the ViewModel only holds those dependencies which require to prepare the data for the presentational phtml file.
            This makes it cleaner and more reliable solution to do customization in the presentational level. Since the __constuct of a
            ViewModel does not want to deal with unwanted parental dependencies, this will eventually lead to the performance boost.



            Thus, I would say, the viewModels is a well engineered, well-structured add-on to the blocks, which should be our best call when
            we do customization in the presentational level.






            share|improve this answer


























            • Yes Thanks for reply I read this blog but after reading this it is not clear what is difference between viewmodel and block ?

              – Dhaval Solanki
              Feb 5 at 4:29











            • @DhavalSolanki I made an edit to answer your question. I hope that helps

              – Rajeev K Tomy
              Feb 5 at 6:42











            • Thanks for detailed explanation

              – Dhaval Solanki
              Feb 7 at 5:59
















            5














            Magento veteran Jessie has a well famous blog on viewModel which you can find it here. It answers your question at the end. It says:




            When to use ViewModels?



            When would you want to use ViewModels? Well, when Magento 2.2 comes out and your code doesn't need to be
            backwards compatible with Magento 2.1 any more, my answer will be:
            Always! However, reality is that we most likely need to maintain
            backwards compatibility for some time. And the procedure above is a
            bit lengthy to follow if Block classes are still simple enough without
            any custom constructor.



            I would say that you create some kind of ViewModel functionality as
            soon as you start overriding the Block constructor to inject your own
            dependency into it. A Block class that extends from a parent and
            simply reuses the parents dependencies is not that bad, as long as you
            don't have a huge dislike of $context. However, as soon as the Block
            becomes more complex, it's always better offload features to other
            classes. And ViewModels are meant to be the good addition to that.




            What is the difference b/w a block and viewModel?



            Magento2, in its presentation level, uses Model-View-ViewModel(MVVM) design pattern. Here don't confuse the viewModel in the MVVM with the viewModel which is in your question.



            enter image description hereimage credits: wiki - mvvm



            Here View layer is delivered by the phtml files and ViewModel layer is the block classes. It is the block classes responsibility to prepare the data that needs to present to the phtml file (View layer) from the models.
            Now every block in Magento extends the class MageCoreBlockTemplate in order to get the presentational power.



            So this means, if you want to add some customization or change in the presentation of a block, then that change has to
            be done on the block class either through preference on plugins or by adding a new layer of block and phtml file.



            In some occassions, you need to do a minor change in the presentation level, but in order to do it you may need to add a
            new block or add a preference to the block in context. This seems costly as in either case, we need to deal with the
            dependcy injection of the parent class MageCoreBlockTemplate, which looks unfair in order to accomplish the change
            you look forward to do in the presentational level.



            Here is where the ViewModel in your question emerges with its true power. The concept is simple, we can inject any number
            of viewModel layers into a block as an argument and thus can use them in the presentation level. The glory resides in the
            fact that we can completely rid off the whole hell of dependency of the core class MageCoreBlockTemplate inside a viewModel.



            __construct of the ViewModel only holds those dependencies which require to prepare the data for the presentational phtml file.
            This makes it cleaner and more reliable solution to do customization in the presentational level. Since the __constuct of a
            ViewModel does not want to deal with unwanted parental dependencies, this will eventually lead to the performance boost.



            Thus, I would say, the viewModels is a well engineered, well-structured add-on to the blocks, which should be our best call when
            we do customization in the presentational level.






            share|improve this answer


























            • Yes Thanks for reply I read this blog but after reading this it is not clear what is difference between viewmodel and block ?

              – Dhaval Solanki
              Feb 5 at 4:29











            • @DhavalSolanki I made an edit to answer your question. I hope that helps

              – Rajeev K Tomy
              Feb 5 at 6:42











            • Thanks for detailed explanation

              – Dhaval Solanki
              Feb 7 at 5:59














            5












            5








            5







            Magento veteran Jessie has a well famous blog on viewModel which you can find it here. It answers your question at the end. It says:




            When to use ViewModels?



            When would you want to use ViewModels? Well, when Magento 2.2 comes out and your code doesn't need to be
            backwards compatible with Magento 2.1 any more, my answer will be:
            Always! However, reality is that we most likely need to maintain
            backwards compatibility for some time. And the procedure above is a
            bit lengthy to follow if Block classes are still simple enough without
            any custom constructor.



            I would say that you create some kind of ViewModel functionality as
            soon as you start overriding the Block constructor to inject your own
            dependency into it. A Block class that extends from a parent and
            simply reuses the parents dependencies is not that bad, as long as you
            don't have a huge dislike of $context. However, as soon as the Block
            becomes more complex, it's always better offload features to other
            classes. And ViewModels are meant to be the good addition to that.




            What is the difference b/w a block and viewModel?



            Magento2, in its presentation level, uses Model-View-ViewModel(MVVM) design pattern. Here don't confuse the viewModel in the MVVM with the viewModel which is in your question.



            enter image description hereimage credits: wiki - mvvm



            Here View layer is delivered by the phtml files and ViewModel layer is the block classes. It is the block classes responsibility to prepare the data that needs to present to the phtml file (View layer) from the models.
            Now every block in Magento extends the class MageCoreBlockTemplate in order to get the presentational power.



            So this means, if you want to add some customization or change in the presentation of a block, then that change has to
            be done on the block class either through preference on plugins or by adding a new layer of block and phtml file.



            In some occassions, you need to do a minor change in the presentation level, but in order to do it you may need to add a
            new block or add a preference to the block in context. This seems costly as in either case, we need to deal with the
            dependcy injection of the parent class MageCoreBlockTemplate, which looks unfair in order to accomplish the change
            you look forward to do in the presentational level.



            Here is where the ViewModel in your question emerges with its true power. The concept is simple, we can inject any number
            of viewModel layers into a block as an argument and thus can use them in the presentation level. The glory resides in the
            fact that we can completely rid off the whole hell of dependency of the core class MageCoreBlockTemplate inside a viewModel.



            __construct of the ViewModel only holds those dependencies which require to prepare the data for the presentational phtml file.
            This makes it cleaner and more reliable solution to do customization in the presentational level. Since the __constuct of a
            ViewModel does not want to deal with unwanted parental dependencies, this will eventually lead to the performance boost.



            Thus, I would say, the viewModels is a well engineered, well-structured add-on to the blocks, which should be our best call when
            we do customization in the presentational level.






            share|improve this answer















            Magento veteran Jessie has a well famous blog on viewModel which you can find it here. It answers your question at the end. It says:




            When to use ViewModels?



            When would you want to use ViewModels? Well, when Magento 2.2 comes out and your code doesn't need to be
            backwards compatible with Magento 2.1 any more, my answer will be:
            Always! However, reality is that we most likely need to maintain
            backwards compatibility for some time. And the procedure above is a
            bit lengthy to follow if Block classes are still simple enough without
            any custom constructor.



            I would say that you create some kind of ViewModel functionality as
            soon as you start overriding the Block constructor to inject your own
            dependency into it. A Block class that extends from a parent and
            simply reuses the parents dependencies is not that bad, as long as you
            don't have a huge dislike of $context. However, as soon as the Block
            becomes more complex, it's always better offload features to other
            classes. And ViewModels are meant to be the good addition to that.




            What is the difference b/w a block and viewModel?



            Magento2, in its presentation level, uses Model-View-ViewModel(MVVM) design pattern. Here don't confuse the viewModel in the MVVM with the viewModel which is in your question.



            enter image description hereimage credits: wiki - mvvm



            Here View layer is delivered by the phtml files and ViewModel layer is the block classes. It is the block classes responsibility to prepare the data that needs to present to the phtml file (View layer) from the models.
            Now every block in Magento extends the class MageCoreBlockTemplate in order to get the presentational power.



            So this means, if you want to add some customization or change in the presentation of a block, then that change has to
            be done on the block class either through preference on plugins or by adding a new layer of block and phtml file.



            In some occassions, you need to do a minor change in the presentation level, but in order to do it you may need to add a
            new block or add a preference to the block in context. This seems costly as in either case, we need to deal with the
            dependcy injection of the parent class MageCoreBlockTemplate, which looks unfair in order to accomplish the change
            you look forward to do in the presentational level.



            Here is where the ViewModel in your question emerges with its true power. The concept is simple, we can inject any number
            of viewModel layers into a block as an argument and thus can use them in the presentation level. The glory resides in the
            fact that we can completely rid off the whole hell of dependency of the core class MageCoreBlockTemplate inside a viewModel.



            __construct of the ViewModel only holds those dependencies which require to prepare the data for the presentational phtml file.
            This makes it cleaner and more reliable solution to do customization in the presentational level. Since the __constuct of a
            ViewModel does not want to deal with unwanted parental dependencies, this will eventually lead to the performance boost.



            Thus, I would say, the viewModels is a well engineered, well-structured add-on to the blocks, which should be our best call when
            we do customization in the presentational level.







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited Feb 5 at 6:42

























            answered Feb 4 at 6:41









            Rajeev K TomyRajeev K Tomy

            14.5k54587




            14.5k54587













            • Yes Thanks for reply I read this blog but after reading this it is not clear what is difference between viewmodel and block ?

              – Dhaval Solanki
              Feb 5 at 4:29











            • @DhavalSolanki I made an edit to answer your question. I hope that helps

              – Rajeev K Tomy
              Feb 5 at 6:42











            • Thanks for detailed explanation

              – Dhaval Solanki
              Feb 7 at 5:59



















            • Yes Thanks for reply I read this blog but after reading this it is not clear what is difference between viewmodel and block ?

              – Dhaval Solanki
              Feb 5 at 4:29











            • @DhavalSolanki I made an edit to answer your question. I hope that helps

              – Rajeev K Tomy
              Feb 5 at 6:42











            • Thanks for detailed explanation

              – Dhaval Solanki
              Feb 7 at 5:59

















            Yes Thanks for reply I read this blog but after reading this it is not clear what is difference between viewmodel and block ?

            – Dhaval Solanki
            Feb 5 at 4:29





            Yes Thanks for reply I read this blog but after reading this it is not clear what is difference between viewmodel and block ?

            – Dhaval Solanki
            Feb 5 at 4:29













            @DhavalSolanki I made an edit to answer your question. I hope that helps

            – Rajeev K Tomy
            Feb 5 at 6:42





            @DhavalSolanki I made an edit to answer your question. I hope that helps

            – Rajeev K Tomy
            Feb 5 at 6:42













            Thanks for detailed explanation

            – Dhaval Solanki
            Feb 7 at 5:59





            Thanks for detailed explanation

            – Dhaval Solanki
            Feb 7 at 5:59













            2














            The most important part of using ViewModel is it simplifies the load time as we only implements MagentoFrameworkViewElementBlockArgumentInterface. If we use a custom block instead of ViewModel, we should extend the core block MagentoFrameworkViewElementTemplate which includes so many handy things like some extra blocks, loggers etc. And we can easily access the ViewModel by $block->getViewModel()






            share|improve this answer




























              2














              The most important part of using ViewModel is it simplifies the load time as we only implements MagentoFrameworkViewElementBlockArgumentInterface. If we use a custom block instead of ViewModel, we should extend the core block MagentoFrameworkViewElementTemplate which includes so many handy things like some extra blocks, loggers etc. And we can easily access the ViewModel by $block->getViewModel()






              share|improve this answer


























                2












                2








                2







                The most important part of using ViewModel is it simplifies the load time as we only implements MagentoFrameworkViewElementBlockArgumentInterface. If we use a custom block instead of ViewModel, we should extend the core block MagentoFrameworkViewElementTemplate which includes so many handy things like some extra blocks, loggers etc. And we can easily access the ViewModel by $block->getViewModel()






                share|improve this answer













                The most important part of using ViewModel is it simplifies the load time as we only implements MagentoFrameworkViewElementBlockArgumentInterface. If we use a custom block instead of ViewModel, we should extend the core block MagentoFrameworkViewElementTemplate which includes so many handy things like some extra blocks, loggers etc. And we can easily access the ViewModel by $block->getViewModel()







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Feb 5 at 6:17









                Kishan PatadiaKishan Patadia

                3,6331923




                3,6331923






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Magento Stack Exchange!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmagento.stackexchange.com%2fquestions%2f260331%2fwhen-it-is-good-to-use-viewmodel-what-is-difference-between-viewmodel-and-bloc%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    How to change which sound is reproduced for terminal bell?

                    Title Spacing in Bjornstrup Chapter, Removing Chapter Number From Contents

                    Can I use Tabulator js library in my java Spring + Thymeleaf project?