Symfony 4-FOSUserBundle-在自定义路由上呈现用户信息



我在自定义ProfileController 中有一个构造函数和路由

private $userManager;
public function __construct(UserManagerInterface $userManager)
{
$this->userManager = $userManager;
}
/**
* @Route("/profile/bookings", name="profile_bookings")
*/
public function bookings()
{
$user = $this->getUser();
return $this->render('profile/bookings/bookings.html.twig', array('user'=>$user));
}

在我的模板中,我引用了

{{user.first_name}}

但我得到了错误:

HTTP 500内部服务器错误属性"first_name"和方法"first_name(("、"getfirst_name(。

如何从数据库中获取用户信息并显示在配置文件的子页面中?

编辑:用户实体。。。

<?php
namespace AppEntity;
use DoctrineCommonCollectionsArrayCollection;
use DoctrineCommonCollectionsCollection;
use DoctrineORMMapping as ORM;
use FOSUserBundleModelUser as BaseUser;
/**
* @ORMEntity
* @ORMTable(name="`user`")
*/
class User extends BaseUser
{
/**
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
* @ORMColumn(type="integer")
*/
protected $id;
/**
* @ORMColumn(type="string", length=190)
*/
private $first_name;
/**
* @ORMColumn(type="string", length=190)
*/
private $last_name;
/**
* @ORMColumn(type="string", length=190, nullable=true)
*/
private $phone_number;
/**
* @ORMColumn(type="integer", nullable=true)
*/
private $profile_height;
/**
* @ORMColumn(type="integer", nullable=true)
*/
private $profile_weight;
/**
* @ORMColumn(type="date", nullable=true)
*/
private $profile_dob;
/**
* @ORMColumn(type="string", length=190, nullable=true)
*/
private $profile_gender;
/**
* @ORMOneToMany(targetEntity="AppEntityBooking", mappedBy="user")
*/
private $bookings;
public function __construct()
{
parent::__construct();
$this->bookings = new ArrayCollection();
}
/**
* Overridde setEmail method so that username is now optional
*
* @param string $email
* @return User
*/
public function setEmail($email)
{
$this->setUsername($email);
return parent::setEmail($email);
}
public function getFirstName()
{
return $this->first_name;
}
public function setFirstName($first_name)
{
$this->first_name = $first_name;
}
public function getLastName()
{
return $this->last_name;
}
public function setLastName($last_name)
{
$this->last_name = $last_name;
}
public function getPhoneNumber(): ?string
{
return $this->phone_number;
}
public function setPhoneNumber(string $phone_number): self
{
$this->phone_number = $phone_number;
return $this;
}
public function getProfileHeight(): ?int
{
return $this->profile_height;
}
public function setProfileHeight(?int $profile_height): self
{
$this->profile_height = $profile_height;
return $this;
}
public function getProfileDob(): ?DateTimeInterface
{
return $this->profile_dob;
}
public function setProfileDob(?DateTimeInterface $profile_dob): self
{
$this->profile_dob = $profile_dob;
return $this;
}
public function getProfileWeight(): ?int
{
return $this->profile_weight;
}
public function setProfileWeight(?int $profile_weight): self
{
$this->profile_weight = $profile_weight;
return $this;
}
public function getProfileGender(): ?string
{
return $this->profile_gender;
}
public function setProfileGender(?string $profile_gender): self
{
$this->profile_gender = $profile_gender;
return $this;
}
/**
* @return Collection|Booking[]
*/
public function getBookings(): Collection
{
return $this->bookings;
}
public function addBooking(Booking $booking): self
{
if (!$this->bookings->contains($booking)) {
$this->bookings[] = $booking;
$booking->setUser($this);
}
return $this;
}
public function removeBooking(Booking $booking): self
{
if ($this->bookings->contains($booking)) {
$this->bookings->removeElement($booking);
// set the owning side to null (unless already changed)
if ($booking->getUser() === $this) {
$booking->setUser(null);
}
}
return $this;
}
}

谢谢。

@Franck Gamess是对的,但你也可以去掉get。如果您编写{{ user.firstName }},trick将自动将其与您的方法getFirstName()相关联。

我不知道你为什么用snake_case写你的属性,但你可以把它改为camelCase,并通过它们的"真实"名称访问你的属性。

只需在您的小树枝模板中使用:

{{ user.getFirstName }}

它运行良好。通常,Twig在PHP层上做的事情很简单:

check if user is an array and first_name a valid element;
if not, and if user is an object, check that first_name is a valid property;
if not, and if user is an object, check that first_name is a valid method (even if first_name is the constructor - use __construct() instead);
if not, and if user is an object, check that getfirst_name is a valid method;
if not, and if user is an object, check that isfirst_name is a valid method;
if not, and if user is an object, check that hasfirst_name is a valid method;
if not, return a null value.

请参阅Twig变量。

顺便说一句,您应该遵循变量的Symfony编码标准,因为trick很难找到用snake_case编写的属性的值。

我认为您不应该在控制器中构造UserManagerInterface。此外,正如弗兰克所说,如果可以的话,使用编码标准,这将在未来节省大量时间和挫折感!

这是我在Symfony 4项目中使用的控制器:

namespace AppController;
use FOSUserBundleModelUserInterface;
use SymfonyComponentRoutingAnnotationRoute;
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentSecurityCoreExceptionAccessDeniedException;
/**
* @Route("/profile/bookings", name="profile_bookings")
*/
public function bookings()
{
$user = $this->getUser();
if (!is_object($user) || !$user instanceof UserInterface) {
throw new AccessDeniedException('This user does not have access to this section.');
}
return $this->render('profile/bookings/bookings.html.twig', array(
'user' => $user,
));
}
} 

最新更新