Laravel Interfaces汽车接口卡洛因特

2022-08-30 19:52:44

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

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

但是我想将放置界面的位置的目录更改为“应用程序/模型/界面”。于是我就这么做了。但现在我无法让它工作。这是我的代码:

路线.php

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

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

车型斯巴鲁.php

<?php

use App\Models\Interfaces\CarInterface;

class Subaru implements CarInterface {

..etc

接口车接口

<?php namespace App\Models\Interfaces;

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

我在我的composer.json中添加了这个:

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

我甚至在我的开始/全局.php文件中添加了这个:

ClassLoader::addDirectories(array(

app_path().'/models/interfaces',

答案 1

在我最近的 laravel 5 项目中,我习惯于将我的逻辑准备为 Repository 方法。这是我当前的目录结构。例如,我们有“汽车”。

所以首先我只是在目录下创建目录调用它并将其加载到libsappcomposer.json

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

之后,我创建了一个名为它的子文件夹。在Car文件夹下创建两个文件“CarEloquent.php”,用于雄辩的实现和作为接口。CarCarInterface.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基本上可以帮助我们改进数据库实现,例如,将来如果您想为其他数据库实现相同的功能,就像您只需添加另一个类并从服务器提供程序更改实现文件路径一样。redisCarRedis

更新1:良好的资源

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

[书]从学徒到工匠 泰勒·奥特韦尔

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

如果您仍然对实现这些行为有任何困惑,请告诉我,但是如果我发现一些要更改或更新或根据要求,我会密切关注此问题以更新此答案。


答案 2

推荐