Laravel接口

时间:2015-06-22 09:14:31

标签: php laravel interface namespaces

我使用以下教程来了解接口:

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

Model 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',

1 个答案:

答案 0 :(得分:21)

在我最近的laravel 5项目中,我习惯于将我的逻辑准备为Repository方法。 所以这是我目前的目录结构。例如,我们有'Car'。

首先,我只需在libs目录下创建目录名为app并将其加载到composer.json

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

之后我创建了一个子文件夹,称之为Car。在Car文件夹下创建两个文件'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

[书] 从泰勒奥特威尔的学徒到工匠

关于存储库方法和软件设计原则的非常好的解释通常称为关注点分离。你应该读这本书。

如果你仍然有任何困惑来实现这些行为让我知道,但是如果我找到一些要更改或更新的内容或根据要求,我将继续关注这个问题来更新这个答案。