Php Symfony上Sonata管理包的批处理操作

Php Symfony上Sonata管理包的批处理操作,php,symfony,frameworks,yaml,sonata,Php,Symfony,Frameworks,Yaml,Sonata,我需要在控制器上获取数据网格,但它不允许在函数中输入参数。你如何恢复这些信息 services: admin.category: class: AppBundle\Admin\CategoryAdmin arguments: [~, AppBundle\Entity\Category, AppBundle:CRUDCategory, ~] tags:

我需要在控制器上获取数据网格,但它不允许在函数中输入参数。你如何恢复这些信息

services:
        admin.category:
                class: AppBundle\Admin\CategoryAdmin
                arguments: [~, AppBundle\Entity\Category, AppBundle:CRUDCategory, ~]            
                tags:
                    - { name: sonata.admin, manager_type: orm, group: "General", label: Categories }
这是控制器

<?php

namespace AppBundle\Controller;

use Sonata\AdminBundle\Controller\CRUDController as SonataController;
use Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery as ProxyQueryInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;

class CRUDCategoryController extends SonataController {

    /**
     * @param ProxyQueryInterface $selectedModelQuery
     * @param Request             $request
     *
     * @return RedirectResponse
     */
    public function batchActionInactive(ProxyQueryInterface $selectedModelQuery, Request $request) {        
        $em = $this->getDoctrine()->getManager();
        $category = $em->getRepository('AppBundle:Category')->find($request->getId());
        $category->setState('INACTIVE');
        $em->flush();
        return new RedirectResponse(
            $this->admin->generateUrl('list', $this->admin->getFilterParameters())
        );
    }

}
错误是

可捕获致命错误:参数2传递给 AppBundle\Controller\CRUDCategoryController::batchActionInactive() 必须是AppBundle\Controller\Request的实例,未给定任何实例


这与奏鸣曲无关,而与Symfony有关:您忘记了
请求的use语句。
AppBundle\Controller\Request
应该让您意识到;)

编辑:第二个错误:操作方法应该以**action*

结束,我已经解决了

public function batchActionInactive(ProxyQueryInterface $selectedModelQuery) {
    $em = $this->getDoctrine()->getManager();
    $request = $this->getRequest();
    $ids = $request->request->get('idx');
    foreach ($ids as $id) {
        $category = $em->getRepository('AppBundle:Category')->find($id);
        $category->setState('INACTIVE');
        $em->flush();
    }
    return new RedirectResponse(
        $this->admin->generateUrl('list', $this->admin->getFilterParameters())
    );
}

这样做要容易得多,而不是自己获取类别:

/**
 * @param ProxyQueryInterface $selectedModelQuery
 *
 * @return RedirectResponse
 */
public function batchActionInactive(ProxyQueryInterface $selectedModelQuery)
{
    $selectedCategories = $selectedModelQuery->execute();

    try {
        /** @var Category $category */
        foreach ($selectedCategories as $category) {
            $category->setState('INACTIVE');
            $this->admin->update($category);
        }
    } catch (\Exception $e) {
        $this->addFlash(
            'sonata_flash_error',
            'Could not mark Categories "INACTIVE"'
        );

        $this->get('logger')->error($e->getMessage());

        return new RedirectResponse($this->admin->generateUrl('list', $this->admin->getFilterParameters()));
    }

    $this->addFlash(
        'sonata_flash_success',
        'Categories were marked as "INACTIVE"'
    );

    return new RedirectResponse($this->admin->generateUrl('list', $this->admin->getFilterParameters()));
}

谢谢,我添加了行
use-Symfony\Component\HttpFoundation\Request
,但问题仍在继续请参见我的编辑,您没有将“操作”放在正确的位置我遵循了此文档,尽管symfony处理了您提到的问题,但Sonata确实使用了
batchActionInactive
。因此,这不是一个标准的Symfony操作,这意味着您不能期望提供
$request
。使用
$this->Get('request\u stack')->getCurrentRequest()获取它
/**
 * @param ProxyQueryInterface $selectedModelQuery
 *
 * @return RedirectResponse
 */
public function batchActionInactive(ProxyQueryInterface $selectedModelQuery)
{
    $selectedCategories = $selectedModelQuery->execute();

    try {
        /** @var Category $category */
        foreach ($selectedCategories as $category) {
            $category->setState('INACTIVE');
            $this->admin->update($category);
        }
    } catch (\Exception $e) {
        $this->addFlash(
            'sonata_flash_error',
            'Could not mark Categories "INACTIVE"'
        );

        $this->get('logger')->error($e->getMessage());

        return new RedirectResponse($this->admin->generateUrl('list', $this->admin->getFilterParameters()));
    }

    $this->addFlash(
        'sonata_flash_success',
        'Categories were marked as "INACTIVE"'
    );

    return new RedirectResponse($this->admin->generateUrl('list', $this->admin->getFilterParameters()));
}