Laravel 不完全手册 多数人都会遇到的问题

阅读 (4132)
Laravel 5.4.x 在使用中遇到的问题,很多问题都有解。不断更新中……

路由 Route

  1. 资源路由写法

    // 默认
    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
  2. web路由、API路由、console路由是分开的!分开的!分开的!

  3. api 路由 默认1分钟限制60次请求,在App\Http\Kernel.php设置

    protected $middlewareGroups = [
       'web' => [
            ...
       ],
    
       'api' => [
           'throttle:60,1', // 改这里, 60改成120,那就是120次每分钟
           'bindings',
       ],
    ];

     

  4. 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 ▶}
    }

请求

  1. 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/*',
        ];
    }
  2. 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

  1. Schema创建表时,如何设置字符集

    Schema::create('table_name', function (Blueprint $table) {
      $table->engine = 'InnoDB';
      $table->charset = 'utf8';
      $table->collation = 'utf8_general_ci';
    });
  2. Schema 创建字段时,int 字段默认长茺写法错误:不管是哪种类型的 int 字段,默认长度不要这样写

    $table->tinyInteger('status',1); // 会变成生成自增主键
    
    // 默认系统函数的参数2是自增主键的设置,并不是默认长度,只能设置无符号或有符号
    public function tinyInteger($column, $autoIncrement = false, $unsigned = false)

     

数据库 DB 

  1. 使用LOAD DATA IN FILE命令,需要使用不预处理进接执行命令
    DB::unprepared("LOAD DATA LOCAL INFILE ...")

Eloquent ORM

  1. 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();
  2. 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

  1. 抛出错误代码页面
    // 使用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,'资源不可用');

更新于:2018-06-29 09:54:39
返回顶部