作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在建立一个带有管理区域的网上商店来管理产品。在管理区域中,所有产品都是可见的,但在网上商店中,只有数据库表中标记为 active = 1
的产品是可见的。
我正在使用 Silex 并将存储库注册为服务。我如何使用相同的存储库/方法在后端/前端获取产品(并将前端限制为仅事件产品)?
我想到了以下几点:
backend = true
存储库。也许我遗漏了什么,但这样做的正确和最漂亮的方法是什么?
最佳答案
您可以创建一个学说过滤器(当启用时)会自动将 active = true
添加到任何 SQL 查询中。当通过后端访问或用户具有特定角色(或不具有特定角色,具体取决于您的用例)时,您将禁用。
Acme\ProductBundle\Doctrine\Filter\ActiveProductsFilter
namespace Acme\ProductBundle\Doctrine\Filter;
use Doctrine\ORM\Mapping\ClassMetaData,
Doctrine\ORM\Query\Filter\SQLFilter;
class ActiveProductsFilter extends SQLFilter
{
public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
{
// Check if the entity implements the LocalAware interface
if (!$targetEntity->reflClass
->implementsInterface('Acme\ProductBundle\Model\ProductInterface')) {
return "";
}
return $targetTableAlias.'.active = '.$this->em->getConnection()
->quote(true, 'boolean');
}
}
app/config/config.yml
doctrine:
orm:
entity_managers:
default:
filters:
activeproducts:
class: Acme\ProductBundle\Doctrine\Filter\ActiveProductsFilter
enabled: true
然后您可以根据您的要求(当前路由、用户角色等)使用监听器或其他东西来启用或禁用
$em->getFilters()->disable('activeproducts');
关于php - 如何使我的存储库区分后端/前端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29625551/
我是一名优秀的程序员,十分优秀!