web-dev-qa-db-ja.com

Laravelインターフェース

次のチュートリアルを使用して、インターフェースについてのアイデアを得ました。

http://vegibit.com/what-is-a-laravel-interface/

しかし、インターフェイスを配置するディレクトリを「App/Models/Interfaces」に変更したいと思っていました。そしてそうしました。しかし、今はもう動かせません。これが私のコードです:

Routes.php

App::bind('CarInterface', 'Subaru');

Route::get('subaru', function()
{
$car = App::make('CarInterface');  
$car->start();
$car->gas();
$car->brake(); 
});

モデルSubaru.php

<?php

use App\Models\Interfaces\CarInterface;

class Subaru implements CarInterface {

..etc

インターフェースCarInterface

<?php namespace App\Models\Interfaces;

interface CarInterface {
public function start();
public function gas();
public function brake();
}

これをcomposer.jsonに追加しました:

"psr-0": {
"Interfaces": "app/models/interfaces"
}

そして、これを自分のstart/global.phpファイルに追加しました:

ClassLoader::addDirectories(array(

app_path().'/models/interfaces',
16
Hardist

私の最近のlaravel 5プロジェクトでは、ロジックをリポジトリメソッドとして準備するために使用されています。したがって、現在のディレクトリ構造は次のとおりです。たとえば、「Car」があります。

したがって、最初に、libsディレクトリの下にappというディレクトリを作成し、composer.jsonにロードします。

"autoload": {
        "classmap": [
            "database",
            "app/libs" //this is the new changes (remove this comment)
        ]
    }

その後、Carという名前のサブフォルダーを作成します。 Carフォルダーの下に、雄弁な実装用の2つのファイル「CarEloquent.php」とインターフェースとしてのCarInterface.phpを作成します。

CarInterface

namespace App\libs\Car;
interface CarInterface {
    public function getAll();
    public function create(array $data);
    public function delete($id);
    public function getByID($id);
    public function update($id,array $data);
}

CarEloquent

namespace App\lib\Car;

use App\lib\Car\CarInterface;
use App\Car; //car model
class CarEloquent implements CarInterface {
    protected $car;

    function __construct(Car $a) {
        $this->car = $a;
    }
    public function getAll(){
        return $this->car->all();
    }
}

次に、Car Service Providerを作成して、IOCコントローラーをバインドします。車サービスプロバイダーを作成するには、laravelによるphp artisanコマンドを使用することもできます。 php artisan make:provider CarServiceProvider

ServiceProvider

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class CarServiceProvider extends ServiceProvider {
   public function register() {
        $this->app->bind('App\lib\Car\CarInterface', 'App\lib\Car\CarEloquent');
    }

}

そして最後のステップは、これらのサービスプロバイダーをconfig/app.phpプロバイダー配列に追加することです。

'providers' => [
  'App\Providers\CatServiceProvider',
]

最後に、コントローラでリポジトリメソッドを使用する準備が整いました。

コントローラーの例

namespace App\Http\Controllers;
use App\lib\Car\CarInterface as Car;
class CarController extends Controller {
    protected $carObject;
    public function __construct(Car $c) {
        $this->carObject = $c;
    }
    public function getIndex(){
        $cars = $this->carObject->getAll();
        return view('cars.index')->with('cars',$cars);
    }
}

ここで達成する主な目的は、リポジトリメソッドをコントローラに呼び出すことですが、要件に応じてそれらを使用する必要があります。

更新

CarEloqentは基本的にデータベースの実装を改善するのに役立ちます。たとえば、将来、redisのような他のデータベースに同じ機能を実装したい場合は、別のクラスCarRedisを追加し、サーバープロバイダーから実装ファイルのパスを変更するだけです。

更新1:適切なリソース

http://programmingarehard.com/2014/03/12/what-to-return-from-repositories.html

[本]見習いから職人までTaylor Otwell

一般的に懸念の分離と呼ばれるリポジトリの方法とソフトウェア設計の原則についての非常に良い説明。この本を読むべきだ。

これらの動作を達成するためにまだ混乱がある場合はお知らせください。ただし、変更または更新する必要がある事項を見つけた場合、または要件に従って、この質問を監視してこの回答を更新します。

25
Safoor Safdar