我在 Symfony (6.1.4) 表單中遇到了一個有點奇怪和令人沮喪的問題。我也在使用 Sulu CMS(因此在renderStructure()
下面的控制器中呼叫),但我遇到的問題似乎與此無關。
我已經確認表單驗證作業正常。所有正確的錯誤訊息都會顯示在 Web Profiler 中。但是,錯誤從未真正顯示在頁面上。
我嘗試使用手動顯示每個欄位form_errors()
的錯誤,盡管網路分析器檢測到錯誤并且回應中顯示了正確的錯誤,但什么也沒有顯示。如果我打電話form_errors(form)
,所有錯誤都會出現在我打電話的地方。好像error_bubbling
在某處啟用了,但我實際上并沒有啟用它。我還嘗試在每個欄位上以及在configureOptions()
呼叫時將該選項設定為 false $resolver->setDefaults()
。它沒有任何影響。
我清除 Symfony 快取、瀏覽器快取和 cookie 的次數超出了我的想象。我嘗試重新安裝供應商,同時忽略我的 Composer 快取。我已經用 Webpack Encore 重建了我的資產,我認為那里可能出了點問題。沒運氣。
我目前正在使用 Symfony Bootstrap 5 主題。我也嘗試過使用 Bootstrap 4 主題和默認主題。兩者都有相同的結果。
所有這些讓我相信這很可能是某種配置問題。但是我已經完全沒有關于去哪里尋找或嘗試什么的想法了。不幸的是,我在這個網站上找到的關于這個主題的解決方案都沒有幫助,Symfony 檔案也沒有。
我的控制器中用于創建、處理和呈現表單的代碼:
$form = $this->createForm(SomeSortOfType::class, $entity);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$entity = $form->getData();
// Do some stuff
$this->addFlash('success', 'Success message');
} else {
// The following line correctly shows that the form has errors:
// dump($form->getErrors()); exit;
$this->addFlash('error', 'Error message');
}
}
// As mentioned above, this is Sulu specific but all responses appear to be generated correctly
$response = $this->renderStructure(
$structure,
[
'form' => $form->createView(),
],
$preview,
$partial,
);
return $response;
我的樹枝配置:
twig:
default_path: '%kernel.project_dir%/templates'
form_themes: ['bootstrap_5_layout.html.twig']
我的 Twig 模板中的一些示例:
{{ form_row(form.contact) }}
{# a bunch of stuff #}
{{ form_label(form.reportingPeriod) }}
<div class="input-group mb-4">
{{ form_widget(form.reportingPeriod) }}
{{ form_widget(form.reportingType) }}
</div>
{{ form_errors(form.reportingPeriod) }}
{{ form_errors(form.reportingType) }}
除非我打電話form_errors(form)
,否則錯誤永遠不會出現在我的表單中的任何地方。我什至檢查了頁面的來源,以確保它們沒有因某種原因被隱藏。他們根本就不會被渲染。
如果需要任何其他資訊或配置,我非常愿意發布它。提前致謝!
uj5u.com熱心網友回復:
我最終通過結合在 Stack Overflow 上找到的其他答案解決了這個問題。我使用Nairi Abgaryan 的答案來幫助提取有錯誤的表單欄位的屬性路徑。提取后,我使用DonCallisto 的 answer手動將錯誤添加到每個屬性路徑。
我仍然不明白為什么 Symfony 沒有自動完成這項作業。Form 組件確切地知道哪些欄位有錯誤。Symfony 甚至在 web profiler 中顯示它們。在渲染視圖之前,它必須在流程中的某個時刻移除它們。
error_bubbling => false
似乎它應該這樣做,但它似乎對錯誤是否冒泡沒有任何影響。他們似乎總是冒泡到最頂層。我需要做更多的除錯來弄清楚它到底在哪里分崩離析,以及我需要進行哪些配置更改。
雖然不是我的確切代碼,但希望這將幫助其他人為自己的情況制定解決方案。理想情況下,將此功能轉換為服務可能是最好的(除非我不知道已經存在)。
$form = $this->createForm(SomeSortOfType::class, $entity, [
'attr' => [
// set this if you want to force server-side validation
'novalidate' => 'novalidate',
],
]);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$entity = $form->getData();
// do stuff with the submitted data
$this->addFlash('success', 'You did it!');
} else {
$errors = [];
foreach ($form->getErrors(true) as $error) {
$path = $error->getCause()->getPropertyPath();
if (empty($path)) {
break;
}
$path = \preg_replace('/^(data.)|(.data)|(\\])|(\\[)|children/', '', $path);
$message = $error->getCause()->getMessage();
$errors[$path] = $message;
}
foreach ($errors as $path => $message) {
$form->get($path)->addError(new FormError($message));
}
$this->addFlash('error', 'You failed!');
}
}
$response = $this->renderStructure(
$structure,
[
'form' => $form->createView(),
],
$preview,
$partial,
);
return $response;
在 Twig 模板中:
{{ form_row(form.someField) }}
{# or #}
{{ form_errors(form.someField) }}
form_row()
現在form_errors()
將正確顯示每個屬性路徑的錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/503888.html