当前区域禁止删除操作


10

我想为sku创建用于简单产品的删除操作的命令。我收到以下错误。如何设置管理区域?

[Magento \ Framework \ Exception \ LocalizedException]
当前区域禁止删除操作

<?php
namespace Sivakumar\Sample\Console;

use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputOption;

class DeleteSimpleProduct extends Command
{
    protected $_product;
    public function __construct(\Magento\Catalog\Model\Product $_product)
    {
        $this->_product =$_product;
        parent::__construct();
    }

    /**
     * {@inheritdoc}
     */
    protected function configure()
    {
        $this->setName('delete_simple_product')
            ->setDescription('Delete Simple Product')
            ->setDefinition($this->getOptionsList());

        parent::configure();
    }

    /**
     * {@inheritdoc}
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $errors = $this->validate($input);
        if ($errors) {
            throw new \InvalidArgumentException(implode("\n", $errors));
        }

    $product_id = $this->_product->getIdBySku($input->getOption('sku'));
    $product=$this->_product->load($product_id);
        $product->delete();
        $output->writeln('<info>product deleted ' . $input->getOption('sku') . '</info>');
    }

    public function getOptionsList()
    {
        return [
            new InputOption('sku', null, InputOption::VALUE_REQUIRED, 'SKU'),
        ];
    }

    public function validate(InputInterface $input)
    {
        $errors = [];
        $required =['sku',]; 

        foreach ($required as $key) {
            if (!$input->getOption($key)) {
                $errors[] = 'Missing option ' . $key;
            }
        }
        return $errors;
    }
}

di.xml

<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
<type name="Magento\Framework\Console\CommandList">
    <arguments>
        <argument name="commands" xsi:type="array">
            <item name="delete_simple_product" xsi:type="object">Sivakumar\Sample\Console\DeleteSimpleProduct</item>
        </argument>
    </arguments>
</type>
</config>

Answers:


12

与Max ProductRepositoryInterface::deleteById($sku)达成共识,您应该使用,但是您还需要进行其他更改才能获得删除的权限。

请注意,管理区域通过在以下位置创建以下配置来处理此问题 app/code/Magento/Backend/etc/adminhtml/di.xml

    <preference for="Magento\Framework\Model\ActionValidator\RemoveAction" type="Magento\Framework\Model\ActionValidator\RemoveAction\Allowed" />

Magento\Framework\Model\ActionValidator\RemoveAction\Allowed班通过返回防止权限检查trueisAllowed方法。

如果不对di.xml进行上述更改,则将使用Magento\Framework\Model\ActionValidator\RemoveAction该类,除非$this->registry->registry('isSecureArea')将其设置为true,否则它将导致您的删除请求失败。

看来您正在尝试创建一些控制台命令,但我对它们还不是很熟悉,所以目前最好的选择是将注册表设置为允许删除操作,并在找到更干净的解决方案时进行重构。

$this->registry->register('isSecureArea', true)

它的工作正常。我希望我能弄清楚为什么我应该使用ProductRepository.mean,同时我将尝试在devdocs中搜索此类的用法。
sivakumar 2015年

理想使用,https://github.com/magento/magento2/blob/develop/app/code/Magento/Catalog/Api/ProductRepositoryInterface.php因为它是公共API,因此更稳定。
克里斯·奥图尔

6

我最近在编写控制台命令以删除空类别时遇到了此问题。

如另一个答案中所述,您需要注册'isSecureArea'为true。

为此,您需要在控制台命令中将Magento \ Framework \ Registry类传递到构造函数中。

在我的情况下,我是这样进行的:

public function __construct(CategoryManagementInterface $categoryManagementInterface, CategoryRepositoryInterface $categoryRepositoryInterface, Registry $registry)
{
    $this->_categoryRepository = $categoryRepositoryInterface;
    $this->_categoryManagement = $categoryManagementInterface;
    $registry->register('isSecureArea', true);


    parent::__construct();
}

然后在execute使用存储库的方法中,执行实际的删除操作:

$this->_categoryRepository->deleteByIdentifier($category->getId());



2

扩展Chris O'Toole的答案。我也需要从一个命令中删除类别,实际上是从多个命令中删除类别。最初只是

$oRegistry->register('isSecureArea', true);

在一个命令中工作正常,但是当我将其放在多个命令中(在构造函数中)时,在编译期间出现此错误

注册表项“ isSecureArea”已存在

首先检查注册表项是否存在就解决了

if($oRegistry->registry('isSecureArea') === null) {
    $oRegistry->register('isSecureArea', true);
}

我不确定将其放在构造函数中是否不好,但是假设这就是遇到错误的原因。另外,您应该能够从命令的execute方法中运行第一个代码片段。同样,我不确定最佳做法是什么...



1

除了设置isSecureArea之外,您还可以通过覆盖RemoveAction您的类型参数来删除单个对象类型,di.xml如下所示:

<type name="Magento\Framework\Model\ActionValidator\RemoveAction">
    <arguments>
        <argument name="protectedModels" xsi:type="array">
            <item name="salesOrder" xsi:type="null" /> <!--allow orders to be removed from front area-->
        </argument>
    </arguments>
</type>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.