Laravel 之 Application---理论篇

核心概念

laravel中的Application首先是一个容器对象,其次也是一个应用程序对象。

容器对象

作为容器对象,它提供了以下功能

  • 注册创建对象的规则,并在需要的时候创建它;
  • 提供了类似全局变量存储数据的能力。

只需要往容器里面注册一下创建对象的规则,对于使用者而言,只需要使用的时候直接找容器索取,这样做带来的好处有:

  • 对象集中管理,如果把对象比喻成怪兽,那么容器对象就是装怪兽的笼子,怪兽被装进了一个由你控制的笼子里面了,你想干什么都容器。
  • 降低耦合,创建规则和使用的分离,对于使用者而言,完全不必关注如何创建,只管使用就好了。

注意:容器对象在创建类的时候,如果被创建的类的构造函数定义的参数是基本类型的值(string,int....)的话,必须手动传入这个参数,
如果是构造函数的参数是对象类型值的话,容器对象会自动创建注入。

例子


 class Car{

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

     function __toString()
     {
        return (string)$this->name;
     }

 }

 $app = new \Illuminate\Foundation\Application();

 // 错误的返回,因为Car的构造函数需要一个基本的数据类型的值,容易对象无法自动构建
 // $app->bind('car',Car::class);

 //正确的方式,手动在定义创建规则的时候传入参数
 $app->bind('car',function(){
     return new Car('雷克萨斯');
 });

 echo $app->make('car');

应用程序对象

Application作为了一个应用程序对象,主要提供了一下功能:

  • 注册基础核心服务,EventServiceProvider(events),LogServiceProvider(log),RoutingServiceProvider(路由相关服务)
  • 提供了执行bootstrappers列表的API接口bootstrapWith
  • 提供了执行serviceProvider列表的API接口boot
  • 提供了获取设置应用程序内部信息的功能。

总结

以容器为核心的思考方式要遵循以下3点

  • 在整个应用程序运行的过程中有且只有一个容器对象
  • 向容器里面注册构造对象的规则
  • 从容器对象获取对象

深入理解其机理最好的方式就是阅读interface Application这个接口的代码。

代码表示如下


class Car{

    protected $name;
    public function __construct(\Illuminate\Foundation\Application $app, $name)
    {
        $this->name = $name;
        // $app 
    }

    function __toString()
    {
       return (string)$this->name;
    }

}

$app = new \Illuminate\Foundation\Application();

// 注册构建对象的规则
$app->bind('car',function()use($app){
    return new Car($app,'雷克萨斯');
});

// 使用
echo $app->make('car');
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 2

对于非依赖注入的情形,其实也可以在解析对象的时候传入所需参数。如果在写解析规则的时候就将传入参数写死,感觉不太好。

Route::get('/',function(){
    $app = app();
    $app->bind('car',Car::class);
    echo $app->make('car', ['name'=>'test']);
});
5年前 评论

作者最后给的 interface Application 代码复制错了, 补充上 (Larave 5.5版本)

<?php

namespace Illuminate\Contracts\Foundation;

use Illuminate\Contracts\Container\Container;

interface Application extends Container
{
    /**
     * Get the version number of the application.
     *
     * @return string
     */
    public function version();

    /**
     * Get the base path of the Laravel installation.
     *
     * @return string
     */
    public function basePath();

    /**
     * Get or check the current application environment.
     *
     * @return string
     */
    public function environment();

    /**
     * Determine if we are running in the console.
     *
     * @return bool
     */
    public function runningInConsole();

    /**
     * Determine if the application is currently down for maintenance.
     *
     * @return bool
     */
    public function isDownForMaintenance();

    /**
     * Register all of the configured providers.
     *
     * @return void
     */
    public function registerConfiguredProviders();

    /**
     * Register a service provider with the application.
     *
     * @param  \Illuminate\Support\ServiceProvider|string  $provider
     * @param  array  $options
     * @param  bool   $force
     * @return \Illuminate\Support\ServiceProvider
     */
    public function register($provider, $options = [], $force = false);

    /**
     * Register a deferred provider and service.
     *
     * @param  string  $provider
     * @param  string|null  $service
     * @return void
     */
    public function registerDeferredProvider($provider, $service = null);

    /**
     * Boot the application's service providers.
     *
     * @return void
     */
    public function boot();

    /**
     * Register a new boot listener.
     *
     * @param  mixed  $callback
     * @return void
     */
    public function booting($callback);

    /**
     * Register a new "booted" listener.
     *
     * @param  mixed  $callback
     * @return void
     */
    public function booted($callback);

    /**
     * Get the path to the cached services.php file.
     *
     * @return string
     */
    public function getCachedServicesPath();

    /**
     * Get the path to the cached packages.php file.
     *
     * @return string
     */
    public function getCachedPackagesPath();
}
4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!