Home >Backend Development >PHP Tutorial >向IOC 容器添加自己的类

向IOC 容器添加自己的类

WBOY
WBOYOriginal
2016-06-20 12:27:20944browse

从上一篇文章知道,serviceprovider是管理container的,所以在向container添加了自己的类的时候,也要注册serviceprovider来管理

1.创建自定义的类

需要注意的是,laravel能够对自身app目录内的php 类进行自动加载,只要是符合psr4的命名规则就行

app/Billing/Stripe.php  //这里在app下建立了一个Billing目录,里面放了一个Stripe的类< ?phpnamespace App\Billing;  //需要命名空间才能被php正确查找到class Stripe{    public  function  charge(){        dd('charge');    }}

2.创建service provider

用这个命令创建

php artisan make:provider BillingServiceProvider
app/Providers/BillingServiceProvider.php  //创建成功后会在这个目录生成php文件<?phpnamespace App\Providers;use App\Billing\Stripe;use Illuminate\Support\ServiceProvider;class BillingServiceProvider extends ServiceProvider{    /**     * Bootstrap the application services.     *     * @return void     */    public function boot()    {        //    }    /**     * Register the application services.     *     * @return void     */    public function register()    {        $this->app->bind('billing',function(){  //这里用了bind方法来创建一个container,绑定了一个billing的关键字来关联,这个container里会返回一个Stripe实例,相当于实例化了。            return new Stripe();        });    }}

3.注册service provider

在app.php里注册了才能被laravel识别这个service provider,才能在代码里面调用

config/app.php  'providers' => [  //在providers数组里面添加        /*         * Laravel Framework Service Providers...         */        Illuminate\Auth\AuthServiceProvider::class,        Illuminate\Broadcasting\BroadcastServiceProvider::class,        Illuminate\Bus\BusServiceProvider::class,        Illuminate\Cache\CacheServiceProvider::class,        Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,        Illuminate\Cookie\CookieServiceProvider::class,        Illuminate\Database\DatabaseServiceProvider::class,        Illuminate\Encryption\EncryptionServiceProvider::class,        Illuminate\Filesystem\FilesystemServiceProvider::class,        Illuminate\Foundation\Providers\FoundationServiceProvider::class,        Illuminate\Hashing\HashServiceProvider::class,        Illuminate\Mail\MailServiceProvider::class,        Illuminate\Pagination\PaginationServiceProvider::class,        Illuminate\Pipeline\PipelineServiceProvider::class,        Illuminate\Queue\QueueServiceProvider::class,        Illuminate\Redis\RedisServiceProvider::class,        Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,        Illuminate\Session\SessionServiceProvider::class,        Illuminate\Translation\TranslationServiceProvider::class,        Illuminate\Validation\ValidationServiceProvider::class,        Illuminate\View\ViewServiceProvider::class,        Collective\Html\HtmlServiceProvider::class,        'Maatwebsite\Excel\ExcelServiceProvider',        /*         * Application Service Providers...         */        App\Providers\AppServiceProvider::class,        App\Providers\AuthServiceProvider::class,        App\Providers\EventServiceProvider::class,        App\Providers\RouteServiceProvider::class,        App\Providers\BillingServiceProvider::class, //按照格式添加即可    ],

4.管理路由(测试)

主要是为了测试目的,所以在路由里面直接来测试service provider

app/Http/routes.php//这里有两种方式使用,第一种是跟上一篇文章提到的两种container使用方式有关,第二种是通过自动解析机制来实现//Route::get('/', function () {//    $billing = app('billing');  //用直接传入关键字,也可以用make()//    dd($billing->charge());//});Route::get('/', function (App\Billing\Stripe $billing) {  //传入一个class名字和一个变量,laravel会自动去寻找和解析    dd($billing->charge());});
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn