laravel的官方文档不知道读了几遍,想起第一次读的时候还是一个只会使用ThinkPHP中大M方法的大三PHP小白。当时师兄志哥(@徐文志程序猿
从北京实习归来,他做毕设的时候,当时想做一个大学物品交易网,他使用的就是laravel,说要一起做,就大概看了一下。之后由于种种原因,我没有参与到代码中,但是最后还是出来了PP校园
(ps:当时他在PP租车,就想了一个PP校园的名字)。当时还是很看好的,但是最后还是放弃了。之后在在找工作的过程中还看过一次,之后就是参加工作后从yii换到laravel的时候,之后就是现在。一直困扰我的就是laravel的核心概念,一直没能彻底理解,直到今天,我才把它搞懂。
laravel可以说一个很优秀的框架,由于yii的速度不能满足公司的项目要求,逐渐的迁移到了lumen。性能的确有了不小的提升,开始了按需加载。虽然我们的项目已经完全迁移到了lumen上,但是具体的优化还没开始,只是做到了功能的全部迁移。性能的优化也在逐步的进行中。今天研究了一下laravel的核心概念。
1. web服务的基本执行流程
基本上所有的web服务都是有获取请求,执行程序,返回相应这几个阶段。
2.laravel的执行顺序
laravel只是运行在执行程序的阶段,服务器通过nginx将请求转发到PHP上,laravel在这时候才会启动,具体的执行顺序如下图,主要包括程序启动阶段、请求实例化、处理请求、发送相应、结束程序这个几个阶段。
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的核心概念的主要使用方法就说完了,内里还有依赖注入和工厂模式等优秀的设计理念,对此的介绍网上有很多的资源,我就不在这儿重复的叙述了。