You don't, controllers aren't meant for that. You can call module/controller/action as url to display the echo. If you want to use a custom method to handle some logic in your template use blocks instead.
Edit:
I can't help you with the library, but to finish up this answer I give you an example to create a custom block.
Create a new module in `app/etc/modules/Your_Module.xml
<?xml version="1.0"?>
<config>
<modules>
<Your_Module>
<active>true</active>
<codePool>local</codePool>
</Your_Module>
</modules>
</config>
Create a module config app/code/local/Your/Module/etc/config.xml
<?xml version="1.0"?>
<config>
<global>
<blocks>
<your_module>
<class>Your_Module_Block</class>
</your_module>
</blocks>
</global>
</config>
The global/blocks part defines your Block Prefix, which you can use to call it in your layout.
Create the block now in app/code/local/Your/Module/Block/Block.php
class Your_Module_Block_Block extends Mage_Core_Block_Template
{
public function yourLogic()
{
//your code here
}
}
Now all you have to do is change your layout block to use the new custom block. Do it like this:
<block type="your_module/block" name="yourblock" template="your/template.phtml" />
The type refers to your config.xml
and block file. The your_module
part is the block prefix, so Your_Module_Block
, and the second block
part refers to the Block.php file.
In your template you can make a direct call to $this->yourLogic()
now.
Hope this helps your sort things out.
The scope of this variable is private. Hence you can't use this in your overriding (inherited) class. please inject Magento\Sales\Model\Service\InvoiceService
class for this variable in your constructor as it is injected into the main class.
Don't forget to run upgrade and di:compile commands after DI.
Edit: try this in your class
<?php
namespace Customcode\Productserialno\Controller\Sales\Adminhtml\Order\Invoice;
use Magento\Backend\App\Action;
use Magento\Framework\Registry;
use Magento\Sales\Model\Order\Email\Sender\InvoiceSender;
use Magento\Sales\Model\Order\Email\Sender\ShipmentSender;
use Magento\Sales\Model\Order\ShipmentFactory;
use Magento\Sales\Model\Service\InvoiceService;
class Save extends \Magento\Sales\Controller\Adminhtml\Order\Invoice\Save
{
/**
* @var InvoiceService
*/
private $invoiceService;
public function __construct
(
Action\Context $context,
Registry $registry,
InvoiceSender $invoiceSender,
ShipmentSender $shipmentSender,
ShipmentFactory $shipmentFactory,
InvoiceService $invoiceService
)
{
$this->invoiceService = $invoiceService;
parent::__construct($context, $registry, $invoiceSender, $shipmentSender, $shipmentFactory, $invoiceService);
}
/**
* Save invoice
* We can save only new invoice. Existing invoices are not editable
*
* @return \Magento\Framework\Controller\ResultInterface
*
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
* @SuppressWarnings(PHPMD.NPathComplexity)
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
*/
public function execute()
{
..........................
.......All code with customization------
}
}
=================My Code is this ===================
namespace Customcode\Productserialno\Controller\Sales\Adminhtml\Order\Invoice;
class Save extends \Magento\Sales\Controller\Adminhtml\Order\Invoice\Save
{
/**
* @var InvoiceService
*/
private $invoiceService;
public function __construct(
\Magento\Backend\App\Action $context,
Registry $registry,
InvoiceSender $invoiceSender,
ShipmentSender $shipmentSender,
ShipmentFactory $shipmentFactory,
InvoiceService $invoiceService
) {
parent::__construct($context, $registry, $invoiceSender, $shipmentSender, $shipmentFactory, $invoiceService);
}
public function execute() {
..........................
.......All code with customization------
}
}
Plz check because my code still giving same error.
Recoverable Error: Argument 1 passed to Customcode\Productserialno\Controller\Sales\Adminhtml\Order\Invoice\Save::__construct() must be an instance of Magento\Backend\App\Action,
Plz let me know what I m doing wrong.
Best Answer
check the below code