Symfony4:实体对象和控制器 - @ParamConverter注释控制器函数

时间:2018-04-12 23:03:43

标签: symfony4

这是我在Stackoverflow上的第一篇文章。 我的问题涉及Symfony4 Framework。

在我的项目中,我希望从控制器中检索一些csv文件。 但是我遇到了一个我不理解的问题。

但是,让我们看看在此之前我做了什么。

  1. 我创建了我的项目:composer create-project symfony/website-skeleton dash
  2. 我创建了一个实体:php bin/console make:entity => BnkAccountOperation
  3. 字段确定后,我已使用以下网址迁移:php bin/console doctrine:migrations:migrate
  4. 然后我创建了我的CRUD模型:php bin/console make:crud
  5. 到目前为止一切都很好。视图和表单有效,但我想用csv文件检索我的数据。

    我在 BnkAccountOperationController 中构建了以下函数(我知道有更简单,更好,更通用的方法,但目前还不错):

    代码

    控制器 - BnkAccountOperationController.php 文件头:

    <?php
    namespace App\Controller;
    
    use App\Entity\BnkAccountOperation;
    use App\Form\BnkAccountOperationType;
    use App\Repository\BnkAccountOperationRepository;
    
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Annotation\Route;
    
    /**
    * @Route("/bnk/account/operation")
    */
    class BnkAccountOperationController extends Controller
    {
    

    控制器功能 - exportcsv()

    /**
    *
    * @Route("/raw.csv")
    */
    public function exportcsv()
    {
        $repository = $this->getDoctrine()->getManager()->getRepository(BnkAccountOperation::class);
        $operations = $repository->findAll();
    
        $rows = array();
        foreach ($operations as $operation) 
        {
            $data = array(
                $operation->getOpDate()->format('d-m-Y'), 
                $operation->getOpType(), 
                $operation->getOpCategory(),
                $operation->getOpLabel(),
                $operation->getOpValue()
            );
            $rows[] = implode(',', $data);
        }
    
        $content  = implode("\n", $rows);
        $response = new Response($content);
        $filename = "raw.csv";
        $response->setStatusCode(200);
        $response->headers->set('Content-Type', 'text/csv; charset=utf-8', 'application/force-download');
        $response->headers->set('Content-Disposition','attachment; filename='.$filename);
    
        return $response;
    }
    

    之前输入的命令还有5个生成的CRUD函数:

    1. function index(BnkAccountOperationRepository $bnkAccountOperationRepository): Response
    2. public function new(Request $request): Response
    3. public function show(BnkAccountOperation $bnkAccountOperation): Response
    4. public function edit(Request $request, BnkAccountOperation $bnkAccountOperation): Response
    5. public function delete(Request $request, BnkAccountOperation $bnkAccountOperation): Response
    6. 我的问题

      因此,如果我在第5个函数之后立即放置exportcsv()函数,我将向我提出这个错误:

      以下是项目的配置信息:

      parameters:
          locale: 'en'
      services:
          _defaults:
              autowire: true
              autoconfigure: true
              public: false 
      App\:
          resource: '../src/*'
          exclude: '../src/{Entity,Migrations,Tests,Kernel.php}'
      
      App\Controller\:
          resource: '../src/Controller'
          tags: ['controller.service_arguments']
      
      • 项目中 / src 文件夹的内容

        .
        ├── Controller
        │   ├── BnkAccountOperationController.php
        ├── Entity
        │   └── BnkAccountOperation.php
        ├── Form
        │   └── BnkAccountOperationType.php
        ├── Kernel.php
        ├── Migrations
        │   └── Version20180409113840.php
        ├── Repository
        │   └── BnkAccountOperationRepository.php
        └── Utils
        

      我找到的解决方法

      我在网上进行了一些搜索,发现我必须将我的功能放在第一个(索引功能)上。 通过这样做它有效。我可以检索我的csv文件。

      但是我仍然不明白为什么它不起作用,因为我的函数是在控制器上声明的最后一个。

      我的问题

      1. 与路径配置问题有关吗?
      2. 如何避免这种注释错误(即:如果我将另一个函数添加为importcsv)?我在Symfony version4 - ParamConverter
      3. 看到它没有得到维护
      4. 我应该在我的Util文件夹下创建一个类来安排这种工作,只是用我的控制器进行路由?
      5. 非常感谢任何帮助理解这一点。

0 个答案:

没有答案