目录

初识Laravel核心概念

laravel的官方文档不知道读了几遍,想起第一次读的时候还是一个只会使用ThinkPHP中大M方法的大三PHP小白。当时师兄志哥(@徐文志程序猿 从北京实习归来,他做毕设的时候,当时想做一个大学物品交易网,他使用的就是laravel,说要一起做,就大概看了一下。之后由于种种原因,我没有参与到代码中,但是最后还是出来了PP校园 (ps:当时他在PP租车,就想了一个PP校园的名字)。当时还是很看好的,但是最后还是放弃了。之后在在找工作的过程中还看过一次,之后就是参加工作后从yii换到laravel的时候,之后就是现在。一直困扰我的就是laravel的核心概念,一直没能彻底理解,直到今天,我才把它搞懂。
laravel可以说一个很优秀的框架,由于yii的速度不能满足公司的项目要求,逐渐的迁移到了lumen。性能的确有了不小的提升,开始了按需加载。虽然我们的项目已经完全迁移到了lumen上,但是具体的优化还没开始,只是做到了功能的全部迁移。性能的优化也在逐步的进行中。今天研究了一下laravel的核心概念。

1. web服务的基本执行流程

基本上所有的web服务都是有获取请求,执行程序,返回相应这几个阶段。 https://img.cdn.resowolf.com/static/客户端.png

2.laravel的执行顺序

laravel只是运行在执行程序的阶段,服务器通过nginx将请求转发到PHP上,laravel在这时候才会启动,具体的执行顺序如下图,主要包括程序启动阶段、请求实例化、处理请求、发送相应、结束程序这个几个阶段。 https://img.cdn.resowolf.com/static/laravel-core.png

3.服务容器

服务容器其实就是一个类的加载容器,只不过是给提供了一个新的概念。使用服务容器可以很好的降低程序的耦合性,如果多个地方搜要使用同一个方法,但是这个方法放在任何地方都不是那么合理,就可以用服务容器的方式来处理,这样可以很好的降低每个代码文件的大小,不至于每个文件都有几千行的代码,方便之后的维护。服务容器的加载是开始在程序的开始阶段,贯穿整个程序的执行过程中。 在bootstrap/app.php文件中通过以下代码去注册服务容器。

1
$app->register(App\Providers\ToolsServiceProvider::class);

服务的绑定则需要在ServiceProvider.php文件中通过以下代码实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php
namespace App\Providers;

use App\Service\Tools\Car;
use App\Service\Tools\Train;
use App\Service\Tools\Flight;
use App\Service\Tools\Bus;
use Illuminate\Support\ServiceProvider;

class ToolsServiceProvider extends ServiceProvider
{
    /**
     * 显示是否延迟提供程序的加载
     *
     * @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->bind('ToolsCar', function ($app) {
            return new Car();
        });

        $this->app->bind('ToolsTrain', function ($app) {
            return new Train();
        });

        $this->app->bind('ToolsFlight', function ($app) {
            return new Flight();
        });

        $this->app->bind('ToolsBus', function ($app) {
            return new Bus();
        });
    }

    /**
     * 获取提供者提供的服务
     *
     * @return array
     */
    public function provides()
    {
        return ['ToolsCar', 'ToolsTrain', 'ToolsFlight', 'ToolsBus'];
    }
}

在这儿还有一个延时加载的选项,为了在需要时时候才加载,不影响其他接口的速度,此处使用延时加载,即做到了按需加载。 之后就是调用的问题了,在需要调用的时候添加如下代码,我使用的是引用,这儿也可以使用传实参,后return的方式去处理。

1
app('ToolsCar')->dealTools($data);

4.服务提供者

如果真的要说大实话的话这就是一个类,不过这些类是继承自同一个接口,对同一个方法有不同的实现逻辑,有同样的输入和输出。在laravel中叫Contracts( 也可以叫契约)。

1
2
3
4
5
6
7
8
<?php

namespace App\Contracts;

interface Tools
{
    public function dealTools(array &$data);
}

之后就是服务提供者的编写了

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php
namespace App\Service\Quotation;

use App\Contracts\Tools;

class Car implements Tools
{

    /**
     * 
     * @param array $data
     */
    public function dealTools(array &$data)
    {
        $data['tools'] = 'car';
    }
}

其实在看过很多关于laravel的介绍,之后再去使用它,你就能很轻松的掌握它的使用技巧了,

5.Facades

Facades其实就是一个别名,类似于shell的别名,这个没有需要过多的介绍,使用Facades可以直接静态调用到时很方便的一件事情。

laravel的核心概念的主要使用方法就说完了,内里还有依赖注入和工厂模式等优秀的设计理念,对此的介绍网上有很多的资源,我就不在这儿重复的叙述了。