核心概念
IOC 控制反转
DI 依赖注入
IOC、DI 表达的是同一种意思,这并不是一些新的概念
IOC、DI 可以理解为用对象传递参数与操作
设计模式中这个叫与直接的朋友通信(传递的参数可以出现在函数的参数、返回值中,不在函数内部进行 new)
反射 是框架设计的灵魂
组件
Artisan 是 Laravel 自带的命令行接口
laravel/lumen 启动方式
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 配置
extension=php_openssl.dllextension=php_mbstring.dll
Nginx
laravel 框架
安装 laravel 的时候可能会出现异常,请调整 php.ini 配置文件
extension=php_bz2.dllextension=php_curl.dllextension=php_fileinfo.dll
- 安装 laravel 安装器
composer global require laravel/installer - 创建项目
composer create-project --prefer-dist laravel/laravel blog - 启动测试
php artisan serve
json
php 返回 json 数据
<?phpfunction json_response() {$ret = array("Name" => "Jade","Age" => 21,);return json_encode($ret);}
lumen 声明周期
文件上传
aap.php
<?php/** 建立软连接*/if (!file_exists($app->basePath('public/storage'))) {$app->make('files')->link(storage_path('app/public'), $app->basePath('public/storage'));}
业务逻辑
<?php$file = $request->file('file');$filename = date('YmdHis').rand(0, 1000).'.'.$file->guessExtension();$dir = storage_path('app/public/imgs');$file->move($dir, $filename);// 地址配置到 env 中$ret = array("poster_url" => "localhost:5000/storage/imgs/" . $filename)
环境相关问题
<?phpclass Env {// 获取 php.ini 文件中 site_idc 字段的值// site_idc=localpublic static function getIdc() {return get_cfg_var('site_idc');}}// 设置环境变量文件try {(new Dotenv\Dotenv(dirname(__DIR__) . '/envs/', $idc . 'ml.env'))->load();} catch (Dotenv\Exception\InvalidPathException $e) {//}// 获取环境变量的值getenv('DB_URL')
数据库建表
参考资料
laravel、lumen 框架使用 artisan 命令快速创建、操作表
- 创建脚本
php artisan make:migration user_info
这里会生成一个 xxx_user_info.php 的脚本
- 执行迁移
php artisan migrate
相关命令待进一步补充
测试数据插入
参考资料
database/seedsphp artisan make:seeder ScoresTableSeeder 创建插入文件
可能需要重新自动加载一下composer dump-autoload
填充指定的表php artisan db:seed --class ScoresTableSeeder
填充所有的表php artisan db:seed
<?phpuse Illuminate\Database\Seeder;class ScoresTableSeeder extends Seeder{/*** Run the database seeds.** @return void*/public function run(){DB::table('scores')->insert(['class' => 90,'desc' => '良好',]);}}
服务注册与使用
请阅读参考资料
一、注册
App/Providers
- 编写需要注册的类比如 redis、rabbitmq 连接相关
- 生成服务文件,在服务文件中编写
register代码 - 在 bootstrap/app.php 中注册到 app
$app->register(App\Providers\RedisServiceProvider::class)
二、使用(依赖注入)
- 可以在任意类的构造方法中传入
- 可以在函数的参数中传入
ServiceProvider 参考代码
PandsService 是编写的业务类(这里的目的是注册业务类让全局都能使用)
<?phpnamespace App\Providers;use Illuminate\Support\ServiceProvider;use App\Service\Pandas\PandasService;class PandasServiceProvider extends ServiceProvider{/*** Register any application services.** @return void*/public function register(){$this->app->singleton('pandas', function(){return new PandasService();});}
Facede
外观模式
这个地方可以在思考下
目前了解到:
- Facede 提供静态调用
__callStatic() getFacadeAccessor()获取 IOC 容器中的类- 通过 XXXFacede 类进行调用外观方法
- 静态代理
- 门面不需要依赖注入
请阅读参考资料1
一般步骤:
- 编写需要全局注入的类 (比如 FooService)
- 编写 FooServiceProvider 类,进行 register
- 在 bootstrap/app.php 中进行全局注入
$app->register - 编写 Facedes 中对应的外观类
- 在全局任意地方直接调用
也可以不注册直接修改外观类,只要 getFacadeAccessor 能访问到
单元测试
phpunit
执行测试./vendor/bin/phpunit ./tests/ExampleTest.php
请阅读参考资料1 ==> assert 方法类型
请阅读参考资料2
Eloquent ORM
Model Demo 代码
<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class Flight extends Model{// 绑定表名protected $table = 'my_flights';// Eloquent 默认创建public $timestamps = false;// 日期存储格式protected $dataFormat = 'U';/*** 如果要自定义时间戳的名字*/const CREATED_AT = 'creation_date';const UPDATED_AT = 'last_update';// 一般情况 lumen 会有一个默认的连接// 如果需要配置其他连接,请更改 connection 参数protected $connection = 'connection-name';}
查询
<?phpuse App\Models\Flight;// 查询全部$flights = Flight::all();// 其他约束$flights_active = Flights::where('active', 1)->orderBy('name', 'desc')->take(10)->get();// 大量数据处理Flight::chunk(200, function ($flights) {foreach($flights as $flight) {//}})// 游标只能查询一个,处理大量数据时可以大幅节省内存foreach(Flight::where('active', 1)->cursor() as $f) {//}
单个模型查询
- 通过逐渐返回一个模型
$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');
