ज़ेन फ्रेमवर्क 1 में मेरे पास कई मैपर थे जो एक सेटडबटेबल को विरासत में मिला और माता-पिता मैपर वर्ग से getDbTable प्राप्त किया।zf2: मैपर में सेवा प्रबंधक कैसे प्राप्त करें
अब ZF2 एक चेहरा समस्या यह है कि मैं एक मॉडल में सेवा प्रबंधक की जरूरत है और मैं इसे कैसे प्राप्त करने के लिए के रूप में एक सुराग नहीं है में:
class Mapper
{
protected $tableGateway;
protected $module = 'application';
public function setTableGateway($table)
{
if (is_string($table)) {
$class = $this->module . '\Model\DbTable\\' . ucfirst($table);
$sm = $this->getServiceLocator(); <= Fatal error: Call to undefined method Mapper::getServiceLocator()
$tableGateway = (class_exists($class)) ? $sm->get($class) : $sm->get(new TableGateway($table));
} else {
$tableGateway = $table;
}
if (!$tableGateway instanceof Zend\Db\TableGateway\AbstractTableGateway) {
throw new \Exception('Invalid table data gateway provided');
}
$this->tableGateway = $tableGateway;
return $this;
}
// more code
लाइन:
$sm = $this->getServiceLocator();
एक घातक त्रुटि देता है:
Call to undefined method Application\Model\Mapper\Doc::getServiceLocator()
मैं अपने मॉडल में सेवा प्रबंधक कैसे प्राप्त करूं? या मैं चीजों को ZF2 तरीके से नहीं कर रहा हूं? मुझे पता है कि मेरे नियंत्रक में सेवा प्रबंधक कैसे प्राप्त करें और टेबल गेटवे को मैपर पर पास करें, लेकिन ऐसा लगता है कि मुझे कोड के बहुत सारे नकल की तरह लगता है।
आम तौर पर आपके मॉडल में सेवा प्रबंधकों को इंजेक्ट करना बहुत बुरा विचार है। इंजेक्शन के लिए सेवा कंटेनर पर भरोसा करने के बजाय अपनी कक्षा में निर्भरता को इंजेक्ट करने का प्रयास करें। यह "निर्भरता इंजेक्शन" बनाम "सेवा कंटेनर" चर्चा है और इस मामले में से कुछ को पढ़ना और समझना अच्छा होगा कि वे इस प्रकार के इंजेक्शन को अक्सर एंटी-पैटर्न क्यों कहते हैं। –
@ जूरियन स्लूइमन: मेरे लिए मुश्किल चर्चा क्योंकि मैंने हाल ही में निर्भरता इंजेक्शन के बारे में सीखा, लेकिन मुझे लगता है कि मुझे मूल विचार मिलता है। एंडी के उत्तर के बारे में क्या जवाब है (जिसे मैंने स्वीकार किया क्योंकि यह काम करता है)? क्या यह आपकी राय में एक विरोधी पैटर्न भी होगा? – tihe
आप इस आलेख के साथ एक अच्छा पढ़ सकते हैं: http://blog.ircmaxell.com/2012/08/object-scoping-triste-against-service.html (मेरे लिए, एंथनी फेरारा एक बहुत ही सम्मानित डेवलपर है)। यह वास्तव में काला/सफ़ेद नहीं है, लेकिन इसी मामले के बारे में SO पर एक समान प्रश्न पूछा गया है: http://stackoverflow.com/questions/9011787/why-the-service-locator-is-a-anti-pattern -इन-द-अंडर-उदाहरण –