पूरी तरह से ईमानदारी से कहूं तो मुझे यकीन है कि नहीं कर रहा हूँ अगर यह एक प्रश्न के लिए सबसे अच्छी जगह है इसके जैसा। शायद codereview एक बेहतर फिट है। सभी चीजें एक तरफ, आईएमओ, आप दोनों में से कोई भी सुझाव नहीं देता है "सर्वोत्तम दृष्टिकोण"। लेकिन हमेशा के रूप में, यह एक निजी बात हो सकती है।
मेरे विचार में, ओओपी के बारे में जाने का सबसे अच्छा तरीका है, अपने सभी डेटा को ASAP ऑब्जेक्ट्स में धक्का देना, और एक सेवा परत को कार्यान्वित करना जो संचालन की देखभाल करता है जिसके लिए कई प्रश्नों की आवश्यकता होती है, या कई ऑब्जेक्ट्स।
यदि मुझे लगता है कि आप एक एमवीसी-आईएसएच पैटर्न का उपयोग कर रहे हैं, तो आपके नियंत्रक को डेटा प्राप्त होता है। वहां, आप Game
ऑब्जेक्ट को तुरंत चालू करते हैं, और आईडी को 123456
पर सेट करते हैं। आप उस उदाहरण को fillGameModel(Game $gameInstance)
नामक सेवा विधि में पास कर सकते हैं। यह विधि डीबी से जुड़ती है, और Game
ऑब्जेक्ट के सभी अन्य गुण सेट करती है और इसे वापस कर देती है। User
ऑब्जेक्ट के लिए ही चला जाता है। इन दोनों वस्तुओं को फिर किसी अन्य सेवा विधि में पास किया जा सकता है: likeGame(Game $game, User $user)
। वह विधि बाकी की देखभाल कर सकती है।
व्यक्तिगत रूप से, मैं एक कदम आगे भी जाऊंगा और मेरे डीबी एक्सेस के लिए मैपर का उपयोग करूंगा, लेकिन अब मैं इसमें नहीं जा रहा हूं। यहाँ एक सेवा का उपयोग कर एक उदाहरण है, और एक अधिक OO दृष्टिकोण:
//controller:
$user = new User();
$user->setId($_SESSION['user_id']);
$game = new Game();
$game->setId(123456);//wherever you get this from
$service = new MainService();
$service->userLikes($game,$user);
//service:
public function userLikes(Game $game, User $user)
{
$user = $this->_completeUser($user);
$game = $this->_completeGame($game);
//insert or update whatever data you need...
}
protected function _completeUser(User $user)
{
$db = $this->_getConnection();//asuming PDO, to keep things simple
$query = 'SELECT * FROM my_db.users WHERE id = ?';
$stmt = $db->prepare($query);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
foreach ($row as $field => $value)
{//this implies getters and setters in your model
$user->{'set'.ucfirst(strtolower($field))}($value);
}
return $user;
}
protected function _completeGame(Game $game)
{
$db = $this->_getConnection();
$query = 'SELECT * FROM my_db.games WHERE id = ?';
$stmt = $db->prepare($query);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
foreach ($row as $field => $value)
{//field id becomes "setId" method, field name "setName" etc...
$game->{'set'.ucfirst(strtolower($field))}($value);
}
return $game;
}
//just for show: a pseudo-overloader method, if your models all share the same
//abstract class.
protected function _completeAny(Model_Abstract $model)
{
$modelName = get_class($model);
if (method_exists($this,'_complete'.$modelName))
{
return $this->{'_complete'.$modelName}($model);
}
throw new Exception('No completion method for '.$modelName.' found');
}
फिर, resultset के माध्यम से छोरों एक सार मॉडल वर्ग कि तर्क के रूप में एक सरणी लेता है, और करने के लिए fieldnames बदल देती है में एक विधि के साथ प्रतिस्थापित किया जा सकता उनके संबंधित सेटर्स। अमूर्तता के लिए बहुत सारे कमरे, मैं कहूंगा ;-)
स्रोत
2012-09-18 07:19:34
'क्या यह गेम मॉडल में मौजूदा उपयोगकर्ता आईडी को पकड़ने के लिए एक अच्छा अभ्यास है?' नहीं 'या क्या मुझे इसे पैरामीटर के रूप में पास करना चाहिए? इसके बारे में सोचें, अभी आप सत्र में अपने सक्रिय उपयोगकर्ता की आईडी स्टोर करते हैं, तो क्या होता है यदि बाद में आप इसे कहीं और स्टोर करते हैं? सबसे महत्वपूर्ण बात यह है कि आपका फ़ंक्शन केवल वर्तमान सक्रिय उपयोगकर्ता के लिए उपयोग योग्य है, आप किसी भी अन्य उपयोगकर्ता के लिए '() 'नहीं कर सकते हैं। उपयोगकर्ता आईडी बाहरी निर्भरता है, आपके गेम मॉडल को बांधने के लिए बिल्कुल कोई कारण नहीं है, [निर्भरता इंजेक्शन] (http://en.wikipedia.org/wiki/Dependency_injection) पर पढ़ें। – yannis