2016-09-01 8 views
3

私は、クラスは次のように呼び出すためのシステムを実装する必要があります。いくつかの新しい動作を実装する必要がある場合は、新しく作成されたMaterialCalendar.phpのCalendar.phpからすべてのメソッドを使用できるように、Calendar.phpクラスを拡張するクラスMaterialCalendar.phpを実装したいと思います必要に応じて親メソッドをオーバーライドします。Laravel動的クラスの使用

問題はビューまたはコントローラでは、コードの任意の場所で使用行動のこの種を実装する方法です:

場合(子クラスが存在する){使用の子クラス}他{使用のデフォルトの親クラス}

上記の擬似コードの動作は動的である必要があります。したがって、MaterialCalendar.phpが存在しない場合は、デフォルトでCalendar.phpを使用する必要があります。この例で使用されるクラス名とは無関係に、動的である必要があります。

+0

これらのクラスまたは静的クラスを実装するオブジェクトがありますか? –

+0

@MaciejSikoraはありません、彼らは静的ではありません – user6784929

+0

あなたがhttp://php.net/manual/en/internals2.opcodes.instanceof.php –

答えて

1

あなたのコードはてICalendarのいずれかの実装で動作することを保証するためのインタフェースを定義します。

interface ICalendar { 
    public function method1(); 
    public function method2(); 
} 

は実装を作成します。

class Calendar implements ICalendar { 
    public function method1() {} 
    public function method2() {} 

} 

class MaterialCalendar extends Calendar { 
    public function method1() {} 
    public function method2() {} 
} 

シンプルなコンテナどこかで、あなたがしなければならないブートストラップで

class SimpleContainer { 
    private static $binds = []; 

    public static function bind($interface, $class) { 
     self::$binds[$interface] = $class; 
    } 

    public static function make($interface) { 
     if (array_key_exists($interface, self::$binds)) { 
      return new self::$binds[$interface]; 
     } 

     throw new \Exception("Interface is not binded"); 
    } 
} 

をインターフェイスにバインドするクラスを特定する:

SimpleContainer::bind(ICalendar::class, MaterialCalendar::class); 

カレンダーオブジェクトを取得する必要があるすべての場所で次のコードを使用します。

SimpleContainer::make(ICalendar::class); 
+0

デザインパターンと全体のコンセプトの偉大な使用が、容器用Laravelのサービスコンテナは、はるかに柔軟です。 – samrap

+1

@samrapそうです。私はLaravelが使用されているか、後で更新されたかもしれないという点を忘れていました。私の解決策はアイデアを説明することだけですが、Laravelが関係する実際のアプリでは、Laravel標準コンポーネントをコンテナの1つに使用することをお勧めします。 –

0

アンドレイは良いスタートを切ったが、この目的のための容器を設計する必要はありません。 Laravelには、実装をインターフェイスにバインドできるcontainer以上の機能が搭載されています。 、それを当然のことながら

$this->app->bind('App\Contracts\ICalendar', 'App\Models\MaterialCalendar'); 

(プロバイダのregisterメソッドの中で):アンドレイのインターフェイスと具象クラスを使用して

は、あなたがICalendarインターフェイスにしたいクラスをバインドするservice providerを作成することができますインターフェイスにバインドするクラスを条件付きで決定することになります(関数class_existsを参照)。

この時点から、Laravelのコンテナを使用して、必要に応じてこの依存関係を注入することができます。例えば、CalendarControllerstore方法では、あなたは単にtype hintインターフェースとLaravelは自動的にあなたがそれにバインドされた具象クラスのインスタンスを与えることができます:

use App\Contracts\ICalendar; 

class CalendarController extends Controller 
{ 
    ... 

    public function store(Request $request, ICalendar $calendar) 
    { 
     // Code... 
    } 
} 

私は間違いなく、ドキュメントを読んでお勧めしますまた、providersと同様に、containerに記載されている。あなたに関心のあるものは、あなたが条件付きインターフェースに実装を結合することができるでContextual Bindingかもしれません。

関連する問題