2014-05-19 66 views
5

我建設使用的Symfony 2.我已經創建了一個學說事件訂戶添加和更新行的老闆,誰創造了用戶的Saas /多租戶應用程序它,修改它的用戶,時間戳等等。Symfony2中 - 創建主義過濾器來選擇當前用戶數據

現在我需要實施某種形式的過濾器,這樣當用戶登錄時,他只能從他的公司看到的數據。我的第一個雖然是使用Doctrine preLoad事件,但這個事件不存在......據我所知,我必須使用Doctrine過濾器,不是嗎?如果是這樣,該過濾器如何訪問用戶數據來讀取公司ID?我必須使用依賴注入來注入嗎?有沒有什麼標準的方法來完成我的目標?

UPDATE 什麼我要找的是創造某種學說插件/鉤所以每次我把從數據庫中(找到,findOneBy等)獲取數據的功能,我的實體抓取實現了特定的接口,額外的'AND company_id =:id'SQL序列被添加到生成的查詢中,因此控制器或模型都不會從其他公司獲取數據。

+0

也許這個回答可以幫助你:http://stackoverflow.com/a/15809800/3059764 – ferodss

回答

3

爲此,您可以使用DoctrineFilter 鏈接從官方文檔Doctrine2 SQL Filters

namespace Rwmt\Bundle\RwmtBundle\DoctrineFilters; 

use Doctrine\ORM\Mapping\ClassMetaData, 
    Doctrine\ORM\Query\Filter\SQLFilter; 

class MultiTenantFilter extends SQLFilter 
{ 
    public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias) 
    { 
     // Check if the entity implements the MultiTenant interface 
     if (!$targetEntity->reflClass->implementsInterface('Rwmt\Bundle\RwmtBundle\Entity\MultiTenant')) { 
      return ""; 
     } 

     return $targetTableAlias.'.tenant_id = ' . $this->getParameter('tenantId'); 
    } 
} 

並設置在過濾器中使用的參數tenantId您必須啓用過濾器並設置參數

$filter = $em->getFilters()->enable('multi_tenant'); 
$filter->setParameter('tenantId', $tenant->getId(), 'integer'); 

至於多租戶接口只是後話了實體實施

namespace Rwmt\Bundle\RwmtBundle\Entity; 
use Rwmt\Bundle\RwmtBundle\Entity\Tenant; 

interface MultiTenant 
{ 
    public function setTenant(Tenant $tenant); 
    public function getTenant(); 
} 
0

過濾在Doctrine2很簡單。只需將一個過濾函數分配給一個變量,然後通過ArrayCollection類中包含的filter()方法將該變量作爲參數發送。

$closure = function($list_item) use($user) {         
     return $list_item->belongsToSameCompanyThatEmploys($user) === true; 
};               
$filtered_array_collection = $arrayYouWantToFilter->filter($closure); 

在這個例子中,你必須在LIST_ITEM的課,如果它屬於同一家公司的用戶適用於返回true先前定義的方法belongsToSameCompanyThatEmploys($user)

UPDATE您還需要指出的過濾功能應該使用局部變量的用戶,因爲它不會否​​則由於具有其自身的範圍。

+0

我不知道,如果我們談論的一樣...我需要一個過濾器,在發送之前改變SQL命令它添加到服務器(添加一個簡單的'AND company_id =:id'),並將此過濾器與symfony鏈接起來,因此在每個請求過濾器都使用當前記錄的用戶company_id ... – mHouses

+0

哦,我明白了。的確,我們正在談論不同的事情!我在接收所有行後正在回答如何過濾。 – iamdev

+0

@iamadev:這正是我想要避免的,接收所有行並過濾它們。我希望它們在數據庫引擎中被過濾,而不是在PHP中。 – mHouses

相關問題