我正在做一个非常大的Symfony2项目(不幸的是在一个我无法修改的数据库中),我坚持这个:
我有一个User实体,其中包含(在其他字段中)用户名字段。
我还有一个ProfileField实体,它与User的额外字段相对应(比如firstname或lastname,喜欢的颜色或者你想询问用户的任何内容)。
最后有ConfigService,它基本上可以从数据库获得某个键的特定值。 在这种特殊情况下,它只是一个名为' username_format'的配置值。它可以采用3个值中的一个:'用户名','名字'或' firstnamelastname'。
根据该值,我需要显示格式正确的用户名。如果值为'用户名' - 我只是从User实体返回用户名字段值。 对于第二种和第三种情况,所以当我需要获得与该特定用户相对应的自定义ProfileField时,我已经创建了一个注入了ConfigService的简单服务(称为usernameFormatService)和一个名为getNameFromId($ userId)的方法。该方法检查配置值并为正确的用户提取正确的值。这一切都很好,但是......
我有一个博客概述页面,其中格式化的用户名显示在其他字段中(如标题,创建日期等)。 Blog实体与User实体有很多关系。从映射中我获得了当然的用户名,以及' username_format'配置值说我需要名字,例如,我在Twig模板中用usernameFormatService拉它,一切都按照它应该的方式工作。
当我需要能够按每列排序时,真正的问题就开始了,这也意味着格式化的用户名列。我使用Doctrine QueryBuilder来获取数据库结果,基本上我需要用户实体内部的格式化用户名值(我认为)能够在从数据库中提取之前按此值对博客进行排序(之前为什么?分页) )。
任何人都可以给我至少一个暗示在哪里看或怎么做?
更新
为了更清楚地说明:
现在,概要表中显示的用户名正由usernameFormatService解析,后者使用ConfigService获取' platform_username_format' config值构成数据库,并根据该配置值返回格式化的用户名。 如果要进行排序,我需要在实际查询数据库之前以某种方式获取格式化的用户名,这样我就可以获得排序结果。
答案 0 :(得分:0)
好的,如果我在这里正确地理解了一切,我会做一些如下所示的事情。
现在,不确定的是,每个用户是否都有选择如何查看数据的选项。因此,我在服务定义中硬编码username_format
,但这种行为很容易改变。
我会将您的getNameFromId
更改为getNameForUser
:
class ConfigService{
private $usernameFormat;
private $repository;
public function __construct($repository, $usernameFormat){
$this->repository = $repository;
$this->usernameFormat = $usernameFormat;
}
public function getNameForUser(User $user){
switch ($this->usernameFormat){
case "username":
return $user->getUsername();
case "firstname":
return $user->getFirstName();
case "firstnamelastname":
reteurn $user->getFirstName() . ' ' . $user->getLastname();
}
}
public function getAllUsers($page){
return $this->repository->getUsers($page, $this->usernameFormat);
}
}
<parameters>
<parameter key="my.repository.class">Your\Namespace\FooRepository</parameter>
<parameter key="config.service.class">Your\Namespace\Service\ConfigService</parameter>
</parameters>
<services>
<service id="user.repository"
class="%my.repository.class%"
factory-service="doctrine.orm.entity_manager"
factory-method="getRepository">
<argument>YourBundle:User</argument>
</service>
<service id="config.service" class="%config.service.class%">
<argument type="service" id="my.repository.class" />
<argument type="string">username</argument>
</service>
</services>
public UserRepository extends EntityRepository{
public function getUsers($page, $usernameFormat){
$qb = $this->createQueryBuilder('u');
/**
* Rest of quering rules go here: WHERE predicate, ORDERing, pagination
*/
return $qb->getQuery()->getResult();
}
}
希望这有点帮助...