# laravel-study **Repository Path**: wang-zhihui-release/laravel-study ## Basic Information - **Project Name**: laravel-study - **Description**: study for laravel - **Primary Language**: PHP - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-03-19 - **Last Updated**: 2021-04-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Note - 服务提供者并不是必须的 比如创建了一个工具类 可以直接自动注入 不需要显式地绑定进服务容器 但是在创建 Contract 和 Facades 时在服务提供者中进行绑定是很方便的 框架推荐的 一个例子: 在 app/contracts 中创建了 GrpcRefreshCache Interface 在 app/service 中做了对应的实现 那么可以在 app/Providers 中的某个 Provider 进行绑定($app->bind) 绑定之后 注入的类型提示是 Interface 但是会自动注入绑定了的实现 这样在更换实现的时候 不需要对调用的地方作出更改 只需要改动 Provider 中的 bind 就好了 这实际上也是实现了一个 Contract 或者新建一个 facades: 在某个地方创建一个工具类 如 app/Untils 下创建一个 class DomainUntil {} 创建一个 服务提供者 将这个类绑定进去服务容器 比如服务提供者就在 app/Providers ```php class DomainUntilProviders extends ServiceProvider { public function register() { $this->app->bind('DomainUt', function() { return new DomainUntil(); }); } } ``` 到这里服务提供者就创建完成了 实际上将这个 Provider 注册进 config/app.php 就可以正常的在需要的地方注入这个类了 但是用 Facades 的模式使用它 还需一步操作 为这个 DomainUntil 类创建一个 Facade 类 比如就在 app/facades 下 ```php use Illuminate\Support\Facades\Facade; class DomainUntilFacade extends Facade { protected static function getFacadeAccessor() { return 'DomainUt'; } } ``` 只需要重写这一个方法就可以了 特别需要注意的是 这里 getFacadeAccessor 方法返回的值是在 Provider 中 bind 的第一个参数 很多文档都写还需要在注册一个别名 其实并不是必须的 完成了上述操作 就可以在需要的地方比如 Service / Controller 直接 use 然后静态访问了 - Pageinate 方法是可以不传入页码的 会自己从请求参数上获得, 默认是 page 这个行为是在 Illuminate\Support\ServiceProvider\PaginationServiceProvider::register 中定义的 - Route 的 group 方法 官方文档是传入闭包 但是观察源码 发现其实可以传入一个 string -- 路由文件的路径 在 Illuminate\Routing\Router 中的 group --> loadRoutes 方法中 如果是一个字符串 会认为是一个路由文件的路径 为这个文件进行注册 - 事件监听的处理流程是 event() 触发 Event 类 并将数据通过构造传入 Event 类的实例化被 EventProvider 中注册 Listeners 监听到 进入到 Listener 的 handle Listener 的 handle 将 Event 的实例注入 从而获取到 event() 时候的数据 - Laravel-module 相关文件 https://nwidart.com/laravel-modules/v3/advanced-tools/artisan-commands - 单元测试和 Mockery 的文档 https://phpunit.readthedocs.io/zh_CN/latest/ http://docs.mockery.io/en/latest 需要注意的是 Mockery 的 composer 包版本是 1.0 http://docs.mockery.io/en/latest/getting_started/quick_reference.html Laravel 的模拟测试基于 Mockery 来做的 但是也不能直接调用 Mockery 需要单独引用(use) - 关于 guzzlehttp 的 HandlerStack::push 方法 $stack->push(fn ($handler) => (fn ($request, $options) => $middleware($request, $options, $handler))); 不太清楚这个 handler , request , options 都是哪个部分给传进去的 他自己的参考是 GuzzleHttp\Middleware 中的一堆方法 https://guzzle-cn.readthedocs.io/zh_CN/latest/handlers-and-middleware.html 妈的这个定义方式处处透露着诡异 - Laravel 代码格式化的一个 cs-fix 的改装 https://github.com/stechstudio/Laravel-PHP-CS-Fixer - Laravel 语法检查工具 https://laravelacademy.org/post/20003 - abort(HTTP_CODE, message) 这个辅助函数的 404 页面的 message 是写死了的 Not Found 第二个参数无效 可以发布这些错误页面 然后进行修改 https://learnku.com/laravel/wikis/25649 php artisan vendor:publish --tag=laravel-errors - Auth 登录部分 在 LoginController 的构造方法中 使用了 guest 的中间件 这个中间件的 handle 方法 接收的第三个 guard 参数的传参方式为 $this->middleware("guest:${guard}") 写在: 后面... 怪怪的...