参考资料

核心概念

IOC 控制反转
DI 依赖注入

IOC、DI 表达的是同一种意思,这并不是一些新的概念
IOC、DI 可以理解为用对象传递参数与操作
设计模式中这个叫与直接的朋友通信(传递的参数可以出现在函数的参数、返回值中,不在函数内部进行 new)

反射 是框架设计的灵魂

组件

Artisan 是 Laravel 自带的命令行接口

laravel/lumen 启动方式

  1. php -S localhost:5000 -t ./public

Lumen 框架

lumen 构建微服务

  • 安装 laravel composer global require laravel/installer --update-with-all-dependencies
  • 安装 composer global require "laravel/lumen-installer=~1.0"
  • 测试安装 lumen --version
  • 拉取代码脚手架 composer create-project laravel/lumen --prefer-dist

注意:

  • 安装过程肯能会失败,查阅 stack overflow
  • 更改 php.ini 配置
    1. extension=php_openssl.dll
    2. extension=php_mbstring.dll

Nginx

下载 Nginx

laravel 框架

安装 laravel 的时候可能会出现异常,请调整 php.ini 配置文件

  1. extension=php_bz2.dll
  2. extension=php_curl.dll
  3. extension=php_fileinfo.dll
  1. 安装 laravel 安装器 composer global require laravel/installer
  2. 创建项目 composer create-project --prefer-dist laravel/laravel blog
  3. 启动测试 php artisan serve

json

php 返回 json 数据

  1. <?php
  2. function json_response() {
  3. $ret = array(
  4. "Name" => "Jade",
  5. "Age" => 21,
  6. );
  7. return json_encode($ret);
  8. }

lumen 声明周期

image.png

文件上传

aap.php

  1. <?php
  2. /*
  3. * 建立软连接
  4. */
  5. if (!file_exists($app->basePath('public/storage'))) {
  6. $app->make('files')->link(
  7. storage_path('app/public'), $app->basePath('public/storage')
  8. );
  9. }

业务逻辑

  1. <?php
  2. $file = $request->file('file');
  3. $filename = date('YmdHis').rand(0, 1000).'.'.$file->guessExtension();
  4. $dir = storage_path('app/public/imgs');
  5. $file->move($dir, $filename);
  6. // 地址配置到 env 中
  7. $ret = array(
  8. "poster_url" => "localhost:5000/storage/imgs/" . $filename
  9. )

环境相关问题

参考资料

  1. <?php
  2. class Env {
  3. // 获取 php.ini 文件中 site_idc 字段的值
  4. // site_idc=local
  5. public static function getIdc() {
  6. return get_cfg_var('site_idc');
  7. }
  8. }
  9. // 设置环境变量文件
  10. try {
  11. (new Dotenv\Dotenv(dirname(__DIR__) . '/envs/', $idc . 'ml.env'))->load();
  12. } catch (Dotenv\Exception\InvalidPathException $e) {
  13. //
  14. }
  15. // 获取环境变量的值
  16. getenv('DB_URL')

数据库建表

参考资料
laravel、lumen 框架使用 artisan 命令快速创建、操作表

  • 创建脚本 php artisan make:migration user_info

这里会生成一个 xxx_user_info.php 的脚本

  • 执行迁移 php artisan migrate

相关命令待进一步补充

测试数据插入

参考资料
database/seeds
php artisan make:seeder ScoresTableSeeder 创建插入文件

可能需要重新自动加载一下
composer dump-autoload

填充指定的表
php artisan db:seed --class ScoresTableSeeder

填充所有的表
php artisan db:seed

  1. <?php
  2. use Illuminate\Database\Seeder;
  3. class ScoresTableSeeder extends Seeder
  4. {
  5. /**
  6. * Run the database seeds.
  7. *
  8. * @return void
  9. */
  10. public function run()
  11. {
  12. DB::table('scores')->insert([
  13. 'class' => 90,
  14. 'desc' => '良好',
  15. ]);
  16. }
  17. }

服务注册与使用

请阅读参考资料
一、注册
App/Providers

  1. 编写需要注册的类比如 redis、rabbitmq 连接相关
  2. 生成服务文件,在服务文件中编写 register 代码
  3. 在 bootstrap/app.php 中注册到 app

$app->register(App\Providers\RedisServiceProvider::class)

二、使用(依赖注入)

  • 可以在任意类的构造方法中传入
  • 可以在函数的参数中传入

ServiceProvider 参考代码
PandsService 是编写的业务类(这里的目的是注册业务类让全局都能使用)

  1. <?php
  2. namespace App\Providers;
  3. use Illuminate\Support\ServiceProvider;
  4. use App\Service\Pandas\PandasService;
  5. class PandasServiceProvider extends ServiceProvider
  6. {
  7. /**
  8. * Register any application services.
  9. *
  10. * @return void
  11. */
  12. public function register()
  13. {
  14. $this->app->singleton('pandas', function(){
  15. return new PandasService();
  16. });
  17. }

Facede

外观模式
这个地方可以在思考下

目前了解到:

  • Facede 提供静态调用 __callStatic()
  • getFacadeAccessor() 获取 IOC 容器中的类
  • 通过 XXXFacede 类进行调用外观方法
  • 静态代理
  • 门面不需要依赖注入

请阅读参考资料1
一般步骤:

  • 编写需要全局注入的类 (比如 FooService)
  • 编写 FooServiceProvider 类,进行 register
  • 在 bootstrap/app.php 中进行全局注入 $app->register
  • 编写 Facedes 中对应的外观类
  • 在全局任意地方直接调用

也可以不注册直接修改外观类,只要 getFacadeAccessor 能访问到

请阅读参考资料2

单元测试

phpunit

执行测试
./vendor/bin/phpunit ./tests/ExampleTest.php

请阅读参考资料1 ==> assert 方法类型
请阅读参考资料2

Eloquent ORM

Model Demo 代码

  1. <?php
  2. namespace App;
  3. use Illuminate\Database\Eloquent\Model;
  4. class Flight extends Model
  5. {
  6. // 绑定表名
  7. protected $table = 'my_flights';
  8. // Eloquent 默认创建
  9. public $timestamps = false;
  10. // 日期存储格式
  11. protected $dataFormat = 'U';
  12. /**
  13. * 如果要自定义时间戳的名字
  14. */
  15. const CREATED_AT = 'creation_date';
  16. const UPDATED_AT = 'last_update';
  17. // 一般情况 lumen 会有一个默认的连接
  18. // 如果需要配置其他连接,请更改 connection 参数
  19. protected $connection = 'connection-name';
  20. }

查询

  1. <?php
  2. use App\Models\Flight;
  3. // 查询全部
  4. $flights = Flight::all();
  5. // 其他约束
  6. $flights_active = Flights::where('active', 1)
  7. ->orderBy('name', 'desc')
  8. ->take(10)
  9. ->get();
  10. // 大量数据处理
  11. Flight::chunk(200, function ($flights) {
  12. foreach($flights as $flight) {
  13. //
  14. }
  15. })
  16. // 游标只能查询一个,处理大量数据时可以大幅节省内存
  17. foreach(Flight::where('active', 1)->cursor() as $f) {
  18. //
  19. }

单个模型查询

  • 通过逐渐返回一个模型
    • $f = Flight::find(1);
  • 返回符合条件限制的第一个模型
    • $f = Flight::where('active', 1)->first();
  • 主键作为参数调用 find
    • $fs = Flight::find([1, 2, 3])

找不到异常
$f = Flight::findOrFail(1);
$f = Flight::where('class', '>', 99)->firstOrFail();

聚合函数相关

count、sum、max 等
$cnts = Flight::where('active', 1)->count();
$the_max = Filght::where('active', 1)->max('price');

插入与更新