• 欢迎来到我的博客
  • [email protected]

Laravel 踩坑记录 + 小本本

学习笔记 tianlan 1年前 (2020-04-24) 785次浏览 0个评论 扫描二维码
文章目录[隐藏]

运行 php artisan 错误

In UrlGenerator.php line 120:

Argument 2 passed to Illuminate\Routing\UrlGenerator::__construct() must be
an instance of Illuminate\Http\Request, null given, called in G:\wwwroot\v
ideo-laravel\vendor\laravel\framework\src\Illuminate\Routing\RoutingService
Provider.php on line 68

这是由于在配置文件中使用了 url()、asset() 此类函数(在 CLI 下是不会加载这些函数的),所以就报错了,解决方法:

//如果是 cli 就不调用相关函数
'item'    => PHP_SAPI === 'cli' ? false : asset('statics/js/test.js'),

 

队列任务异常

出现异常或者错误时,无论 catch 与否,就一定会写入failed_jobs表(除非mysql写入失败)

迁移报错

SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes

应该是不同 mysql 版本的 max key length 不同导致的,laravel 默认你使用的 mysql 比较高,而如果你使用低版本 mysql,其 max key length 比较短,就会导致这个问题。

解决办法:随便找个地方加上这行代码

Schema::defaultStringLength(191);

blade 模板中 old() 无效?

简述

输入框中不显示原来的手机号码,但是在 element 中 value 属性有值,证明 old() 是生效了的。

Laravel 踩坑记录 + 小本本

原因

相关 input 绑定了 vue 中的 data,所以在后端渲染(本来是正常显示的)后又进行了前端渲染(导致输入框为空)。

Laravel 踩坑记录 + 小本本

Laravel 踩坑记录 + 小本本

解决办法

old() 函数用在 vue 的 data 中。

Laravel 踩坑记录 + 小本本

 

Laravel 初始化配置

config/app.php

  • 时区:Asia/Shanghai
  • 语言:zh-CN

扩展包

  • barryvdh/laravel-ide-helper
  • barryvdh/laravel-debugbar
  • overtrue/laravel-lang

phpstorm

  • 开启 laravel 插件
  • 配置命令行提示

文件结构

  • 新建如下目录、文件:
libs
    --Helpers
        --helpers.php
packages

记得添加 libs 到 composer.json 的 psr4 自动加载,helpers.php 到 files 自动加载。

  • 移动文件 app\User.php 到 app\Models\User.php ,并且全局替换相关引用。

宝塔部署 Laravel

基础配置

  • 网站运行目录
  • 伪静态

目录权限

安装完 Laravel 后,你可能需要给这两个文件配置读写权限:storage 目录和 bootstrap/cache 目录应该允许 Web 服务器写入,否则 Laravel 将无法运行。

扩展

  • fileinfo 上传文件需要

启用函数

  • put_env() .env文件需要用到
  • symlink() storage:link 需要用到
  • proc_open() 被禁用会导致一些定时任务出错

配置文件注意事项

  • 配置文件中的值不用 time () 诸如此类的函数,因为缓存配置文件的时候 会出现意想不到的 bug

尽可能使用简短且可读性更好的语法

Laravel 踩坑记录 + 小本本

后端传递 json 数据给 前端

let users = @json($users)

不要在模板中查询,尽量使用惰性加载

例子 (对于 100 个用户,将执行 101 次 DB 查询)

@foreach (User::all() as $user)
    {{ $user->profile->name }}
@endforeach

更优的写法 (对于 100 个用户,使用以下写法只需执行 2 次 DB 查询)

$users = User::with('profile')->get();

...

@foreach ($users as $user)
    {{ $user->profile->name }}
@endforeach

集中处理数据

例子

$article = new Article;
$article->title = $request->title;
$article->content = $request->content;
$article->verified = $request->verified;
// Add category to article
$article->category_id = $category->id;
$article->save();

更优的写法

$category->article()->create($request->validated());

代码写法纠正

判断数据库插入结果

Laravel 踩坑记录 + 小本本

上图【判断创建结果】代码是无用的,因为如果数据库插入记录失败,就会抛出异常,不会继续往下执行!

包自动发现机制

记录

语言拓展包(https://github.com/overtrue/laravel-lang)无法包自动发现

原因

包自动发现需要双向支持:

  • Laravel 的 composer.json 需要 require 拓展包
  • 拓展包需要在自己的 composer.json 中告诉 Laravel,自己有哪些服务提供者和别名

Laravel 踩坑记录 + 小本本

而语言拓展包没有告诉 Laravel,自己有哪些服务提供者和别名

 


天蓝, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Laravel 踩坑记录 + 小本本
喜欢 (0)
[[email protected]]
分享 (0)

您必须 登录 才能发表评论!