我正在使用选民来检查用户是否具有对实体执行特定操作的正确权限.
CRUD操作很容易检查.但是,如何检查结果集或概述的权限.概述使用PagerFanta分页来对结果进行分页.由于性能问题,无法预先检查结果.仅检查已经分页返回的结果可能导致空页或半空页.
我正在考虑在我的存储库中进行相同的验证,以便它们只返回允许用户查看的结果.但这会产生代码重复,因为现在重复相同的验证,一次是在投票者中,一次是在存储库中.
是否有更好的解决方案,或者不是选民最好的解决方案?
我已经读过,Pagerfanta是Symfony2的首选分页插件,但我在使其正常工作时遇到了一些麻烦.我已经下载了pagerfanta和PagerfantaBundle的代码,并按照WhiteOctober Github自述文件和本教程中的描述安装它们.我很确定我的控制器中的代码是可以的,但我的模板文件有问题.
我的控制器代码:
public function indexAction($page = null)
{
...
$query = $em->createQuery('SELECT something FROM some_table');
$adapter = new DoctrineORMAdapter($query);
$pager = new Pagerfanta($adapter);
$pager->setMaxPerPage(10);
if (!$page) $page = 1;
try {
$pager->setCurrentPage($page);
}
catch(NotValidCurrentPageException $e) {
throw new NotFoundHttpException('Illegal page');
}
return $this->render('MyBundle:MyEntity:index.html.twig', array(
'pager' => $pager,
));
}
Run Code Online (Sandbox Code Playgroud)
在我的模板中:
...
<table>
{% for object in pager.currentPageResults %}
<tr>
<td>{{ object.attribute1 }}</td>
<td>{{ object.attribute2 }}</td>
<td>{{ object.attribute3 }}</td>
</tr>
{% endfor %}
</table>
{% if …Run Code Online (Sandbox Code Playgroud) 我正在使用Pagerfanta和Doctrine Adapters与Symfony2和Silex.随着我的数据库变得越来越大,我发现管理员统计信息页面上的大量负载会显示带有分页的大数据.我检查了分析器,看到了令人难以置信的低效查询:
SELECT DISTINCT id16
FROM (
SELECT f0_.username AS username0, ..., f0_.added_on AS added_on20
FROM fos_user f0_ ORDER BY f0_.id DESC
) dctrn_result
LIMIT 50 OFFSET 0;
SELECT COUNT(*) AS dctrn_count
FROM (
SELECT f0_.username AS username0, ..., f0_.added_on AS added_on20
FROM fos_user f0_ ORDER BY f0_.id DESC
) dctrn_result
LIMIT 50 OFFSET 0;`
Run Code Online (Sandbox Code Playgroud)
通过创建DoctrineORMAdapter类的固定版本,可以轻松修复第一个查询.生成COUNT()查询的代码更复杂,所以我决定询问是否有任何解决方案.
那么有没有办法让Pagerfanta不运行嵌套查询?
我正在使用Pagerfanta捆绑包与Symfony 3.3.4和Bootstrap 3;
"php": ">=5.5.9",
"components/jquery": "^3.2",
"doctrine/doctrine-bundle": "^1.6",
"doctrine/orm": "^2.5",
"incenteev/composer-parameter-handler": "^2.0",
"kriswallsmith/assetic": "^1.4",
"oyejorge/less.php": "v1.7.0.14",
"sensio/distribution-bundle": "^5.0.19",
"sensio/framework-extra-bundle": "^3.0.2",
"symfony/assetic-bundle": "^2.8",
"symfony/monolog-bundle": "^3.1.0",
"symfony/polyfill-apcu": "^1.0",
"symfony/swiftmailer-bundle": "^2.3.10",
"symfony/symfony": "3.3.*",
"twig/twig": "^1.0||^2.0",
"twitter/bootstrap": "^3.3",
"white-october/pagerfanta-bundle": "^1.0"
Run Code Online (Sandbox Code Playgroud)
然后我在AppBundle中有一个扩展base.html.twig的模板:
{% extends 'base.html.twig' %}
{% block body %}
<nav class="navbar navbar-inverse navbar-fixed-top">
Run Code Online (Sandbox Code Playgroud)
...
{% block content %}{% endblock %}
{% endblock %}
Run Code Online (Sandbox Code Playgroud)
而这又是由页面模板扩展的:
{% extends '@AppBundle/index.html.twig' %}
{% block submenu %}
<a href="{{ path('site_new') }}" class="btn btn-success"><i class="fa fa-plus"></i> Create</a>
{% endblock …Run Code Online (Sandbox Code Playgroud) 我有Pagerfanta安装和工作,但我很难定制布局.我在Github上读到我需要通过my_template,但是我不确定应该在哪里配置以及具体指的是什么.
自定义模板
如果要使用自定义模板,请添加另一个参数
<div class="pagerfanta">
{{ pagerfanta(my_pager, 'my_template') }}
</div>
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想拥有自己可以修改的Twig模板,但我不知道Pagerfanta是否支持此模板.这一切都是用PHP完成的吗?
虽然我知道这是微不足道的,但是我试图使用DoctrineORMAdapter来实现pagerfanta Paginator,我想按降序对所有按id排序的实体进行分页,我想要的最终SQL是这样的:
SELECT id, name FROM User ORDER BY id DESC LIMIT 0, 5;
Run Code Online (Sandbox Code Playgroud)
假设我有从A到Z的用户,并且我想将它们限制为每页5个,DoctrineORMAdapter分页的结果是在第一页中列出的用户E到A,而我实际上期望在用户V中看到用户Z第一页,U到Q在第二页,依此类推.我传递给DoctrineORMAdapter的DQL如下:
SELECT u FROM My\FluffyBundle\Entity\User u ORDER BY u.id DESC
Run Code Online (Sandbox Code Playgroud)
在执行时,这是第一页的最终DQL:
SELECT DISTINCT id0 FROM (SELECT u0_.id AS id0, u0_.name AS name1 FROM User u0_
ORDER BY u0_.id DESC) dctrn_result LIMIT 5 OFFSET 0
Run Code Online (Sandbox Code Playgroud)
请注意,当使用ArrayAdapter而不是DoctrineORM时,它可以按预期工作,但是当你有数千个复杂的Doctrine实体时,依赖ArrayAdapter并不是一个好主意,即使有额外的延迟加载也是如此:D.
这是唯一相关的代码:
$queryBuilder = $repo->createQueryBuilder('u')->orderBy('u.id', 'DESC');
$adapter = new DoctrineORMAdapter($queryBuilder);
$pager = new Pagerfanta($adapter);
$pager->setMaxPerPage(5);
Run Code Online (Sandbox Code Playgroud)
谢谢.