有没有人有一个很好的方法来对Symfony2中的实体验证约束进行单元测试?
理想情况下,我希望能够在单元测试中访问依赖注入容器,这样我就可以访问验证器服务.一旦我有验证器服务,我就可以手动运行它:
$errors = $validator->validate($entity);
Run Code Online (Sandbox Code Playgroud)
我可以扩展WebTestCase然后client根据文档创建一个到达容器然而它感觉不对.该WebTestCase和client在文档读取为更多的设备来测试的行为作为一个整体,因此感觉破碎用它来单元测试的实体.
那么,有没有人知道如何a)获取容器或b)在单元测试中创建验证器?
我想知道是否有人知道使用Symfony2 ACL系统实现这一目标的优雅方式.
我有一个Comment实体(我的域对象)需要可以编辑,ROLE_USER但这只能在发布评论的5分钟内允许 - 否则评论只能通过编辑ROLE_ADMIN.
使它只能编辑ROLE_USER并且ROLE_ADMIN很简单,只需RoleSecurityIdentity为每个编辑.
现在,当我想要合并时间因素时,我的问题就出现了ROLE_USER.我的第一个问题是它需要来自域对象的信息,而不仅仅是ACL表,但我认为这可以通过创建一个自定义ObjectIdentity类来解决,该类也可以保存发布的时间Comment.
现在是困难的部分
我想我需要创建一个PermissionGrantingStrategy知道也可以查看创建时间的自定义.Comment在检查类型时必须加载它,但我不知道如何加载它.有谁知道是否有某种工厂可以配置这种东西?因此,如果一个实体具有PermissionGrantingStrategy与之关联的特定实体,那么它将被使用,否则使用默认值?
我知道这有点长,非常感谢如果有人知道如何实现这一点,因为ACL文档目前似乎有点稀疏.我的后备解决方案是简单地提供某种服务来检查是否可以编辑注释,而不是根本不打扰ACL.
我有一个类Foo,它是一个自引用树状结构(最低限度):
class Foo {
public:
// Gets this child's position relative to it's parent.
int getPosition() const {
return parent->indexOf(this);
}
int indexOf(const Foo *const child) const {
return children.indexOf(child); // this line causes an error.
}
private:
Foo *parent;
QList<Foo *> children;
}
Run Code Online (Sandbox Code Playgroud)
该行return children.indexOf(child)期望const T &value按照QList文档传递,这解决Foo *const &value了我的方案.
为了让我的getPosition()方法调用我自己的indexOf()方法,需要const Foo *child至少具有一个签名,以便this从const方法传递.(因为这是const Foo *const).
我的代码不会编译,因为const Foo *const child …
在Symfony2的config.yml中,您可以添加"导入",例如:
imports:
- { resource: services.yml }
Run Code Online (Sandbox Code Playgroud)
在我的services.yml里面,我有:
imports:
security_bundle:
resource: @AcmeSecurityBundle/Resources/config/services.yml
Run Code Online (Sandbox Code Playgroud)
然而,为bundle声明服务的替代方法是使用a,DependencyInjection Extension从而消除了手动将任何内容导入config.yml的需要,从而解耦代码.
namespace Acme\Bundle\SecurityBundle\DependencyInjection;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\Config\FileLocator;
class AcmeSecurityExtension extends Extension {
public function load(array $configs, ContainerBuilder $container) {
$loader = new YamlFileLoader(
$container, new FileLocator(__DIR__ . '/../Resources/config')
);
$loader->load('services.yml');
}
}
Run Code Online (Sandbox Code Playgroud)
问题
这适用于服务声明,但是比如你想要一个包来配置另一个包,比如添加LiipImagineBundle(就像AvalancheImagineBundle)过滤器:
liip_imagine:
filter_sets:
security_avatar_thumbnail:
quality: 75
filters:
thumbnail: { size: [140, 140], mode: inset }
Run Code Online (Sandbox Code Playgroud)
然后Symfony抱怨说
没有可以加载"liip_imagine"配置的扩展程序
那么有谁知道是否有办法从另一个包中添加第三方包的配置而不触及config.yml?
在我的存储库类中,我使用:
public function getItemsByTag($tag)
{
$qb = $this->createQueryBuilder('c')
->select('c')
->where('c.tags LIKE %bipolar%')
->addOrderBy('c.id');
return $qb->getQuery()
->getResult();
}
Run Code Online (Sandbox Code Playgroud)
但不幸的是,这不起作用..有谁知道这是如何工作的?或者我是否必须在没有QueryBuilder的情况下构建自定义查询?
谢谢!