次のチュートリアルを使用して、インターフェースについてのアイデアを得ました。
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',
私の最近の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
を作成します。
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);
}
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
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
を追加し、サーバープロバイダーから実装ファイルのパスを変更するだけです。
http://programmingarehard.com/2014/03/12/what-to-return-from-repositories.html
[本]見習いから職人までTaylor Otwell
一般的に懸念の分離と呼ばれるリポジトリの方法とソフトウェア設計の原則についての非常に良い説明。この本を読むべきだ。
これらの動作を達成するためにまだ混乱がある場合はお知らせください。ただし、変更または更新する必要がある事項を見つけた場合、または要件に従って、この質問を監視してこの回答を更新します。