我正在开始使用 Symfony 2 并且正在遵循本教程。现在,本教程很简单,我能够完全遵循它。这是我的控制器中的代码
<?php
namespace DemoCompany\HelloBundle\Controller;
use Symfony\Component\HttpFoundation\Response;
class HelloController{
    public function indexAction($name){
        return new Response('<h1>hello ' . ucfirst($name) . '</h1>');
    }
}
Run Code Online (Sandbox Code Playgroud)
现在,我有一些问题
当我运行代码而不包含 时namespace DemoCompany\HelloBundle\Controller;,它会给我一个错误。但当包含这一行时,它确实工作得很好;所以我想知道:为什么它可以与名称空间语句一起使用以及为什么它不能在没有名称空间的情况下工作。请澄清。
后续问题:我正在返回一个新Response对象,但它既没有被定义,也没有我的类HelloController扩展一些基类(可能定义了这个响应对象)。所以问题是:PHP 如何找到并加载这个文件?
在 Symfony 中,自定义控制器/模型/视图是否需要扩展某些基类?例如,在 Codeigniter 中,我们必须执行类似的操作class Blog extends CI_Controller,以便 CI_Controller 中定义的所有方法都可以在当前作用域中使用$this。Symfony 有相同的做法还是有不同的做法?
既然这个控制器的命名空间为DemoCompany\HelloBundle\Controller,那么正常的 PHP 函数如何在没有反斜杠的情况下工作呢?
我有一个表单'错误冒泡的问题.我的表单中的一个字段定义如下:
$formBuilder->add('title','text',
   'required'  => true, 
   'error_bubbling' => false,
   )
)
Run Code Online (Sandbox Code Playgroud)
我想在这个字段中添加这样的验证器:
/**
  * @Assert\True(message = "Bad title.")
  */
public function getTitleCorrect()
{
    /* ... */     
    return false;
} 
Run Code Online (Sandbox Code Playgroud)
它工作正常,但错误消息显示在窗体的顶部,而不是在字段行中.
在Twig模板中,此错误消息由{{form_errors(form)}}全局错误呈现.当我使用时{{form_errors(form.title)}},它不会打印我的错误.
我该怎么做才能更改错误的分配?
我网站上的主页有一个包含两个字段的表单:Make of the Car(carmake)和Car Model(carmodel).提交后,它会将用户带到第二页,显示有关用户在主页上输入的特定品牌和型号的信息.
我使用post-method将变量传递给第二页,在那里我用两个变量开始一个新的会话:
    <?php 
       session_start(); 
       $_SESSION['carmake']=$_POST['carmake'];
       $_SESSION['carmodel']=$_POST['carmodel'];
    ?>
Run Code Online (Sandbox Code Playgroud)
这很好用.在第2页,我有一个第3页的链接,它使用相同的两个会话变量.因此,在第3页,我使用会话功能启动页面,并且会话变量可供使用.到目前为止没问题.
从这一点开始,我遇到了两个问题:
问题1:我在第3页上有一个链接回第2页的按钮.当我使用此按钮返回第2页时,第2页不会回显会话变量.但是,如果我使用浏览器"后退"按钮返回第二页,我会被要求"确认重新提交",然后第二页正确回显会话变量.
我的问题1:如何在不丢失会话变量的情况下设计导航到以前访问过的页面?
问题2:有没有办法避免在先前访问过的使用会话变量的页面上"确认重新提交"(当使用浏览器后退按钮时)?
(我是这里的新手,并提前为长篇文章道歉,这可能是一个非常简单的问题.)
我想要这个功能
$entityManager
->getRepository('AppBundle:Example')
->findBy(array('id' => $id, 'active' => true));
Run Code Online (Sandbox Code Playgroud)
返回以ID 作为键的示例对象的关联数组。例如:
array(
    '100' => 'Example object 1',
    '135' => 'Example object 2'
)
Run Code Online (Sandbox Code Playgroud)
我可以foreach在检索数据后使用来实现此目的,但我想知道是否有正确的方法来执行此操作。
什么需要在该领域走PostgreSQL Binary Path在File> Preferences> Path> Binary paths?
从 Symfony 6.1 升级到 6.2 后,我收到此错误:
属性“Symfony\Component\Routing\Annotation\Route”无法定位函数(允许的目标:类、方法)
...在此控制器上:
final class HomepageController extends AbstractController
{
    #[Route(path: '/', name: 'homepage')]
    public function __invoke(): Response
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud) 环顾了一会后,我仍然找不到让数据库服务器插入 CURRENT_TIMESTAMP 的方法(作为默认值 on INSERT)。
问题:当您将对象持久保存到数据库时,Doctrine 将丢失的字段显式设置为 NULL。所以看起来,在表定义中设置默认值,根本没有任何影响:-(
我不想通过 PHP(例如$object->setTimestamp(new \DateTime());)设置时间,因为这可能返回与数据库服务器不同的时间,如下所述:https : //stackoverflow.com/a/3705090/1668200  
到目前为止我尝试过的:
按NOW字面意思发送(例如$object->setTimestamp('NOW()');),如下所述:https : //stackoverflow.com/a/13850741/1668200
 
=> 没用:Error: Call to a member function format() on string
在持久化对象之前从对象中删除 'timestamp' 属性(参见/sf/answers/252053091/)也不起作用:无论如何,该字段被 Doctrine 设置为 NULL。
我发现的任何其他解决方案(包括 Doctrine 扩展“Timestampable” https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/timestampable.md)都使用 PHP 的时间。
我在 Symfony 3.4 中有一个这样的表单集合:
// MainType.php
$builder->add('children', CollectionType::class, ['entry_type' => ChildType::class]);
Run Code Online (Sandbox Code Playgroud)
// ChildType.php
$builder->add('myField', null, ['mapped' => false]);
// plus more fields, mapped to the underlying `Child` entity
Run Code Online (Sandbox Code Playgroud)
// Controller
$form = $this->createForm(MainType::class, ['children' => $children]);
$form->handleRequest($request);
if ($form->isSubmitted() and $form->isValid()) {
    // How can I access the data of `myField` here?
}
Run Code Online (Sandbox Code Playgroud)
当以通常的方式进行时
$data = $form->getData();
Run Code Online (Sandbox Code Playgroud)
...我得到的是实体数组Child,而不是表单本身。
换句话说,问题是:在表单集合中,如何访问子表单而不是子实体?
我有一个Service对象,它将对象存储到会话中
$this->session->set('utmUser', $this->session->serialize($this->utmUser));
Run Code Online (Sandbox Code Playgroud)
我从会话中获取了反序列化的对象:
$this->utmUser = $this->session->unserialize($this->session->get('utmUser'));
Run Code Online (Sandbox Code Playgroud)
但结果不是存储对象的实例.
会话包含此序列化字符串:
string(221)"a:2:{i:0; O:68:"Symfony\Component\HttpFoundation\SessionStorage\NativeSessionStorage":1:{s:10:"*options"; a:5:{s:8 : "寿命"; I:0; S:4: "路径"; S:1: "/"; S:6: "结构域"; S:0: ""; S:6: "安全"; b: 0; S:8: "仅Http"; b:0;}} I:1; S:2: "EN";}"
将对象的所有属性设置为受保护不起作用.我究竟做错了什么?
我已经建立了一个rest-api应用程序,但是如果我想更新一个实体,symfony会更改整个行。因此,GET-Request中未提供的字段也将更改并设置为NULL。
我只想更新GET-Request中包含的字段。
public function update(int $id, Request $request, UserPasswordEncoderInterface $passwordEncoder) {
  $account = $this->repository->find($id);
  if ($account == null) {
    throw new HttpException(Response::HTTP_NOT_FOUND);
  }
  $form = $this->createForm(UserType::class, $account);
  $form->submit($request->request->all());
  if ($form->isSubmitted() && $form->isValid()):
    $account->setPassword(
      $passwordEncoder->encodePassword(
        $account,
        $form->get('password')->getData()
      )
    );
    $em = $this->getDoctrine()->getManager();
    try {
      $em->flush();
    } catch (\Exception $e) {
      throw new HttpException(Response::HTTP_BAD_REQUEST, $e->getMessage());
    }
    return $this->view(null, Response::HTTP_NO_CONTENT);
  else:
    return $this->view($form, Response::HTTP_BAD_REQUEST);
  endif;
 }
Run Code Online (Sandbox Code Playgroud)