向IOC 容器添加自己的类
打赏作者

zhangwei900808

看到这个视频感觉就清晰好多了,也知道是怎么回事了,谢谢群主的视频

jjoker

第一课讲 IoC 容器的时候有点懵,因为博主所讲的内容 IoC 的作用跟自己所了解的不一样。看到这里的时候发现博主是为了后面的 serviceprovider 做了一个铺垫。
我认为 IoC 容器更重要的定义应该是,它一个(通过控制反转和依赖注入实现的)解耦方案中的一个工具。它的目的是为了提供一个外部创建依赖对象的地方。至于落实到 laravel 这个具体的框架,它里面使用了什么技术实现它,或者它还能起到什么作用可以单独开一个课程。
嘿嘿,这是我个人的一点建议。

foxriver123 回复 jjoker

个人感觉。它的实现归功容器的bindings这个数组。这个bindings更像是一个机床。帮laravel生产各种对象。

yaoye6262

跟你一样创建了 billing 目录! 里面创建了 Stripe.php 这个类! 之后创建ServiceProvide 之后注册!
那我需要再 billing 目录再创建一个类 之后还需要注册吗? 而创建的第二个类需要和Stripe这个类 联系在一块 !
需要怎么样做呢?

yaoye6262

或者说,如果再billing 目录再创建一个类 我是不是需要再添加一个ServiceProvide???

JellyBool 回复 yaoye6262

不用啊……符合psr就可以了啊

a359611223

第三方的package就是这样写的吗?

JellyBool 回复 a359611223

你去看看开发 laravel 扩展那个教程

578101804

站长请问下你在终端输入怎么有提示我同样在mac上咋没提示?

578101804

你的终端好好看

JellyBool 回复 578101804

你看看 Mac 开发大杂烩那个视频

YVEND

真好,简洁明了。

YVEND

群主,你学习时候是把laravel的源码也吃透,还是只要知道功能怎么使用就行了呢?

JellyBool 回复 YVEND

会先知道怎么用,再去看源码

foxriver123 回复 JellyBool

教主说的很对。至于看源码,个人感觉要花时间来沉淀,至少我在看中间件装饰者模式设计的管道哪里卡了很久!痛并快乐着。(拨洋葱有兴趣可以研究下很有意思)

iopkq999

我想问一下啊,就是如果我要增加自己写的类
我在app下创建新的文件夹,Library,存放我的ProductOperation.class
后面调用的话,是不是可以直接依赖注入 写类型提示参数调用就可以了?
不需要在Service Provider 那里新增service provider注册了吧

JellyBool 回复 iopkq999

可以不注册 ServiceProvider ,看你怎么用而已

foxriver123 回复 iopkq999

不用,因为容器可以用PHP反射帮你解析

f4cklangzi

老大,我有两个问题:
1.为什么要一个一个在app.php里面去注册每个服务提供者,而不是就直接在AppServiceProvider.php的register方法里面使用$this->app->singleton绑定呢?
2.提供的服务可以延迟加载,那延迟加载与不延迟加载有什么不同呢?

carsonlius 回复 f4cklangzi

延迟加载 参考了HashServiceProvider 和官方文档
To defer the loading of a provider, set the defer property to true and define a provides method. The provides method should return the service container bindings registered by the provider: ·

<?php

namespace App\Providers;

use App\Billing\Stripe;
use Illuminate\Support\ServiceProvider;

class BillServiceProvider extends ServiceProvider
{
    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = true;

    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('billing', function($app){
           return new Stripe();
        });
    }

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return ['billing'];
    }
}
carsonlius 回复 f4cklangzi

@JellyBool

foxriver123 回复 f4cklangzi

是完全可以的。但是这种做法是不规范的,如果所有东西都放一个文件,会显得很乱。没有良好的分类,维护起来是一个灾难!
不延迟加载的ServiceProvider在框架引导过程中就会实例化.延迟加载的ServiceProvider会在你用到他提供的服务的时候被实例化!

carsonlius
  • laravel官方文档
    • 使用延迟加载的时候,需要配置defer属性和 providers 方法 , 但是没有搞东provides 方法怎么填写, 下面这样写可以吗? 没有报错,但是感觉文档不是这个意思
<?php

namespace App\Providers;

use App\Billing\Stripe;
use Illuminate\Support\ServiceProvider;

class BillServiceProvider extends ServiceProvider
{
    /**
     * Indicates if loading of the provider is deferred.
     *
     * @var bool
     */
    protected $defer = true;

    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
    }

    /**
     * Register the application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('billing', function($app){
           return new Stripe();
        });
    }

    /**
     * Get the services provided by the provider.
     *
     * @return array
     */
    public function provides()
    {
        return [Stripe::class];
    }
}
f4cklangzi 回复 carsonlius

返回你上面定义的别名,不是类名

carsonlius 回复 f4cklangzi

是的 这一评论我已经编辑过了 就是不知道怎么没有生效

stonehang

好菜 肺部放荡不羁n’f’d