Laravel

分类下相关文章

使用 Opcache 优化 Laravel 的性能

Laravel 令人头疼的性能问题 昨天上午,同事在测试一个知识 PK 的小程序,在 2~3 同时在线的情况下,服务器 CPU 居然达到了 60%,触发了阿里云钉钉报警。。。 一个非常简单的 API 接口,虽然写的逻辑确实比较啰嗦,但是一秒钟不超过 5 个请求的情况下,Laravel 硬是把 CPU 彪到了 60%。 这个性能确实让人无法接受,简直是玩具,根本不满足上线的基本要求。 确认是接口逻辑问题还是 Laravel 的问题 为了确认是接口的逻辑问题,还是 Laravel 的问题。我们做了一些简单的对比测试。 测试的对象是两个不同的 Laravel 项目下的相同功能的 API,例如,这里测 ...

阅读全文...

Route pattern cannot reference variable name more than once

在用 Laravel Backpack 写一个定制化的 CRUD 页面。例如,一个指定店铺所拥有的商品的 CRUD 页面。 起初路由我是这样写的 CRUD::resource('products-of-store/{store_id}', 'ProductCrudController'); 报错 Route pattern "/products-of-store/{store_id}/{{store_id}}" cannot reference variable name "store_id" more than once. 解决方法,Route ...

阅读全文...

使用 Laravel Validator 进行 API 的参数校验

之前记录过 Laravel Form 表单的数据校验, 但是大部分时间我是在写 API 给前端调用。 如果能够使用 Laravel 的 Validator 来进行 API 的数据校验,将节省我大量的时间。 测试了一下,确实可以,而且非常方便使用。 以下为我创建的一个 API Validator 的 VIM Code Snippet $rsp = ['err_code' => 0, 'err_msg' => 'OK',]; $input = $request->all(); $rules = [ 'name' => 'required', 'person_tel' ...

阅读全文...

Laravel 返回数据库中的随机一行数据

最佳方式 $total = Book::count() - 1; $skip = mt_rand(0, $total); $item = Book::select('name', 'author_id')->skip($skip)->take(1)->first(); 耗内存的方式 Book::inRandomOrder()->get(); 等同于 Book::orderByRaw("RAND()")->get(); 耗内存的原因是,随机序需要建立临时表。 更加耗内存的 Collection 方案 Book::all()->rand ...

阅读全文...

Laravel Eloquent 自定义返回字段

返回指定字段 Book::select("price", "name")->all(); 返回关系字段关联的属性 Book::select("price", "name", "author_id")->with('author')->all(); 注意,如果要返回关系字段的信息,一定要将对应的 id 字段加入到 select 中。否则关系字段会显示为 null. 返回关系字段关联的指定属性 Book::select("price", "name ...

阅读全文...

Laravel 使用手机号加验证码实现用户登录、注册

是否需要使用 password 理论上,登陆使用手机号及验证码已经足够,唯一的问题是,发送短信的成本。看上去,加上个登陆密码会更好,能省去不少成本。 但是,仔细想想,如果你的商城平台的流量大部分来自于渠道方,用户主动回头访问的概率很低,那就完全没有必要设置密码。设置了密码还会带来弊端 不常登陆的网站,理论上一段时间不用,密码就会忘掉,最后还得短信找回密码 设置密码的过程,增加了干扰用户购买的时间,不利于转化 如果省去了设置密码的步骤,实际上就不需要注册页面了,统一使用 login 逻辑即可。 流程图 lararal 自带的授权逻辑 由于使用手机号加验证码的方式与 laravel php ...

阅读全文...

Laravel Form 表单的数据校验

例如,要使用手机号加验证码的方式提供登录网站的功能,那么在处理前端提交的 form 表单时,就不得不对提交的手机号及验证码做基本的数据校验。 手写规则,非常浪费时间。使用 laravel 内置的 validation 功能可以节省大量的代码及时间,而且可读性好一万倍。 新建一个 request php artisan make:request LoginPost 使用独立的 form request validation 的原因是,可以方便的自定义错误信息。 此时会新增一个 request 文件 app/Http/Requests/LoginPost.php 在其中设置校验规则,及定制化的错 ...

阅读全文...

验证 Laravel Cache 的缓存文件在到期后是否会自动删除

验证缓存文件是否会自动删除的目的是,防止产生大量的缓存文件,占满磁盘。因为,我最近越来越多的使用 cache 来缓存各类 token。 使用的是 file 作为 CACHE_DRIVER CACHE_DRIVER=file 首先生成一个 cache > php artisan tinker >>> cache(['name' => 'zhongwei'], 1); => null >>> echo cache('name'); zhongwei 此时检索 cache 文件存储的位置 > grep zhongwei -r ...

阅读全文...

Laravel View Composer - 当 include 一个模板时,自动获取其所需的变量

网站中,许多页面的侧边栏是相同的。例如: 分类列表页,与文章详情页的侧边栏都包含 最新文章 最新评论 统计计数 这些相同的侧边栏数据也是动态的,并不是固定的。 在每个 controller 里都写一遍数据读取逻辑,并赋值给模板,这样做有几个弊端 重复编码量不小。即使提取成函数,也要手动将变量传递给模板,controller 中无法专注于业务逻辑 不利于模块化 简单粗暴的做法 - 全局 view share 之前,我用了一种简单粗暴的解决方案: 在 app/Providers/AppServiceProvider.php 里全局共享模板变量,即,View::share。 但是,这种做法的 ...

阅读全文...

Laravel attribute casting 导致的 Indirect modification of overloaded property

在 Laravel model 中,设置了某个属性做 array casting. protected $casts = [ 'rounds' => 'array', ]; 但是在 controller 中执行 array_push($record->rounds, date("Y-m-d H:i:s")); 时,报错 production.ERROR: Indirect modification of overloaded property 可见,casting 并不支持一些针对特定类型的操作,例如无法作为指定类型的函数的参数。 按照官 ...

阅读全文...

laravel migrate 指定执行部分 migration

由于我不习惯于使用 laravel migration 来管理数据表变更,所以很多项目都是无法直接执行 php artisan migrate 否则会报错 SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'users' already exists 即,这些本该由 migrate 生成的表,已经提前由 SQL 创建了。 所以,我非常需要能够指定运行部分 migration 的方法。例如创建 job queue 相关的两个表。 将需要执行的 migration 文件复制到 new 目录下,然后执行 php ar ...

阅读全文...

laravel job 与 event 的区别

job 是异步执行。适合耗时长的任务。例如,批量发送邮件,短信。 event 是在 request 的生命周期内执行。适合耗时短的操作。例如,更改数据字段状态。 但是, event 的好处是,可以复用各种监听。例如,事件 A1 可以触发 B1, B2; 事件 A2 可以触发 B1, B2, B3。 混合使用 例如,在 event 中添加 job 任务。 参考 https://sergeyzhuk.me/2016/02/23/laravel-jobs-vs-events/ ...

阅读全文...

Laravel 的文件存储 - Storage

记录一下 Laravel Storage 的常见用法 内容写入磁盘文件 > php artisan tinker >>> use Illuminate\Support\Facades\Storage; >>> Storage::put('test.txt', 'hello'); => true ls storage/app/ public/ test.txt 文件默认创建在 project/storage/app 目录下 获取文件存储的本地磁盘全路径 继续在 tinker 中测试一下 >>> storage_path() ...

阅读全文...

对 Laravel 的 Controller 做 Unit Test

之前尝试过对 Laravel 的 Controller 做 Feature Test,但是在业务变得越来越复杂之后,我感觉对 controller 里的函数也没了自信,急需对功能函数做 Unit Test,以平复我不安的情绪。 例如: 新建一个 Unit Test,由于默认新建的是 feature test, 所有后面需要加上 unit 参数 php artisan make:test StaffSalaryHistoryTest --unit 此时会看到 tests/Unit 目录下多了一个文件 Untracked files: (use "git add <file& ...

阅读全文...

laravel eloquent with, has whereHas 的区别

共同之处,这三个函数的参数,都是 model 中的 relationship function 的名字。 1 对 N N 对 N with 类似于 SQL 中的 left join。左侧数据会全部显示。 with 是 eager loading,即预加载关系数据。 has 类似于 SQL 中的 inner join。 当右侧有数据时才会显示。 注意,has 跟 whereHas 并不返回关系数据。 whereHas inner join 之后,可以补充查询条件 whereHas 实际应用场景 例如,backpack 中的 N 对 N 关系的过滤,使用 whereHas $this-> ...

阅读全文...