Symfony2 - Service/Controller - 使用控制器作为服务来显示来自实体的数据
Symfony2 - Service/Controller - using a controller as a service in order to display datas from entities
在我的 Symfony 应用程序 中,我正在尝试使用控制器作为服务,以便在 table.[=29 中显示我需要的数据=]
这两个实体是 Categories.php
和 SubCategories.php
。
1 个类别 可以有 多个子类别 并且 1 个子类别 可以属于 只有一个类别。我有一个关系 ManyToOne
,FK 在我的 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)
在我的 Symfony 应用程序 中,我正在尝试使用控制器作为服务,以便在 table.[=29 中显示我需要的数据=]
这两个实体是 Categories.php
和 SubCategories.php
。
1 个类别 可以有 多个子类别 并且 1 个子类别 可以属于 只有一个类别。我有一个关系 ManyToOne
,FK 在我的 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)