Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel、依赖注入和雄辩_Php_Laravel_Dependency Injection - Fatal编程技术网

Php Laravel、依赖注入和雄辩

Php Laravel、依赖注入和雄辩,php,laravel,dependency-injection,Php,Laravel,Dependency Injection,将laravel的依赖项注入系统用于多实例对象(如CRUD模型)的正确/最佳方法是什么 PHP领域某些角落的当前流行说法是以下代码“不好” 这很糟糕,因为该方法现在依赖于新的对象实例化。当前的流行趋势是,对象应该通过某种依赖注入系统注入,比如Laravel的依赖注入系统 然而,注入雄辩的模型似乎有问题 /*...* public function __construct(\App\SomeModel $object) { $this->someModel = $object; }

将laravel的依赖项注入系统用于多实例对象(如CRUD模型)的正确/最佳方法是什么

PHP领域某些角落的当前流行说法是以下代码“不好”

这很糟糕,因为该方法现在依赖于新的对象实例化。当前的流行趋势是,对象应该通过某种依赖注入系统注入,比如Laravel的依赖注入系统

然而,注入雄辩的模型似乎有问题

/*...*
public function __construct(\App\SomeModel $object)
{
    $this->someModel = $object;
}

function someMethod()
{
    /* .. stuff ... */
    $object = $this->someModel;
    $object->some_prop = 'some value';
    $object->save();
    /* .. other stuff ... */
}  
/*...*/           
不清楚Laravel的自动构造函数依赖项注入是否每次都创建新实例,或者注入的对象是否是单实例对象。它也不能处理您想要使用Elounce的静态助手的情况

function someMethod($object_id)
{
    //another dependency
    \App\SomeModel::find($object_id);

    //but this doesn't work
    $this->someModel->find($object_id);
}    

在Laravel应用程序中是否有一种普遍接受的处理方法?有些人说你应该给工厂注射疫苗。另一些人说。我想知道Laravel开发人员的一般做法是什么,如果Laravel在这里提供了任何可以帮助的东西(基本工厂/存储库实现,等等)

我对此做了一点尝试(没有认真的测试),看起来这是可能的-事实上,我更喜欢这样做,并期待未来。样本(未测试)如下:


像find这样雄辩的外观上的find助手很不错,但本质上他们是一个标准,在那里(…)->get()->first()。

多亏了工程师的帮助,我自己解决了这个问题

事实证明,除了自动构造函数依赖项注入之外,Laravel还有一种特殊形式的依赖项注入,它可以与任何一种构造函数一起工作

考虑这个代码示例

Route::get('api/users/{user?}', function (App\User $user) {
    return $user->email;
});

如果您使用变量(
{user}
)设置路由字符串,Laravel将扫描路由处理程序(上面是一个匿名函数,但它也与控制器方法一起工作)的参数,查找短类名与变量名匹配的类型提示(
App\user
)。如果找到,Laravel将实例化一个已加载的雄辩对象,而不是从URL传递参数。如果使用可选参数,您将得到指定类型的空白对象。

关于Laravel DI的广泛讨论非常棒。包括类和接口的使用等。我找到的最好的参考资料。


Laravel有一个强大的控制反转(IoC)/依赖注入(DI)容器。不幸的是,官方文档并没有涵盖所有可用的功能,所以我决定尝试使用它并为自己编写文档。以下是基于Laravel 5.4.26的-其他版本可能会有所不同。

只是为了给脸起个名字,这就是路由绑定的意义所在,对吗?
use App/Models/Foo;

class FooController {

    private $model;

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

    public function show(Request $request, $id)
    {
        $foo = $this->model->where($this->model->getKeyName(), '=', $id)->first();

        dd($foo);
    }

    public function store(Request $request)
    {
        $foo = $this->model->newInstance();
        $foo->bar = $request->get('baz');
        $foo->save();
    }

}
Route::get('api/users/{user?}', function (App\User $user) {
    return $user->email;
});