laravel5.8使用


Laravel配置nginx伪静态

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

使用faker生成测试数据

前提是创建好数据迁移文件

php artisan make:model Models/User -m

使用make:model XXX -m来创建模型和迁移文件比较方便

-m参数代表migration,顺带创建迁移文件

  1. 修改faker本地化, config/app.php文件中 faker_locate=zh_CN
  2. 创建数据工厂 php artisan make:factory UserFactory(举例) ,定义填充的数据格式
  3. 创建填充文件:php artisan make:seeder UserSeeder(举例)factory(模型::class, 数量)->create();
  4. DatabaseSeeder文件中添加一个调度$this->call(XXXXSeeder::class)
  5. 执行填充:php artisan db:seed

实现登录功能

使用laravel提供的验证 auth()方法进行用户登录验证

  • attempt()验证账号和密码是否正确,返回值:true/false 字段为username、password
  • check()验证用户是否已经登录
  • user()登录成功返回登录用户的模型对象
  1. 修改用户模型,让继承的类更改

    namespace App\Models;
    
    // 继承可以使用auth登录的模型类
    use Illuminate\Foundation\Auth\User as AuthUser;
    
    class User extends AuthUser{}
  2. 修改config/auth.php提供模型类, App\Models\User::class

  3. 实现登录:attempt()

    1. csrf
    2. 表单验证
    3. 登录
    4. 成功跳转,失败重新登录

中间件

  • 全局中间件
  • 路由中间件

创建中间件: php artisan make:middleware 中间件名称

中间件存储地址:App\Http\Middleware\你的中间件名称

创建完了,不会立即生效,需要注册中间件

找到Kernel.php文件进行注册中间件

在全局中间件数组里进行注册,整个网站会立即生效,不适合一些用于特定验证身份的中间件注册。

所以一般验证身份的中间件一般选择路由中间件进行注册

路由中间件数组名称为:$routeMiddleware

方式为:别名 => 类路径

注册完了之后,这个时候还是未生效的,需要到路由中去进行绑定

  • 方式1:直接在一条路由后面添加,这样只对这一条路由进行验证

    Route::get('welcome', 'IndexController@welcome')->name('admin.welcome')->middleware(['ckadmin']);   // ckadmin  我取的别名
  • 方式2:使用路由分组里进行绑定

    // 后台需要验证才能通过
    Route::group(['middleware' => ['ckadmin']], function () {
            // 退出
            Route::get('logout', 'IndexController@logout')->name('admin.logout');
            // 后台首页显示
            Route::get('index', 'IndexController@index')->name('admin.index');
            // 欢迎页面显示   绑定路由中间件
            Route::get('welcome', 'IndexController@welcome')->name('admin.welcome');
        });
  • 方式3:在控制器中绑定

    class LoginController extends Controller
    {
        /**
         * 构造方法
         * LoginController constructor.
         */
        public function __construct()
        {
            $this->middleware(['ckadmin']);
        }
    }

中间件传参

class LoginController extends Controller
{
    /**
     * 构造方法
     * LoginController constructor.
     */
    public function __construct()
    {
        $this->middleware(['ckadmin:login']);
    }
}
namespace App\Http\Middleware;

use Closure;

class CheckAdminLogin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param $param 自己加的或自定义的参数来接收中间件传值,默认不存在,自己写的
     * @return mixed
     */
    public function handle($request, Closure $next, $param)
    {
        dd($param);
        return $next($request);
    }
}

使用中间件进行登录验证

namespace App\Http\Middleware;

use Closure;

class CheckAdminLogin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // 用户是否登录检查
        if (!auth()->check()) {
            return redirect(route('admin.login'))->withErrors(['errors' => '请登录']);
        }

        // 如果没有停止则向后执行
        return $next($request);
    }
}

自定义验证规则

自定义手机号码验证规则

AppServiceProvider.php中进行定义,在加载控制器之前进行定义

public function boot()
    {
        // 自定义验证规则
        Validator::extend(
            'phone',
            function ($attribute, $value, $parameters, $validator) {
                // 返回true/false
                $reg1 = '/^\+86-1[3-9]\d{9}$/';
                $reg2 = '/^1[3-9]\d{9}$/';

                return preg_match($reg1, $value) || preg_match($reg2, $value);
            }
        );
    }

控制器使用

/**
     * 添加用户处理
     * @param Request $request
     * @throws \Illuminate\Validation\ValidationException
     */
    public function store(Request $request)
    {
        $this->validate(
            $request,
            [
                'username' => 'required',
                'password' => 'required|confirmed',
                'truename' => 'required',
                'phone'    => 'nullable|phone',
            ]
        );

        dd($request->all());
    }

Laravel软删除操作

restful方式的请求方式:delete

路由配置

Route::delete('user/del/{id}', 'UserController@del')->name('admin.user.del');

前端写法

注意:

这里进行了判断,如果当前用户id不等于这个循环之后的id,才进行显示删除操作

防止自己删自己这种误区出现

@if (auth()->id() != $item->id)
   <a title="删除" href="{{ route('admin.user.del', ['id' => $item->id]) }}" class="ml-5 delbtn">删除</a>
@endif
// 生成一个token csrf
    const _token = "{{ csrf_token() }}";
    // 给删除按钮绑定事件
    $('.delbtn').click(function () {
        // 得到请求的url地址
        let url = $(this).attr('href');
        // 发起delete请求
        $.ajax({
            url: url,
            type: 'DELETE',
            data: {_token},
            dataType: 'json'
        }).then(({status, msg}) => {
            if (status == 0) {
                // 设置先提示在删除
                layer.msg(msg, {time: 1000, icon: 1}, () => {
                    // 删除当前行
                    $(this).parents('tr').remove();
                });
            }
        });
        // jquery取消默认事件
        return false;
    });

实现方法

使用软删除注意:

  1. 表中必须有一个软删除标识字段,默认为deleted_at
  2. 模型中引入对应的操作(trait)实现
  3. 模型中指定软删除的标识字段

数据库迁移文件内设置标识字段

// 软删除 生成字段 deleted_at
$table->softDeletes();

模型内引入软删除类

use Illuminate\Database\Eloquent\SoftDeletes;

调用

namespace App\Models;

// 软删除类
use Illuminate\Database\Eloquent\SoftDeletes;
// 继承可以使用auth登录的模型类
use Illuminate\Foundation\Auth\User as AuthUser;

class User extends AuthUser
{
    // 软删除
    use SoftDeletes;

    // 软删除标识字段
    protected $dates = ['deleted_at'];

    // 设置添加的字段
    // 拒绝不添加的字段
    protected $guarded = [];

    // 隐藏字段
    protected $hidden = ['password'];
}

控制器实现方法

 public function del(int $id)
    {
        // 删除
         User::find($id)->delete();
        // 强制删除 在配置了软删除的时候,真实的删除操作
//        User::find($id)->forceDelete();
        return ['status' => 0, 'msg' => '删除成功'];
    }

Larave恢复软删除

  • 查询的时候,默认将所有数据都显示出来

    /**
         * 用户列表
         * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
         */
        public function index()
        {
            // 获取用户分页数据  withTrashed 显示所有的包括已经软删除的
            $data = User::orderBy('id', 'asc')->withTrashed()->paginate($this->page_size);
    
            return view('admin.user.index', compact('data'));
        }
  • 定义路由

    Route::get('user/restore/{id}', 'UserController@restore')->name('admin.user.restore');
  • 前端添加链接

    @if (auth()->id() != $item->id)
        @if ($item->deleted_at != null)
            <a title="删除" href="{{ route('admin.user.restore', ['id' => $item->id]) }}" class="ml-5 btn btn-success btn-sm">还原</a>
        @else
            <a title="删除" href="{{ route('admin.user.del', ['id' => $item->id]) }}" class="ml-5 delbtn btn btn-danger btn-sm">删除</a>
        @endif
    @endif
  • 控制器实现方法

    public function restore(int $id)
    {
        // 还原
        User::onlyTrashed()->where('id', $id)->restore();
    
        return redirect(route('admin.user.index'))->with('success', '已还原用户');
    }

文章作者: Virus
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Virus !
 上一篇
常用的phpstorm快捷键 常用的phpstorm快捷键
常用的快捷键 ctrl+j 插入活动代码提示 ctrl+alt+t 当前位置插入环绕代码 alt+insert 生成代码菜单 ctrl+q 查看代码注释 ctrl+d 复制当前行 ctrl+y 删除当前行 shift+F6 重命名 ctrl
2020-04-27
下一篇 
CentOS虚拟机配置IP地址 CentOS虚拟机配置IP地址
centos虚拟机配置ip地址 查看本机的ip地址 win + R cmd ipconfig 如果是以太网适配器有的就看这个,没有就查看wlan的,还有网关 设置虚拟机网络为桥接模式 重新启动虚拟机 进入虚拟机之后 vi /etc/s
2020-04-20
  目录