Press "Enter" to skip to content

PHP Laravel框架分享

Why Laravel

github 50k stars

image

google trend

image

目录结构

.
├── app //应用的核心代码
│   ├── Broadcasting //广播频道类
│   ├── Console //自定义artisan命令
│   ├── Events //事件类(观察者)
│   ├── Exceptions //异常类
│   ├── Http //所有http相关的 控制器/中间件等
│   ├── Jobs //队列任务
│   ├── Listeners //处理事件监听的类(观察者)
│   ├── Mail //邮件相关类
│   ├── Models //与数据库交互的模型类
│   ├── Notifications //应用发送的所有通知
│   ├── Policies //应用所有的授权策略类
│   ├── Providers //服务提供者
│   └── Rules //自定义验证规则对象
├── bootstrap //框架的启动和自动载入配置
│   ├── app.php
│   └── cache //提升性能缓存文件夹
├── config //应用所有的配置文件
│   ├── app.php
│   ├── auth.php
│   ├── broadcasting.php
│   ├── cache.php
│   ├── database.php
│   ├── filesystems.php
│   ├── hashing.php
│   ├── logging.php
│   ├── mail.php
│   ├── queue.php
│   ├── services.php
│   ├── session.php
│   └── view.php
├── database //数据库迁移文件及填充文件
├── public //服务器所指向的应用根目录
│   └── index.php
├── resources //应用视图文件和未编译的原生前端资源文件(LESS、SASS、JavaScript)
├── routes //应用定义的所有路由
│   ├── api.php //纯api,需要通过token认证
│   ├── channels.php //事件广播路由
│   ├── console.php //控制台命令
│   └── web.php //view Session/CSRF/Cookie
├── storage 
│   ├── app //应用生成的文件
│   ├── framework //框架生成或缓存的文件
│   └── logs //应用日志
├── tests
│   ├── Feature
│   └── Unit
└── vendor

创建个新项目

composer create-project laravel/laravel test --prefer-dist
docker-compose down
docker-compose up -d nginx mysql phpmyadmin redis workspace
1) web hello-world
    ./artisan make:controller HelloWorldController
2) api hello-world
    Route::middleware('auth:api', 'throttle:60,1')->group(function () {
        Route::get('/user', function () {
            //
        });
    });   
3) console hello-world
    ./artisan make:command HelloWorld
4) channels hello-world

请求生命周期

核心概念

服务容器

绑定闭包

$this->app->bind('HelpSpot\API', function ($app) {
return new HelpSpot\API();
});//闭包直接提供实现方式

绑定接口

$this->app->bind(
'App\Contracts\EventPusher',
'App\Services\RedisEventPusher'
);

singleton绑定

$this->app->singleton('HelpSpot\API', function ($app) {
    return new HelpSpot\API($app->make('HttpClient'));
});

instance绑定

$api = new HelpSpot\API(new HttpClient);
  $this->app->instance('HelpSpot\Api', $api);

Context绑定

$this->app->when(DumpServer::class)->needs('$host')->give($host);

$this->app->when(StorageController::class)
          ->needs(Filesystem::class)
          ->give(function () {
            Storage::class
          });//提供类名

$this->app->when(PhotoController::class)
          ->needs(Filesystem::class)
          ->give(function () {
             return new Storage();
          });//提供实现方式

服务别名

$this->app->make('auth')
又可以写成:
$this->app->make('\Illuminate\Auth\AuthManager::class')
还可以写成:
$this->app->make('\Illuminate\Contracts\Auth\Factory::class')

具体实现类

make解析

  $fooBar = $this->app->make('HelpSpot\API');
  //or
  $api = resolve('HelpSpot\API');

例子

// 创建一个容器(后面称作超级工厂)
$container = new Container;

// 向该 超级工厂添加超人的生产脚本
$container->bind('superman', function($container, $moduleName) {
    return new Superman($container->make($moduleName));
});

// 向该 超级工厂添加超能力模组的生产脚本
$container->bind('xpower', function($container) {
    return new XPower;
});

// 同上
$container->bind('ultrabomb', function($container) {
    return new UltraBomb;
});

// ****************** 华丽丽的分割线 **********************
// 开始启动生产
$superman_1 = $container->make('superman', 'xpower');
$superman_2 = $container->make('superman', 'ultrabomb');
$superman_3 = $container->make('superman', 'xpower');
// ...随意添加

服务提供者

应用启动的中心,应用以及所有 的核心服务都是通过服务提供者启动。
就是提供了把类注册到容器的功能,以便后面使用。
* config/app.php
* register注册
* boot 引导、初始化

门面

门面为应用服务容器中的绑定类提供了一个「静态」接口。

Route::get('/', function() {
    // bla bla bla...
});

契约

指框架提供的一系列定义核心服务的接口,如:

  • Illuminate\Contracts\Queue\Queue
  • Illuminate\Contracts\Mail\Mailer

One Comment

  1. zy
    zy 2019年3月8日

    点赞

发表评论

邮箱地址不会被公开。 必填项已用*标注