在我最近的 laravel 5 项目中,我习惯于将我的逻辑准备为 Repository 方法。这是我当前的目录结构。例如,我们有“汽车”。
所以首先我只是在目录下创建目录调用它并将其加载到libs
app
composer.json
"autoload": {
"classmap": [
"database",
"app/libs" //this is the new changes (remove this comment)
]
}
之后,我创建了一个名为它的子文件夹。在Car文件夹下创建两个文件“CarEloquent.php”,用于雄辩的实现和作为接口。Car
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();
}
}
然后创建汽车服务提供程序以绑定 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
更新1:良好的资源
http://programmingarehard.com/2014/03/12/what-to-return-from-repositories.html
[书]从学徒到工匠 泰勒·奥特韦尔
关于存储库方法和软件设计原则的非常好的解释,通常称为关注点分离。你应该读这本书。
如果您仍然对实现这些行为有任何困惑,请告诉我,但是如果我发现一些要更改或更新或根据要求,我会密切关注此问题以更新此答案。