I will also show how you add/show your custom page when you click on the newly added custom link in the customer account sidebar :
- Create your layout app/code/YourNamespace/YourModule/view/frontend/layout/customer_account.xml :
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="customer_account_navigation">
<block class="Magento\Framework\View\Element\Html\Link\Current" name="customer-account-navigation-demo-link">
<arguments>
<argument name="path" xsi:type="string">yourmodule/yourdemolink/index</argument>
<argument name="label" xsi:type="string">Your Demo Link</argument>
</arguments>
</block>
</referenceBlock>
</body>
</page>
In the above XML code, you can see that I have defined my custom menu path as:
yourmodule = my module name
yourdemolink = my module’s controller name
index = my controller’s action
2.Create your module’s layout XML file :
app/code/YourNamespace/YourModule/view/frontend/layout/yourmodule_yourdemolink_index.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="2columns-left" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<update handle="customer_account"/>
<head>
<title>
Your Demo Link
</title>
</head>
<body>
<referenceContainer name="content">
<block class="YourNamespace\YourModule\Block\YourBlock" name="yourmodule.demolink.index" template="YourNamespace_YourModule::yourdemolink/index.phtml" cacheable="false" />
</referenceContainer>
</body>
</page>
- Create Controller class file :
app/code/YourNamespace/YourModule/Controller/YourDemoLink/Index.php
<?php
namespace YourNamespace\YourModule\Controller\YourDemoLink;
class Index extends \Magento\Framework\App\Action\Action
{
/**
* @var \Magento\Framework\View\Result\PageFactory
*/
protected $resultPageFactory;
/**
* @param \Magento\Framework\App\Action\Context $context
* @param \Magento\Framework\View\Result\PageFactory resultPageFactory
*/
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Magento\Framework\View\Result\PageFactory $resultPageFactory
)
{
$this->resultPageFactory = $resultPageFactory;
parent::__construct($context);
}
/**
* Default customer account page
*
* @return void
*/
public function execute()
{
return $this->resultPageFactory->create();
}
}
?>
- Create Block class file :
app/code/YourNamespace/YourModule/Block/YourBlock.php
<?php
namespace YourNamespace\YourModule\Block;
class YourBlock extends \Magento\Framework\View\Element\Template
{
public function __construct(
\Magento\Backend\Block\Template\Context $context,
array $data = []
)
{
parent::__construct($context, $data);
}
public function getHelloWorld()
{
return 'Hello World';
}
}
?>
- Create Template file :
app/code/YourNamespace/YourModule/view/frontend/templates/demolink/index.phtml
<h2>
<?php echo $block->getHelloWorld(); ?>
</h2>
echo 'My First Link Page';
Hope this help you.