php - 关于laravel容器的使用,大家都是什么情况下用?
怪我咯
怪我咯 2017-04-10 17:19:17
[PHP讨论组]

我还没有很好的理解laravel容器。
我的理解是,容器里放了好多的可供调用的对象。
需要时可以直接使用,无需new等。

想问一下,大家都会用到这个特性么?
项目中一般怎么去用这个特性呢?是分出个service层,然后把各个service都放到容器里?
在controller里调用?
还是直接不用呢?

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(2)
PHP中文网

Laravel容器是用来放Service的地方,这些Service就是一个个绑定到容器中的实例对象或闭包或其他的,绑定方式主要三种:bind(),singleton() and instance(),从容器中解析Service方式:make(),这些都在\Illuminate\Container\Container,而\Illuminate\Foundation\Application extends Container。

关于Container是如何工作的,当在Controller中使用Constructor Injection或Method Injection时,就已经在使用Container了,因为Container会自动帮你把这些服务解析出来,如:

class AccountController extends Controller
{
    // 这里是Method Injection,Container会自动解析出Request,而不需要去new Request获得对象
    // 从容器中解析服务是用的Container::make()方法
    public function test(Request $request) 
    {
        return $request->ip();
    }
}

所以容器服务一直都在用,总的来说容器就是分离了服务构造的场所,传统是在被依赖对象内构造所需要的服务,而现在是在容器这个场所内构造所需依赖,而且是自动化的,并自动化注入到被依赖对象内,这样就实现了解耦。

关于Container和Application的源码解析可以看下:
Laravel学习笔记之Container源码解析
Laravel学习笔记之IoC Container实例化源码解析

迷茫
<?php

namespace App\Http\Controllers;

use App\User;
use App\Repositories\UserRepository;
use App\Http\Controllers\Controller;

class UserController extends Controller
{
    /**
     * User Repository 的实现。
     *
     * @var UserRepository
     */
    protected $users;

    /**
     * 创建新的控制器实例。
     *
     * @param  UserRepository  $users
     * @return void
     */
    public function __construct(UserRepository $users)
    {
        //这里已经注入
        $this->users = $users;
    }

    /**
     * 显示指定用户的详细信息。
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id)
    {    
        //开始使用!你看见我有new过users对象吗?
        $user = $this->users->find($id);

        return view('user.profile', ['user' => $user]);
    }
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号