定义接口
在app\Repositories\Contracts 目录下新建一个UserInterface.php
namespace App\Repositories\Contracts;
interface UserInterface{
public function findBy($id);
}
定义一个基本的抽象类:
在 app\Repositories\Eloquent目录下新建一个Repository.php
namespace App\Repositories\Eloquent;
use App\Repositories\Contracts\UserInterface;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Container\Container as App;
abstract class Repository implements UserInterface{
protected $app; //App容器
protected $model; //操作model
public function __construct(App $app){
$this->app = $app;
$this->makeModel();
}
abstract function model();
public function findBy($id){
return $this->model->find($id);
}
public function makeModel(){
$model = $this->app->make($this->model());
/*是否是Model实例*/
if (!$model instanceof Model){
throw new RepositoryException("Class {$this->model()} must be an instance of Illuminate\\Database\\Eloquent\\Model");
}
$this->model = $model;
}
}
创建UserRepository.php 并继承抽象类
在 app\Repositories\Eloquent 目录下新建一个UserRepository.php
namespace App\Repositories\Eloquent;
use App\Repositories\Eloquent\Repository;
use App\User;
class UserRepository extends Repository{
public function model(){
return User::class;
}
public function findBy($id){
return $this->model->where('id',$id)->first()->toArray();
}
}
控制器依赖注入
首先需要引入文件,然后在HomeController类里书写代码:
namespace App\Http\Controllers;
use App\Http\Requests;
use Illuminate\Http\Request;
use App\Repositories\Contracts\UserInterface;
use UserRepository;
use App\Repositories\Eloquent\UserRepository as UserRepo;
class HomeController extends Controller{
private $user; //定义一个私有的变量
private $userRepo;
public function __construct(UserInterface $user,UserRepo $userRepo){
$this->user = $user;
$this->userRepo = $userRepo;
}
public function index(){
dd($this->userRepo->findBy(2));
return view('home');
}
}