2016-01-14 8 views
5

प्रश्नपीएचपी प्रकार इशारा कार्यान्वयन - भंडार पैटर्न

यह एक मॉडल/भंडार पद्धति का उपयोग कर PhpStorm अंदर पंक्ति कोड पूर्णता प्राप्त करने के लिए संभव है?

मेरे सेटअप

मैं Laravel का उपयोग कर रहा है और एक Laracasts वीडियो में वर्णित के रूप भंडार पैटर्न को लागू करने।

कोड

यहाँ कैसे मॉडल Laravel अंदर काम की एक बुनियादी उदाहरण है और कैसे यह मॉडल विशेषताओं के लिए कोड पूर्णता प्राप्त करने के लिए असंभव लगता है।

यह कोड 'बिली' के रूप में काम करता है और प्रिंट करता है, हालांकि विशेषता $ नाम का संकेत नहीं दिया गया है और phpStorm के अंदर कोड-पूर्ण नहीं होगा। प्रकार संकेत संकेत बच्चे के बजाय मूल विशेषता परिभाषा प्रकार को प्राथमिकता दे रहा है, जो मेरे लिए अजीब लगता है।

<?php 

// Models 
abstract class Model { 
    public $sqlTableName; 

    public function findFromDatabase($id) 
    { 
     $model = new $this; 

     // This would be grabbed using table name and $id 
     $fakeDatabaseRow = ['name' => 'billy', 'job' => 'engineer']; 

     foreach ($fakeDatabaseRow as $column => $value) { 
      $model->$column = $value; 
     } 

     return $model; 
    } 
} 

class User extends Model { 
    public $name; 
    public $job; 

    public $sqlTableName = 'users'; 
} 

// Repositories 
abstract class RepositoryBase { 
    /** 
    * @var Model 
    */ 
    public $model; 

    public function find($id) 
    { 
     $this->model = $this->model->findFromDatabase(1); 

     return $this->model; 
    } 
} 

class UserRepository extends RepositoryBase { 
    /** 
    * @var User 
    */ 
    public $model; 

    public function __construct(User $model) 
    { 
     $this->model = $model; 
    } 
} 

// Run 
$model = new User(); 

$userRepository = new UserRepository($model); 

echo $userRepository->find(1)->name; 

एक बदसूरत फिक्स

केवल करने के लिए वास्तव में कोड पूर्णता प्राप्त एक नया php दस्तावेज़ ब्लॉक के साथ बच्चे समारोह को फिर से परिभाषित करने के लिए हो रहा है:

class UserRepository extends RepositoryBase { 
    /** 
    * @var User 
    */ 
    public $model; 

    public function __construct(User $model) 
    { 
     $this->model = $model; 
    } 

    // I need to replace this function for every different repository 
    // even though they are all the same 
    /** 
    * @param $id 
    * @return User 
    */ 
    public function find($id) 
    { 
     return parent::find($id); 
    } 
} 

हालांकि मेरे पास सैकड़ों मॉडल, भंडार, और भंडार कार्य हैं। प्रत्येक कार्यान्वयन के अंदर सभी कार्यों को फिर से लिखना एक बड़ा काम होगा।

क्या phpStorm को विधि के पुन: घोषित किए बिना माता-पिता के बजाय बच्चे के प्रकार संकेत देने के लिए उपयोग करने का कोई तरीका है?

+0

कक्षा के लिए PHPDoc में '@ method' आज़माएं। – LazyOne

+0

@LazyOne - यदि मैं UserRepository docblock पर '@method उपयोगकर्ता ढूंढ ($ id) 'जोड़ता हूं तो यह काम करता है। हालांकि इसका अभी भी मतलब है कि मुझे प्रत्येक रिपोजिटरी के लिए और प्रत्येक फ़ंक्शन के लिए ऐसा करने की आवश्यकता होगी जो मॉडल लौटाए। – magnito

+0

'¯ \\ _ (ツ) _/¯' 1) कम से कम आप इसे फिर से घोषित नहीं करते हैं 2) मुझे कोई अन्य तरीका नहीं पता 3) शायद लैरवेल समर्थन प्लगइन यह कर सकता है (यदि आपने अभी तक इसे इंस्टॉल नहीं किया है) – LazyOne

उत्तर

2

मैं इस प्रश्न को मूल रूप से पोस्ट किए गए संदर्भ में मॉडल और भंडारों के साथ उचित प्रकार संकेत देने का समाधान खोजने में असमर्थ था।


छेड़छाड़ की गई समाधान

आगे भंडार और MVC php पैटर्न मैं और अधिक विशिष्ट और विस्तृत भंडार कार्यों का उपयोग करने के लिए निष्कर्ष पर पहुंचा की पढ़ाई करने के बाद।


गलत रास्ता

उदाहरण के लिए, मैं भंडार आधार कार्य इस तरह मेरी नियंत्रकों/तर्क वर्गों के अंदर उपयोग कर रहा था:

$users = 
    $userRepository->where('created_at', '<', '2016-01-18 19:21:20')->where(
      'permission_level', 
      'admin' 
     )->orderBy('created_at')->get('id'); 

$posts = 
    $postRepository->where('posted_on', '<', '2016-01-18 19:21:20') 
     ->where('content', '!=', 'null') 
     ->chunk(
      function ($posts) { 
       // do things 
      } 
     ); 

सही रास्ता

अब मैं अपने सभी जरूरतों को विशिष्ट खजाने अंदर के लिए अलग डाटाबेस तर्क कार्यों कोड, इसलिए मेरे कोर कक्षाएं/नियंत्रक अंत इस तरह लग रही:

$users = $userRepository->getAdminIdsCreatedBeforeDate('2016-01-18 19:21:20'); 
$posts = $postRepository->chunkFilledPostsBeforeDate('2016-01-18 19:21:20', function() {}); 

इस तरह सभी डेटाबेस तर्क में ले जाया जाता विशिष्ट भंडार और मैं इसे वापस लौटा मॉडल संकेत कर सकते हैं। इस पद्धति के परिणामस्वरूप क्लीनर को कोड पढ़ने में आसान होता है और आगे आपके मूल तर्क को इलोकेंट से अलग करता है।

0

आप एक विधि के कार्यान्वयन को ऑफ़लोड करने के लिए अमूर्त कीवर्ड का उपयोग कर सकते हैं।

abstract class Model { 
    abstract public function find($id); 
} 

जो किसी भी वस्तु का विस्तार मॉडल मजबूर करता है कि समारोह को लागू करने।

मुझे उम्मीद है कि यह समझ में आता है।

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