Symfony2 - Service/Controller - 使用控制器作为服务来显示来自实体的数据

Symfony2 - Service/Controller - using a controller as a service in order to display datas from entities

在我的 Symfony 应用程序 中,我正在尝试使用控制器作为服务,以便在 table.[=29 中显示我需要的数据=]

这两个实体是 Categories.phpSubCategories.php1 个类别 可以有 多个子类别 并且 1 个子类别 可以属于 只有一个类别。我有一个关系 ManyToOneFK 在我的 SubCategories 实体 中。因此,在我的 Symfony/Doctrine 项目中,我的 SubCategories.php 实体中有一个变量 $category

这是我的树枝 view,她将用于在 table 中搜索我的 Categories.php 实体的所有数据:

       <table id="dataTablesCategories">
          <thead>
            <tr>
              <th>reference</th>
              <th>id</th>
              <th>name</th>
              <th>description</th>
              <th>Sub Categories</th>
              <th>Action</th>
            </tr>
          </thead>
          <tfoot>
            <tr>
              <th>reference</th>
              <th>id</th>
              <th>name</th>
              <th>description</th>
              <th>Sub Categories</th>
              <th>Action</th>
            </tr>
          </tfoot>
          <tbody>
            {% for category in category %}
              <tr>
                <td>{{ category.reference }}</td>
                <td>{{ category.id }}</td>
                <td>{{ category.name}}</td>
                <td>{{ category.description}}</td>
                <td>
                    <a href="{{ path('indexSubCategories ', {'category': subCategories.category}) }}"><button class="btn btn-default btn-xs">Détails</button></a>
                </td>
                <td>
                  <a href="{{ path('editCategory ', {'name': category.name}) }}"><button class="btn btn-warning btn-xs">Modifier</button></a>
                </td>
              </tr>
            {% endfor %}  
          </tbody> 
        </table>

如您所见,在我的子类别列中,我有一个链接到子类别索引的 。事实上,我正在尝试重定向到子类别索引以管理它们。但是,如果我单击此按钮 Details,我希望 indexSubCategories 显示与我单击的类别相关的所有子类别。

像这样:

    table for indexCategory
+-------------+-------------------------+
| name        | Sub Categories          |
+-------------+-------------------------+
| Category 1  |  Details button         |
|             |  href=indexSubcategory  |
|             |   for Category 1        |
+-------------+-------------------------+
| Category 2  |  Details button         |
|             |  href=indexSubcategory  |
|             |   for Category 2        |
+-------------+-------------------------+

因此,当我单击详细信息按钮时,它会显示在 indexSubcategories 中,即我单击详细信息按钮的类别行的所有子类别。

这是我的类别控制器:

public function indexCategoriesAction()
    {
        $em=$this->getDoctrine()->getManager();
        $category = $em->getRepository('MySpaceMyBundle:Categories')->findAll();


        return $this->render('MySpaceMyBundle:MyFolder:indexCategories.html.twig', array('category ' => $category ));
}

这是我的子类别控制器:

public function indexSubCategoriesAction ($category)
{
            $em=$this->getDoctrine()->getManager();
            $subcategory = $em->getRepository('MySpaceMyBundle:SubCategories')->findOneByCategory($category);


            return $this->render('MySpaceMyBundle:MyFolder:indexSubCategories.html.twig', array('subcategory' => $subcategory));
}

indexSubCategories.html.twig 中,我在 table 中做同样的事情,就像我在 indexCategories.html.twig.

中做的一样简单

我想我需要使用 SubCategories 控制器作为服务来制作它?

这是我的路线文件:

# categories index #
indexCategories:
    path:     /managecategories
    defaults: { _controller: MySpaceMyBundle:MyController:indexCategories }
    requirements:
    methods: GET

# Subcategories index #
indexCategories:
    path:     /managecategories/subcategories/{category}
    defaults: { _controller: MySpaceMyBundle:MyController:indexSubCategories }
    requirements:
    methods: GET

我该如何继续?

我已经看过 here,但我如何真正提供服务?

感谢您的帮助。


更新

我尝试使用我的 SubcategoriesController.php 作为一项服务。在我的 service.yml(同一个文件夹包)中,这是我的代码:

services:
    subCategoriesDetail:
        class: MyCompany\MyBundle\Controller\SubcategoriesController

我在CategoriesController.php中这样称呼:

public function indexCategoriesAction()
    {
        $em=$this->getDoctrine()->getManager();
        $category = $em->getRepository('MySpaceMyBundle:Categories')->findAll();
        $SubCategoriesController = $this->get('subCategoriesDetail');

        return $this->render('MySpaceMyBundle:MyFolder:indexCategories.html.twig', array('categories' => $category ));
}

但是我有这个错误,这是我第一次尝试使用控制器作为服务:

Attempted to load class "SubCategories" from namespace "MyCompany\MyBundle\Controller" in C:\wamp\www\my\path\to\my\project\cache\dev\appDevDebugProjectContainer.php line 618. Do you need to "use" it from another namespace?

你有错字吗?

您正在从控制器 array('subcategory' => $subcategory) 传递,但正在尝试渲染 {'category': subCategories.category}

此外,我建议将名称更改为树枝循环:

{% for category in category %}

因为在循环之后,category会是一个元素而不是原来的集合


更新

您应该将控制器从

public function indexSubCategoriesAction ($category)
{
    $em=$this->getDoctrine()->getManager();
    $subcategory = $em->getRepository('MySpaceMyBundle:SubCategories')
        ->findOneByCategory($category);


    return $this->render('MySpaceMyBundle:MyFolder:indexSubCategories.html.twig', array(
        'subcategory' => $subcategory));
}

public function indexSubCategoriesAction ($category)
{
    $em=$this->getDoctrine()->getManager();
    $subcategory = $em->getRepository('MySpaceMyBundle:SubCategories')
        ->findOneByCategory($category);


    return $this->render('MySpaceMyBundle:MyFolder:indexSubCategories.html.twig', array(
        'subCategories' => $subcategory));
}

或者您应该从

更改您的树枝模板
<td>
  <a href="{{ path('indexSubCategories ', {'category': subCategories.category}) }}"><button class="btn btn-default btn-xs">Détails</button></a>
</td>

<td>
  <a href="{{ path('indexSubCategories ', {'category': subcategory.category}) }}"><button class="btn btn-default btn-xs">Détails</button></a>
</td>

更新

通过与 OP 的交谈,我了解到他只需要从一个类别中检索一个子类别。我告诉他,这可以很容易地通过从视图调用直接方法(点表示法)来获得,因为对象彼此相关(ORM)