Laravel 不完全手册 多数人都会遇到的问题
路由 Route
-
资源路由写法
// 默认 Route::resource('post','PostController');
// 资源路由中只用几种方法 Route::resource('post', 'PostController', ['only' => ['index', 'edit', 'create', 'show', 'store']]);
// 资源路由排除某个方法 Route::resource('post', 'PostController', ['except' => ['delete']]);
方法 路径 动作 路由名称 GET /post index post.index GET /post/create create post.create POST /post store post.store GET /post/{post} show post.show GET /post/{post}/edit edit post.edit PUT/PATCH /post/{post} update post.update DELETE /post/{post} destroy post.destroy -
web路由、API路由、console路由是分开的!分开的!分开的!
-
api 路由 默认1分钟限制60次请求,在App\Http\Kernel.php设置
protected $middlewareGroups = [ 'web' => [ ... ], 'api' => [ 'throttle:60,1', // 改这里, 60改成120,那就是120次每分钟 'bindings', ], ];
-
Request 获取路由url参数 例如有一个user资源路由,当访问编缉user页面时,url 链接如果是 www.demo.com/admin/user/10/edit 当你需要获取“10”这参数时,可以用以下方法获取编缉ID
Request::route('user') // 如果 参数 'user' 不正确,你也可以直接打印查看当前路由信息 dd(Request::route());
Route {#232 ▼ +uri: "admin/users/{user}/edit" // 这里是当前路由的uri信息 括号中的内容就是你需要的参数 +methods: array:2 [▶] +action: array:7 [▶] +isFallback: false +controller: UserController {#471 ▶} +defaults: [] +wheres: [] +parameters: array:1 [▶] +parameterNames: array:1 [▶] +computedMiddleware: array:2 [▶] +compiled: CompiledRoute {#524 ▶} #router: Router {#25 ▶} #container: Application {#2 ▶} }
请求
-
X-CSRF-Token
Form 表单里记得要加
{{ csrf_token() }}
如果是ajax请求
// blade header中添加 meta <meta name="csrf-token" content="{{ csrf_token() }}">
// ajax设置 $.ajaxSetup({ headers: { 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') } });
或者设置一个JS变量
<script> function LA() {} LA.token = "{{ csrf_token() }}"; </script>
// ajax设置_token参数 $.ajax({ url: '/path/to/file', type: 'default GET (Other values: POST)', dataType: 'default: Intelligent Guess (Other values: xml, json, script, or html)', data: { _token: LA.token }, })
通常我们需要将这种类型的路由放到文件 routes/web.php 之外,比如 routes/api.php。不过,如果必须要加到 routes/web.php 中的话,你也可以在 VerifyCsrfToken 中间件中将要排除的 URL 添加到 $except 属性数组:
<?php namespace App\Http\Middleware; use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware; class VerifyCsrfToken extends Middleware { /** * 从 CSRF 验证中排除的 URL * * @var array */ protected $except = [ 'alipay/*', 'http://example.com/foo/bar', 'http://example.com/foo/*', ]; }
-
Url
blade中获取url信息
// 获取不带请求字符串的当前 URL... echo url()->current(); // 获取包含请求字符串的当前 URL... echo url()->full(); // 获取上一个请求的完整 URL... echo url()->previous();
在php中使用Url门面方法实现上述功能
use Illuminate\Support\Facades\URL; echo URL::current();
分页设置url上的请求参数
<div class="hide-if-no-paging text-center"> <div>共 {{ $list->total() }} 条数据</div> <div class="paging" id="pagination"> {{ $list->appends(Request::all())->links() }} </div> </div>
数据迁移 Migrations
-
Schema创建表时,如何设置字符集
Schema::create('table_name', function (Blueprint $table) { $table->engine = 'InnoDB'; $table->charset = 'utf8'; $table->collation = 'utf8_general_ci'; });
-
Schema 创建字段时,int 字段默认长茺写法错误:不管是哪种类型的 int 字段,默认长度不要这样写
$table->tinyInteger('status',1); // 会变成生成自增主键 // 默认系统函数的参数2是自增主键的设置,并不是默认长度,只能设置无符号或有符号 public function tinyInteger($column, $autoIncrement = false, $unsigned = false)
数据库 DB
- 使用
LOAD DATA IN FILE
命令,需要使用不预处理进接执行命令DB::unprepared("LOAD DATA LOCAL INFILE ...")
Eloquent ORM
-
Eloquent ORM 执行类似数据库原值+1的操作
update `table` set `column` = `column`+1 where `id` = 1
如果使用DB方法操作没问题,但Eloquent ORM怎么操作,一开始我也是蒙逼的,其实变通一下可以用Eloquent ORM进行如下操作
$result = YourModel::firstOrCreate(['id' => 1]); $result->column+1; $result->save();
-
Eloquent ORM更新数据或插入数据时,字段一直都不变,Eloquent模型中要添加 protected $fillable 可赋值字段数组
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Post extends Model { protected $table = 'post'; // 如果表名posts,这里可以不给 $table 赋值 protected $fillable = [ //可以被赋值的字段 // 这里一定要加上字段名,例如没加 tags字段,那在更新时怎么也更新不了tags字段的 'title', 'content', 'author', 'created_at', 'updated_at', ];
视图 blade
- 抛出错误代码页面
// 使用laravel内置函数 abort(404,'页面未找到'); // 修改resources/views/errors/404.blade.php @extends('errors::layout') @section('title') 提示 @stop @section('message', $exception->getMessage()) // 把这里原先固定值的字符串改成异常信息的变量,即可使用abort参数2中的值
如果需要使用其它错误代码,需先创建错误码对应的blade,再使用
abort()
函数,如:先创建403.blade.php
, 然后再使用abort(403,'资源不可用');