2014-05-19 5 views
5

मैं सिम्फनी 2 का उपयोग करके एक सास/बहुआयामी अनुप्रयोग बना रहा हूं। मैंने एक पंक्ति के मालिक को जोड़ने और अपडेट करने के लिए एक सिद्धांत ईवेंट-ग्राहक बनाया है, जो उपयोगकर्ता ने बनाया है यह, उपयोगकर्ता जिसने इसे संशोधित किया, टाइमस्टैम्प और इतने सारे।Symfony2 - वर्तमान उपयोगकर्ता डेटा का चयन करने के लिए एक डॉक्टर फ़िल्टर बनाएं

और अब मुझे किसी प्रकार का फ़िल्टर लागू करने की आवश्यकता है ताकि जब कोई उपयोगकर्ता लॉग इन हो, तो वह केवल अपनी कंपनी से डेटा देख सकता है। मेरा पहला हालांकि एक डॉक्टर प्रीलोड संदेश का उपयोग कर रहा था, लेकिन यह घटना मौजूद नहीं है ... जहां तक ​​मुझे पता है, मुझे डॉक्टरेट फ़िल्टर का उपयोग करना चाहिए, है ना? यदि हां, तो यह फ़िल्टर कंपनी आईडी को पढ़ने के लिए उपयोगकर्ता डेटा को कैसे एक्सेस कर सकता है? क्या मुझे निर्भरता इंजेक्शन का उपयोग करके इंजेक्ट करना चाहिए? क्या मेरा लक्ष्य पूरा करने का कोई मानक तरीका है?

अद्यतन क्या मैं के लिए देख रहा हूँ तो हर मैं किसी भी समारोह है कि डेटाबेस (मिल जाए, findOneBy, आदि) से डेटा लाने फोन सिद्धांत प्लगइन/हुक किसी तरह का बनाने के लिए है, और इकाई मैं एक विशेष इंटरफ़ेस लागू करने वाला एक अतिरिक्त 'और company_id =: id' SQL अनुक्रम जेनरेट क्वेरी में जोड़ा जाता है, इसलिए न तो नियंत्रक या मॉडल को अन्य कंपनियों से डेटा प्राप्त होता है।

+0

शायद यह उत्तर आपकी मदद कर सकता है: http://stackoverflow.com/a/15809800/3059764 – ferodss

उत्तर

3

इसके लिए आपको सरकारी दस्तावेज़ 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'); 
    } 
} 

से एक DoctrineFilter लिंक का उपयोग कर सकते और पैरामीटर फिल्टर में इस्तेमाल किया 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
0

Doctrine2 में फ़िल्टरिंग सरल है। बस एक चर को एक फ़िल्टर फ़ंक्शन असाइन करें, फिर उस चर को पैरा() विधि के माध्यम से पैरामीटर के रूप में भेजें जो ArrayCollection क्लास में शामिल है।

$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 कमांड को बदल देता है यह सर्वर पर (एक सरल 'और company_id =: id' जोड़ें), और इस फ़िल्टर को symfony से लिंक करें, इसलिए प्रत्येक अनुरोध पर फ़िल्टर वर्तमान लॉग उपयोगकर्ता company_id का उपयोग करता है ... – mHouses

+0

ओह मैं देखता हूं। वास्तव में हम विभिन्न चीजों के बारे में बात कर रहे हैं! मैं जवाब दे रहा था कि सभी पंक्तियों को प्राप्त करने के बाद फ़िल्टर कैसे करें। – iamdev

+0

@iamadev: यह वही है जो मैं बचाना चाहता हूं, सभी पंक्तियों को प्राप्त करने और फिर उन्हें फ़िल्टर करना। मैं उन्हें डेटाबेस इंजन में फ़िल्टर करना चाहता हूं, PHP में नहीं। – mHouses

संबंधित मुद्दे