symfony - 如何在Symfony 4中正确声明类?

标签 symfony class error-handling controller datatables

我正在尝试根据本教程(https://github.com/webinarium/DataTablesBundle/wiki)使用dataTables,但是有一些麻烦:

src/Controller/DataTableController.php

<?php

namespace App\Controller;

use DataTables\DataTablesInterface;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;

/**
*
* @Route("/users", name="users")
*
* @param Request $request
* @param DataTablesInterface $datatables
* @return JsonResponse
*/

class DataTableController extends Controller
{

  const ID = 'users';

  public function usersAction(Request $request, DataTablesInterface $datatables): JsonResponse
  {
    try {
      // Tell the DataTables service to process the request,
      // specifying ID of the required handler.
      $results = $datatables->handle($request, 'users');

      return $this->json($results);
    }
    catch (HttpException $e) {
      // In fact the line below returns 400 HTTP status code.
      // The message contains the error description.
      return $this->json($e->getMessage(), $e->getStatusCode());
    }
  }

}

src/DataTables/UsersDataTable.php
<?php

use DataTables\DataTableHandlerInterface;
use DataTables\DataTableQuery;
use DataTables\DataTableResults;
use Symfony\Bridge\Doctrine\RegistryInterface;

class UsersDataTable implements DataTableHandlerInterface
{
    protected $doctrine;

    /**
     * Dependency Injection constructor.
     *
     * @param RegistryInterface $doctrine
     */
    public function __construct(RegistryInterface $doctrine)
    {
        $this->doctrine = $doctrine;
    }

    /**
     * {@inheritdoc}
     */
    public function handle(DataTableQuery $request): DataTableResults
    {
        /** @var \Doctrine\ORM\EntityRepository $repository */
        $repository = $this->doctrine->getRepository('AppBundle:User');

        $results = new DataTableResults();

        // Total number of users.
        $query = $repository->createQueryBuilder('u')->select('COUNT(u.id)');
        $results->recordsTotal = $query->getQuery()->getSingleScalarResult();

        // Query to get requested entities.
        $query = $repository->createQueryBuilder('u');

        // Search.
        if ($request->search->value) {
            $query->where('(LOWER(u.username) LIKE :search OR' .
                          ' LOWER(u.email) LIKE :search)');
            $query->setParameter('search', strtolower("%{$request->search->value}%"));
        }

        // Filter by columns.
        foreach ($request->columns as $column) {
            if ($column->search->value) {
                $value = strtolower($column->search->value);

                // "ID" column
                if ($column->data == 0) {
                    $query->andWhere('u.id = :id');
                    $query->setParameter('id', intval($value));
                }
                // "Username" column
                elseif ($column->data == 1) {
                    $query->andWhere('LOWER(u.username) LIKE :username');
                    $query->setParameter('username', "%{$value}%");
                }
                // "Email" column
                elseif ($column->data == 2) {
                    $query->andWhere('LOWER(u.email) LIKE :email');
                    $query->setParameter('email', "%{$value}%");
                }
            }
        }

        // Order.
        foreach ($request->order as $order) {

            // "ID" column
            if ($order->column == 0) {
                $query->addOrderBy('u.id', $order->dir);
            }
            // "Username" column
            elseif ($order->column == 1) {
                $query->addOrderBy('u.username', $order->dir);
            }
            // "Email" column
            elseif ($order->column == 2) {
                $query->addOrderBy('u.email', $order->dir);
            }
        }

        // Get filtered count.
        $queryCount = clone $query;
        $queryCount->select('COUNT(u.id)');
        $results->recordsFiltered = $queryCount->getQuery()->getSingleScalarResult();

        // Restrict results.
        $query->setMaxResults($request->length);
        $query->setFirstResult($request->start);

        /** @var \AppBundle\Entity\User[] $users */
        $users = $query->getQuery()->getResult();

        foreach ($users as $user) {
            $results->data[] = [
                $user->getId(),
                $user->getUsername(),
                $user->getEmail(),
            ];
        }

        return $results;
    }
}

config/services.yaml
parameters:
    locale: 'en'

services:
    # default configuration for services in *this* file
    _defaults:
        autowire: true      # Automatically injects dependencies in your services.
        autoconfigure: true # Automatically registers your services as commands, event subscribers, etc.
        public: false       # Allows optimizing the container by removing unused services; this also means
                            # fetching services directly from the container via $container->get() won't work.
                            # The best practice is to be explicit about your dependencies anyway.


    # makes classes in src/ available to be used as services
    # this creates a service per class whose id is the fully-qualified class name
    App\:
        resource: '../src/*'
        exclude: '../src/{Entity,Migrations,Tests,Kernel.php}'

    # controllers are imported separately to make sure services can be injected
    # as action arguments even if you don't extend any base controller class
    App\Controller\:
        resource: '../src/Controller'
        tags: ['controller.service_arguments']

    # add more service definitions when explicit configuration is needed
    # please note that last definitions always *replace* previous ones

    datatable.users:
       class: AppBundle\DataTables\UsersDataTable
       tags: [{ name: datatable, id: users }]
       arguments: [ '@doctrine' ]

我收到错误消息:

enter image description here

最佳答案

您忘记了UsersDataTable类文件的 namespace 。我认为应该
namespace App\DataTable\UsersDataTable;

还要在services.yaml中更改一个

关于symfony - 如何在Symfony 4中正确声明类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51205306/

相关文章:

symfony - 原则 2 native 查询从连接实体中选择

symfony - 教义 : ORM QueryBuilder or DBAL QueryBuilder

c++ - 将成员函数的返回类型引用到 C++ 中的自定义类

ruby-on-rails - 用于自定义验证的Shoulda Matchers with_message错误

java - 如何解决继承抽象类方法的错误?

linux - AWS ECS 上的 Docker 容器始终显示 STOPPED

php - 你如何在 symfony2 的表单类中隐藏标签?

c++ - 编译器会折叠结构相同的类吗?

python - 需要替换几个文本文件中每一行的第一个单词

symfony - 值必须是字符串类型,返回null