2016-01-14 31 views
5

SoruPHP Tipi Hinting Uygulama - Depo Desen

bir maket/depo desen kullanarak PhpStorm içindeki satır kod tamamlama almak mümkün mü?

My Kur

Ben laravel kullanarak ve bir Laracasts videoda anlatıldığı gibi depo desen uygulamak.

Kod İşte

modelleri laravel içeride nasıl çalıştığını temel bir örnektir ve modeli niteliklerini kodu tamamlanması için almak imkansız görünüyor nasıl.

Bu kod çalışır ve bununla birlikte nitelik $ name ima tipi değildir ve kod tamamlandı PhpStorm içeride olmayacak 'Billy' olması gerektiği gibi dışarı yazdırır. Tür ipucu, çocuktan ziyade ana özellik tanımı türüne öncelik verir, bu bana garip geliyor.

<?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; 

aslında kod tamamlama olsun sadece An Çirkin Fix

yeni php doc bloğu ile çocuk işlevini yeniden tanımlamak için gibi görünüyor:

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); 
    } 
} 

Ancak yüzlerce modelim, depolarım ve depo işlevlerim var. Her bir uygulamanın içindeki tüm fonksiyonları yeniden yazmak büyük bir iş olacaktır.

PhpStorm'un, yöntemi yeniden bildirmek zorunda kalmadan, ebeveyn tiplerinden ziyade çocuğun ipucu bildirimini kullanması için bir yol var mı?

+0

Sınıf için PHPDoc'ta '@ method' deneyin. – LazyOne

+0

@LazyOne - UserRepository belgesine @@method User find ($ id) 'eklediğimde işe yarar. Ancak yine de her depo için ve bir model döndüren her işlev için bunu yapmam gerektiği anlamına gelir. – magnito

+0

'¯ \\ _ (ツ) _/¯' 1) en azından bunu yeniden beyan etmeyin 2) Başka yolu bilmiyorum 3) belki Laravel destek eklentisi bunu yapabilir (eğer henüz kurmadıysanız)) – LazyOne

cevap

2

Özgün olarak bu soruyu gönderdiğim bağlamda model ve depolarla doğru türde ipucu elde etmek için bir çözüm bulamadım. ayrıca depo ve ben daha spesifik ve ayrıntılı depo fonksiyonlarını kullanabilmek için sonuç geldi mvc php kalıplarının okuduktan sonra

Çözüm Uzlaşılmış


.


Örneğin

, ben depo baz fonksiyonlarını böyle benim kontrolörleri/mantık sınıflar içindeki kullanıyordum Yanlış Yol:

$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 
      } 
     ); 

Doğru

Şimdi belirli depoları içindeki tüm ihtiyaçları için ayrı bir veritabanı mantığı fonksiyonları kod, yani benim çekirdek sınıfları/kontrolörleri bu benzeyen sonunda:

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

tüm veritabanı mantığı taşınır Bu şekilde Belirli bir depo ve ben geri döndü modelleri ipucu yazabilirsiniz. Bu metodoloji ayrıca, daha kolay okunabilir kodla sonuçlanır ve çekirdek mantığınızı Eloquent'dan ayırır.

0

Bir yöntemin uygulanmasını boşaltması için soyut anahtar sözcüğünü kullanabilirsiniz. Bu işlevi gerçekleştirmek için bir nesne olarak uzanan Model zorlar

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

.

Umarım bu mantıklıdır.