我正在尝试显示数据库表,我正在使用以下作曲家和树枝:
private $doctrine;
public function __construct(ManagerRegistry $doctrine)
{
$this->doctrine = $doctrine;
}
#[Route('/', name: 'app_signal_index', methods: ['GET'])]
public function index(Request $request, Signal $signal): Response
{
$priority = $request->query->get('priority');
$contributor = $request->query->get('contributor');
$status = $request->query->get('status');
$transition = null;
$resolution = null;
if ($priority !== null) {
$transition = $this->doctrine->getRepository(TransitionSignal::class)->findBy(['transition' => $priority]);
}
if ($contributor !== null) {
$transition = $this->doctrine->getRepository(TransitionSignal::class)->findBy(['transition' => $contributor]);
}
if ($status !== null) {
$resolution = $this->doctrine->getRepository(ResolutionSignal::class)->findBy(['resolution' => $status]);
}
return $this->render('signal/index.html.twig', [
'signal' => $signal,
'transition' => $transition,
'resolution' => $resolution,
]);
在树枝中:
{% for signal in signals %}
<tr>
<td>{{ signal.id }}</td>
<td>{{ signal.date ? signal.date|date('Y-m-d H:i:s') : '' }}</td>
<td>{{ signal.address }}</td>
<td>{{ signal.description }}</td>
<td>{{ transition.priority }}</td>
<td>{{ transition.contributor }}</td>
<td>{{ resolution.actionPlanStatus }}</td>
<td>
<div class="mt-3">
<div class="btn-group" role="group" aria-label="Basic example">
<a href="{{ path('app_signal_show', {'id': signal.id}) }}" class="btn btn-secondary" role="button">show</a>
<a href="{{ path('app_signal_edit', {'id': signal.id}) }}" class="btn btn-secondary" role="button">edit</a>
</div>
</div>
</td>
</tr>
{% else %}
<tr>
<td colspan="26">no records found</td>
</tr>
{% endfor %}
服务器返回以下错误消息: 无法自动装配“App\Controller\SignalController::index()”的参数 $signal:它需要“App\Entity\Signal”的实例,但此类型已在“config/services.yaml”中排除。
我希望显示数据库中的表格
这是一个非常简单的答案。您正在尝试将
Signal
实体自动连接到您的路线函数中。默认的 Symfony 依赖注入(用于自动装配依赖项)被配置为排除某些类。通常,它在您的 config/services.yaml
中看起来像这样
services:
# Some other config
App\:
resource: '../src/'
exclude:
- '../src/DependencyInjection/'
- '../src/Entity/'
- '../src/Kernel.php'
这意味着您的实体不会由框架自动装配。
但是,这在您的用例中有一个简单的修复。在路由中注入实体时,您应该提供一些有关如何使用
EntityValueResolver
检索实体的信息。您可以在here了解它,只需确保切换到您确切的 Symfony 版本即可。
然后您应该修改您的路线,以包含一些有关如何获取实体的信息。假设您想通过 ID 获取实体。 路线看起来像这样
#[Route('/{id}', name: 'app_signal_index', methods: ['GET'])]
public function index(Request $request, Signal $signal): Response
{
$priority = $request->query->get('priority');
$contributor = $request->query->get('contributor');
$status = $request->query->get('status');
$transition = null;
$resolution = null;
if ($priority !== null) {
$transition = $this->doctrine->getRepository(TransitionSignal::class)->findBy(['transition' => $priority]);
}
if ($contributor !== null) {
$transition = $this->doctrine->getRepository(TransitionSignal::class)->findBy(['transition' => $contributor]);
}
if ($status !== null) {
$resolution = $this->doctrine->getRepository(ResolutionSignal::class)->findBy(['resolution' => $status]);
}
return $this->render('signal/index.html.twig', [
'signal' => $signal,
'transition' => $transition,
'resolution' => $resolution,
]);
}
如果您想获取整个信号表,就像您在问题中所说的那样,您必须从路由函数中删除
Signal
参数,并使用函数内的存储库来获取所需的实体。另请注意,传递到 Twig 的变量在模板和路线中具有不同的名称(signal
vs signals
)
#[Route('/', name: 'app_signal_index', methods: ['GET'])]
public function index(Request $request): Response
{
$signals = $this->doctrine->getRepository(Signal::class)->findAll();
$priority = $request->query->get('priority');
$contributor = $request->query->get('contributor');
$status = $request->query->get('status');
$transition = null;
$resolution = null;
if ($priority !== null) {
$transition = $this->doctrine->getRepository(TransitionSignal::class)->findBy(['transition' => $priority]);
}
if ($contributor !== null) {
$transition = $this->doctrine->getRepository(TransitionSignal::class)->findBy(['transition' => $contributor]);
}
if ($status !== null) {
$resolution = $this->doctrine->getRepository(ResolutionSignal::class)->findBy(['resolution' => $status]);
}
return $this->render('signal/index.html.twig', [
'signals' => $signals,
'transition' => $transition,
'resolution' => $resolution,
]);
}
你的例子有点奇怪,我无法正确理解你想要完成什么。但似乎您想打印出数据库中的每个信号并包含相关的转换信号?如果您需要更多建议,请提供一些有关用例的信息。
我想指出的另一件事是,您应该将逻辑分离到服务类中并将其注入到控制器中,而不是在控制器中注入 Doctrine。或者至少注入所需的存储库,然后在代码中提供更多的类型安全性。您可以使用构造函数和构造函数属性提升(如果您使用的是 PHP 8 或更高版本)来执行此操作
public function __construct(
private TransitionSignalRepository $transitionSignalRepository,
private ResolutionSignalRepository $resolutionSignalRepository,
) {}
您只需致电
$this->doctrine->getRepository(TransitionSignal::class)->findBy(['transition' => $priority]);
,而不是执行 $this->transitionSignalRepository->findBy(['transition' => $priority]);
。