Php Symfony控制器中的表单
我不明白我应该把我的表格代码放在我的symfony4项目的什么地方。据我所知,您不应该在控制器中有业务逻辑,但您需要扩展控制器以使用$this->createFormPhp Symfony控制器中的表单,php,symfony,dependency-injection,symfony4,Php,Symfony,Dependency Injection,Symfony4,我不明白我应该把我的表格代码放在我的symfony4项目的什么地方。据我所知,您不应该在控制器中有业务逻辑,但您需要扩展控制器以使用$this->createForm class HomeController extends Controller { public function index(Request $request) { $article = new Article(); $form = $this->createForm(Art
class HomeController extends Controller
{
public function index(Request $request)
{
$article = new Article();
$form = $this->createForm(ArticleType::class, $article);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$article = $form->getData();
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($article);
return $this->redirect("/");
}
return $this->render('home/home.html.twig', [
'form' => $form->createView()
]);
}
}
谢谢在我看来,在Controller中使用表单没有什么错。 然而,如果您想保持控制器的苗条,您可以将业务逻辑转移到服务。 例如:
<?php
// src/Form/Type/ArticleType.php
namespace App\Form\Type;
use App\Entity\Article;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
//you must use the classes you use in the form
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
//add your form code here
$builder
->add()
->add ()
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
//write here your options
));
}
public function getBlockPrefix()
{
return null;
}
}
应用程序\控制器\家庭控制器:
类HomeController扩展控制器
{
//注入物品服务
公共函数indexRequest$request,ArticleServiceInterface$articleService
{
$article=新文章;
$form=$this->createFormArticleType::class$article;
$form->HandlerRequest$请求;
如果$form->isSubmitted&&$form->isValid{
$articleService->create$form->getData;
返回$this->redirect/;
}
返回$this->render'home/home.html.twig'[
'form'=>$form->createView
];
}
}
App\Services\ArticleService:
类ArticleService实现ArticleServiceInterface
{
私人$entityManager;
公共函数uu ConstructentityManager接口$entityManager{
$this->entityManager=$entityManager;
}
公共函数createArticle$article
{
//你可以在这里做一些额外的事情
$this->entityManager->persist$article;
$this->entityManager->flush;
}
}
在这个特定的例子中,这是一个完全的过度杀伤力,但给出了一个可能的想法
更多信息请参见。在一个大中型项目中,或者为了更加有序,您必须将其放入src/Form/Type/folder中,您必须创建它。在您的示例中:
<?php
// src/Form/Type/ArticleType.php
namespace App\Form\Type;
use App\Entity\Article;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
//you must use the classes you use in the form
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
class ArticleType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
//add your form code here
$builder
->add()
->add ()
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
//write here your options
));
}
public function getBlockPrefix()
{
return null;
}
}
因为OP已经在控制器中调用了它:$form=$this->createFormArticleType::class,$article;,我猜他已经定义了ArticleType类了。当然,但他问把表单代码放在哪里,大型项目的符号结构也很清楚。