Как вызвать метод модели из контроллера в Magento2


У меня есть модель с пространством имен Demo\HelloWorld\Model\Customer, а у модели есть функция demo()печать " Привет, мир !".

Как вызвать функцию demo() из контроллера с пространством имен Demo\HelloWorld\Controller\Index ?

Я пробую пример здесь , но не работает.

Исправимая ошибка: Аргумент 1 передан Demo\HelloWorld\Контроллер\Индекс\Индекс::__конструкция() должна быть экземпляром\Magento\Framework\ObjectManager, экземпляром Magento\Framework\Приложения\Действия\Контекста дано

Author: Community, 2015-08-13

3 answers

Диспетчер объектов не является правильным способом сделать это. Используйте внедрение зависимостей через конструктор, когда это возможно.

Вы получаете эту ошибку, потому что ваш контроллер расширяет другой класс, но вы не следуете конструктору родительского класса или не очистили кэш.

Вы не предоставили свой код, но я предполагаю, что ваш контроллер расширяет \Magento\Framework\App\Action\Action. Если вы откроете это, вы увидите подпись конструктора для этого класса:

/**
 * @param \Magento\Framework\App\Action\Context $context
 */
public function __construct(
    \Magento\Framework\App\Action\Context $context
) {
    // ...
}

Ты возникает ошибка, потому что Magento пытается внедрить объект контекста, а вы запрашиваете клиента. Чтобы внедрить вашу модель, ваш конструктор класса должен выглядеть следующим образом:

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);
}

Внесите это изменение, затем очистите кэш Magento (или папку var/cache), и тогда он должен работать.

Примечание: Это предполагает, что ваш класс клиентов является инъекционным. Если он загружен из базы данных, вам нужно вместо этого ввести CustomerFactory, а затем вызвать $customer = $this->customerFactory->create().

 10
Author: Ryan Hoerr, 2015-08-13 14:31:12

Для начала я бы следовал этому руководству https://www.ashsmith.io/2014/12/simple-magento2-controller-module / для создания простого контроллера для добавления некоторого контента. Оттуда я добавил

Demo/Simple/Model/Customer.php

<?php
namespace Demo\Simple\Model;
use Magento\Framework\Object;

class Customer extends Object
{
    public function sayHi(){
        echo "HEYHO";
    }
}

А затем добавил новую зависимость с помощью внедрения конструктора в контроллер:

\Demo\Simple\Model\Customer $customer

Так что теперь мой Demo/Controller/Index/Index.php выглядит так:

<?php
namespace Demo\Simple\Controller\Index;

class Index extends \Magento\Framework\App\Action\Action
{
    /**
     * @var \Magento\Framework\View\Result\PageFactory
     */
     protected $resultPageFactory;

    /**
     * @var \Demo\Model\Customer
     */
        protected $customer;

    /**
     * @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,
         \Demo\Simple\Model\Customer $customer
    )
    {
        $this->resultPageFactory = $resultPageFactory;
        $this->customer = $customer;
        parent::__construct($context);
    }

    /**
     * Default customer account page
     *
     * @return void
     */
    public function execute()
    {
        $this->customer->sayHi();
        return $this->resultPageFactory->create();
    }
}

И, после очистки всех кэшей, это повторяет "ХЕЙХО" в верхней части моя страница.

 3
Author: SpaceJam, 2015-09-22 16:58:23

enter image description here

В Model/Method/customFree.php

    <?php
/**
 * Copyright © 2013-2017 Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Payment\Paypal\Model\Method;
/**
 * Free payment method
 * @method \Magento\Quote\Api\Data\PaymentMethodExtensionInterface getExtensionAttributes()
 */
class customFree extends \Magento\Payment\Model\Method\Free
{


    /**
     * Check whether method is enabled in config
     *
     * @param \Magento\Quote\Model\Quote|null $quote
     * @return bool
     */
    public function isAvailableInConfig2()
    {
        echo "  learning magento2  ";
    }
}

В controller/Index/Index.php

<?php

namespace Payment\Paypal\Controller\Index;
use \Magento\Framework\App\Action\Action as controllerAction; 
class Index extends controllerAction {  

     protected $customer;

    /**
     * @param \Magento\Framework\App\Action\Context $context
     * @param \Demo\HelloWorld\Model\Customer $customer
     */
    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        \Payment\Paypal\Model\Method\customFree $customer
    ) {
        $this->customer = $customer;

        parent::__construct($context);
    }

    /**
     * Sets the content of the response
     */
    public function execute() {
        $this->getResponse()->appendBody('Hello world');
        $this->customer->isAvailableInConfig2();
    }
}

В etc/frontend/routes.xml

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="standard">
        <route id="Payment" frontName="custompaypal">
            <module name="Payment_Paypal" />
        </route>
    </router>
</config>

В браузере

Локальный хост/magento/custompaypal

enter image description here

 0
Author: Arshad Syed, 2018-05-09 09:21:20