DI,ServiceProvider,抽象父级和Laravel 5.3

佳佳258

我有一些问题,并且对Laravel SP(ServiceProvider)有点误解。我有抽象类存储库和她的接口:

abstract class Repository implements RepositoryInterface {

private $model;
private $parser;

public function __construct() {
    $this->model = new $this->model_name();
} }


interface RepositoryInterface {

public function create(array $attributes);
public function update($id, array $attributes);
public function delete($id);

public function all();
public function find($id);
public function filter(array $parameters, $query=null);
public function query(array $parameters, $query=null); }

和一些子UserRepository例如:

class UserRepository extends Repository implements UserRepositoryInterface {

protected $model_name = "App\Models\User";

public function __construct() {
    parent::__construct();
}

public function activation($user_id) {
    return "user";
}

public function deactivation($user_id) {
    return "user";
} }

和简单的ModelParser类:

class ModelParser {

protected $parameters;
protected $model;

public function __construct($model) {
    $this->model = $model;
} }

这项工作正常,但是我将ModelParserRepository带有parameter的抽象构造中将DI作为DI传递$model我没有主意。我该怎么办?

我这样使用它:

class UserController extends Controller {

private $repository;

public function __construct(UserRepository $repository) {
    $this->repository = $repository;
} }
里桑·巴贾·普拉达纳(Risan Bagja Pradana)

嗯,这有点复杂,因为您ModelParser需要a$model作为参数。并且由于这$model可能取决于其存储库而有所不同,因此如果我们尝试使用Laravel服务容器绑定来解决它,将会太复杂

有一种更简单的方法,我们可以使ModelParser类的构造函数接收一个可选$model参数。然后,我们可以添加其他方法来设置此$model属性,如下所示:

namespace App\Models;

class ModelParser
{
    protected $parameters;
    protected $model;

    // Make $model parameter optional by providing default value.
    public function __construct($model = null) {
        $this->model = $model;
    }

    // Add setter method for $model.
    public function setModel($model)
    {
        $this->model = $model;

        return $this;
    }
}

现在,您可以将注入ModelParser到您的抽象Repository类中。Laravel将轻松解决此ModelParser参数

namespace App\Models;

use App\Models\ModelParser;
use App\Models\RepositoryInterface;

abstract class Repository implements RepositoryInterface
{
    private $model;
    private $parser;

    // Pass ModelParser instance to your constructor!
    public function __construct(ModelParser $parser)
    {
        $this->model = new $this->model_name();

        // Set the parser's model property.
        $this->parser = $parser->setModel($this->model);
    }

    // Rest of your code.
}

而且,如果要扩展抽象Repository类,则仍必须ModelParser像这样将其传递给构造函数:

namespace App\Models;

use App\Models\ModelParser;
use App\Models\UserRepositoryInterface;

class UserRepository extends Repository implements UserRepositoryInterface
{
    protected $model_name = "App\Models\User";

    public function __construct(ModelParser $parser)
    {
        parent::__construct($parser);
    }
}

实际上,如果您不打算在类实例化过程中传递另一个参数或执行其他操作,则可以简单地__construct()从中删除该方法UserRepository并依靠其父级(抽象Repository)。

希望对您有所帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档