The object manager is not the correct way to do this. Use dependency injection via the constructor whenever possible.
You are getting that error because your controller extends another class, but you are not following the parent class's constructor, or you did not clear the cache.
You have not provided your code, but I assume your controller extends \Magento\Framework\App\Action\Action
. If you open that, you'll see the constructor signature for that class is:
/**
* @param \Magento\Framework\App\Action\Context $context
*/
public function __construct(
\Magento\Framework\App\Action\Context $context
) {
// ...
}
You're getting the error because Magento is trying to inject a Context object, and you're asking for a Customer. To inject your model, your class constructor needs to look like this:
protected $customer;
/**
* @param \Magento\Framework\App\Action\Context $context
* @param \Demo\HelloWorld\Model\Customer $customer
*/
public function __construct(
\Magento\Framework\App\Action\Context $context,
\Demo\HelloWorld\Model\Customer $customer
) {
$this->customer = $customer;
parent::__construct($context);
}
Make that change, then flush the Magento cache (or folder var/cache), and then it should work.
Note: This is assuming your Customer class is injectable. If it's loaded from the database, you need to inject CustomerFactory instead, and then call $customer = $this->customerFactory->create()
.
Folder structure for following controller will be app/code/Test/Priya/Controller/Adminhtml/Priya
in side that folder Index.php
namespace Test\Priya\Controller\Adminhtml\Priya;
use Magento\Framework\Controller\ResultFactory;
use Magento\Backend\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;
class Index extends \Magento\Backend\App\Action
{
protected $_publicActions = ['index'];
protected $resultPageFactory;
/**
* @param Context $context
* @param PageFactory $resultPageFactory
*/
public function __construct(
Context $context,
PageFactory $resultPageFactory
) {
parent::__construct($context);
$this->resultPageFactory = $resultPageFactory;
}
public function execute()
{
echo "Hello World";
}
}
You can hit directly controller at backend without key to test your admin controller.
priya/priya/index
To enable developer mode you can do it from .htaccess at root of your magento2
directory. Remove hash from below code.
# SetEnv MAGE_MODE developer
app\code\Test\Priya\etc\adminhtml\routes.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
<router id="admin">
<route id="priya" frontName="priya">
<module name="Test_Priya" before="Magento_Backend" />
</route>
</router>
</config>
Best Answer
You can use ResourceConnection Method if you wish to use sql queries in Controller.