Laravel:避免在控制器中使用构造函数创建模型实例

时间:2015-02-12 14:51:30

标签: php laravel oop design-patterns laravel-4

我正在学习Laravel 4的课程,老师做了一个代码重构,并在控制器中引入了一个魔术方法构造函数

class UtentiController extends BaseController {

    protected $utente;

    public function __construct(Utenti $obj) {  
        $this->utente = $obj;
    }

    public function index() {
        $utenti = $this->utente->all();
        return View::make('utenti.index', ["utenti" => $utenti]);
    }

    public function show($username) {
        $utenti = $this->utente->whereusername($username)->first(); //select * from utenti where username = *;
        return View::make('utenti.singolo', ["utenti" => $utenti]);
    }

    public function create() {
        return View::make('utenti.create');
    }


    public function store() {
        if (! $this->utente->Valido( $input = Input::all() ) ) {
            return Redirect::back()->withInput()->withErrors($this->utente->messaggio);
        }

        $this->utente->save();
        return Redirect::route('utenti.index');
    }

}

感谢这段代码,我不必每次都创建Utenti模型的新实例:

protected $utente;
public function __construct(Utenti $obj) {

    $this->utente = $obj;

}

现在我可以通过这种简单的方法访问数据库:

$this->utente->all();

而在此之前,我必须这样做:

$utente = new Utente;
$utente::all();

这种技术有名字吗? (这是一种模式吗?)。

我的理解是,每次调用控制器时,它都会自动生成User类(模型)的实例并应用别名(reference)属性$utente

这是对的吗?

此外,这是Utenti模型的代码:

class Utenti extends Eloquent {

    public static $regole = [
        "utente" => "required",
        "password" => "required"
    ];

    public $messaggio;

    public $timestamps = false;

    protected $fillable = ['username','password'];

    protected $table = "utenti";

    public function Valido($data) { 
        $validazione = Validator::make($data,static::$regole);

        if ($validazione->passes()) return true;

        $this->messaggio = $validazione->messages();

        return false;
    }
}

1 个答案:

答案 0 :(得分:2)

这称为依赖注入或短DI。在创建Controller的新实例时,Laravel会检查构造函数是否为类型提示参数(类型定义为__construct(Utenti $obj){的参数)如果您的控制器中有任何一个Laravel尝试创建类的一个实例,注入构造函数。

这样做的原因是它变得非常清楚类的依赖性(在这种情况下是你的控制器)是什么。如果您键入提示而不是具体类,则会特别有趣。然后你必须告诉Laravel一个绑定它应该注入的接口的实现,但你也可以轻松交换一个实现或模拟它进行单元测试。

以下是一些可以获取更多信息的链接: