专栏首页前端导学laravel5.2的新功能

laravel5.2的新功能

上一节课我们学了laravel5.3的新特性 https://my.oschina.net/lilugirl2005/blog/787478

这节课主要讲一些laravel5.2的新特性在laravel5.3的基础上演示

我们还是以10yue.live网站为例

laravel5.2的新功能

路由模型绑定

实例:routes/web.php页面中添加路由

Route::get('/user/{user}',function(\App\User $user){
   return $user;
});

Route::get('/post/{post}',function(\App\Post $post){
   return $post;
});

访问 https://10yue.live/post/3 或者 https://10yue.live/user/4 测试

那如果我想通过用户表的username字段访问用户信息改如何做呢?

做到这点请确保username是不重复的值

首先我需要在user表里增加一个username的字段

修改/database/migrations的用户表文件 增加username字段

相应的修改/database/factories/ModelFactory.php文件 $faker->userName可以生成不重复的假用户名

清空数据库 重新执行数据结构生成命令 php artisan migrate:refresh

(如果是生产环境的数据,请勿执行,因为所有数据会被清空)

执行tinker命令生成10条用户数据

修改app/Providers/RouteServiceProvider.php文件 添加如下代码

且routes/web.php代码改为

在数据库中随便查找一个username

在浏览器键入地址https://10yue.live/user/alarkin 测试成功!

访问次数限制

举例 修改routes/web.php 的post路由 为其添加middleware 这个设置默认限制路由访问次数一分钟不超过60次

我们可以用httpie这个工具模拟http请求 ,首先要下载安装httpie

mac下安装httpie的命令是 brew install httpie

安装成功后在本地mac机器上敲入http命令 访问http://10yue.live/post/1看看

通过审查元素我们也可以分析到这个页面的头部信息

刷新页面会看到 X-RateLimit-Remaining的值一直在变

修改routes/web.php 的post路由 将一分钟的访问次数限制改为3

在浏览器上刷新三次页面http://10yue.live/post/1 会发现页面显示To Many Attempts

访问限制源码解读

观察 app/Http/Kernal.php文件

按图索骥观察 vendor/laravel/framework/src/Illuminate/Routing/Middleware/ThrottleRequests.php文件

这里的key是根据客户端请求的ip,方式,域名等信息加密后形成一个唯一值

两分钟实现注册登录

只要简单的执行 php artisan make:auth 即可,如果之前没有migrate 数据库,需要先migrate一下

然后你会发现resources/views文件夹下生成了一些试图文件夹和文件

同时在app/Http/Controllers文件夹下页生成了一些文件包和文件

观察代码 app/Http/Controllers/HomeController.php

红色区域的代码表明 home路径下的页面需要登录才能访问

在浏览器中浏览页面https://10yue.live/home 会看到页面跳转到登录页面

进入注册页面 https://10yue.live/register 注册一个账户尝试登录看看

登录后的样子

尝试使用忘记密码功能发送邮件,根据上一节课的配置 ,邮件将发送到mailtrap.io账号里

登录mailtrap.io看看 果然发现了邮件

点击重置密码按钮 尝试一下修改密码

这时候如果尝试将邮件发送到log中,只要修改一下.env配置 将MAIL_DRIVER改为log

重启服务器 再次发送忘记密码请求

则可以在/storage/logs/larave.log 网站日志中看到邮件内容 (当然日志文件中还记录的所有的其他的日志内容)

laravel还自带了用户访问限制功能,如果一个用户连续错密码超过5次,系统将暂时拒绝该用户登录

最后 我们输入php artisan route:list命令 会看到系统自动生成了一些路由

然后查看代码auth的路由定义代码 vendor/laravel/framework/src/Illuminate//Routing/Router.php

全局变量errors

在首页试图 resources/views/welcome.blade.php文件中添加代码 {{dd($errors)}} 可以通过变量$errors获取全局的错误信息

多表认证登录

执行下面的命令生成admin表

php artisan make:migration create_admin_table --create=admin

修改admin表的migration文件 database/migrations/2016_12_01_061057_create_admin_table.php

添加如下字段

执行生成表命令

php artisan migrate

复制Http/Controllers/Auth文件夹 重命名为AdminAuth

修改Http/Controllers/AdminAuth下的所有文件的命名空间为

namespace App\Http\Controllers\AdminAuth;

修改Http/Controllers/AdminAuth/LoginController.php文件的redirectto属性为 /admin

增加属性guard 值为admin

  protected $redirectTo = '/admin';
  protected $guard='admin';   //与表名一致

且删除红框部分的代码

添加两个新方法

  public function showLoginForm(){
      return view('admin.auth.login');
    }

用同样的方式修改 Http/Controllers/AdminAuth/RegisterController.php

namespace App\Http\Controllers\AdminAuth;

use App\Admin;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\RegistersUsers;

class RegisterController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Register Controller
    |--------------------------------------------------------------------------
    |
    | This controller handles the registration of new users as well as their
    | validation and creation. By default this controller uses a trait to
    | provide this functionality without requiring any additional code.
    |
    */

    use RegistersUsers;

    /**
     * Where to redirect users after login / registration.
     *
     * @var string
     */
    protected $redirectTo = '/admin';
    protected $guard='admin';   //与表名一致

    public function showRegistrationForm(){
      return view('admin.auth.register');
    }

    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    protected function validator(array $data)
    {
        return Validator::make($data, [
            'name' => 'required|max:255',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|min:6|confirmed',
        ]);
    }

    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return User
     */
    protected function create(array $data)
    {
        return Admin::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
        ]);
    }
}

在resources/views文件夹下创建admin文件夹 ,将resources/views/auth复制一份到resources/views/admin文件夹 ,修改一些明显的链接地址

在routes/web.php中添加路由

Route::get('/admin/login',  'AdminAuth\LoginController@showLoginForm');
Route::post('/admin/login','AdminAuth\LoginController@login');
Route::get('/admin/logout',  'AdminAuth\LoginController@logout');

Route::get('admin/register', 'AdminAuth\RegisterController@showRegistrationForm');
Route::post('admin/register','AdminAuth\RegisterController@register');

Route::get('/admin','AdminController@index');

通过命令生成AdminCntroller文件

php artisan make:controller AdminController

为app/Http/Controller/AdminController.php文件添加一个简单的index方法

  public function index(){
      return 'admin page';
    }

用命令生成Admin的model文件

php artisan make:model Admin

编辑这个model文件 app/Admin.php

修改config/auth.php 文件 ,添加红框中的代码

用命令为admin生成一个middleware

php artisan make:middleware RedirectIfNotAdmin

修改这个新生成的middleware文件 app/Http/Middleware/RedirectIfNotAdmin.php

修改app/Http/Kernel.php文件

然后就可以在app/Http/Controller/AdminController.php文件中使用这个middleware了

队列

先设置队列的驱动 修改配置文件.env

执行命令 创建队列表

 php artisan queue:table
php artisan migrate

执行命令 创建一个job

php artisan make:job SendReminderEmail

在app/Jobs文件夹下会生成一个 SendReminderEmail.php文件

修改app/Jobs/SendReminderEmail.php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class SendReminderEmail implements ShouldQueue
{
    use InteractsWithQueue, Queueable, SerializesModels;


    public $user;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(User $user)
    {
        $this->user=$user;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        \Log::info('send remind email to'.$this->user->email);
    }
}

新增一个controller

php artisan make:controller UsersController

为app/Http/Controllers/UsersController.php 添加store方法

  public function store(){
      $users=\App\User::where('id','>',5)->get();

      foreach($users as $user){
        $this->dispatch(new \App\Jobs\SendReminderEmail($user));
      }

      return 'Done';
    }

在routes/web.php 添加路由

Route::get('job','UsersController@store');

在浏览器中执行 https://10yue.live/job

然后数据库生成了对应的任务列表

执行命令 php artisan queue:work 就可以执行队列中的任务

任务执行后会在日志文件storage/logs/laravel.log中留下记录

使用 Beanstalkd 实现队列

先要在服务器上安装beanstalkd 执行命令

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

推荐阅读

  • 日访问百万级微信小程序优化技巧总结

    之前负责的锡慧在线小程序是一款公益性质在线教育类小程序,因疫情影响导致流量暴增,日访问过百万

    薛定喵君
    小程序微信缓存RedisCanvas
  • Spiral: 一个性能卓越的PHP/Golang混合开发框架

    春节期间,了解到一个“全新”的 WEB 开发框架:Spiral, 最开始引起我的兴趣是从同事那里听说了 RoadRunner. 然后去了解 RoadRunner 的时候看到了 Spiral. 之所以把“全新”用双引号引起来,是因为这个框架其实从 2013 年起就在它的开发团队以及一些企业客户中应用了,经历了各种实际应用场景的考验,Spiral 的功能及其丰富,性能与当前主流的 PHP 框架相比也相当出众。但这个框架源自俄国,在国内不算知名,他们团队开始重视和梳理开源,也应该是才开始的事情。

    小李刀刀
    PHPGoSymfony
  • kubernetes系列教程(二十)prometheus提供完备监控系统

    上一个章节中kubernetes系列教程(十九)使用metric-server让HPA弹性伸缩愉快运行介绍了在kubernetes中的监控架构,通过安装和使用metric-server提供kubernetes中的核心监控指标:提供node节点和pod容器CPU和内存的监控能力,核心监控指标提供的监控维度和指标相对有限,需要更好的扩展监控能力,需要使用自定义监控来实现,本文介绍prometheus提供更更加丰富的自定义监控能力。

    HappyLau谈云计算
    Kubernetes容器微服务云监控
  • 如何将设计思维应用到精益初创公司的软件开发

    我们所说的设计思维,是指由 IDEO 公司的 Tim Brown 提出,并且正在改变全世界组织的设计思维,简称 DT。(译者注:IDDO,当代最具影响力的设计公司之一)

    Aceyclee
    Serverless无服务器云函数
  • InnoDB 事务加锁分析

    一般大家对数据库事务的了解可能停留在事务的ACID特性以及事务4种不同的隔离级别层面上,而对于事务 4 种不同隔离级别如何实现了解相对较少。

    2020labs小助手
    MySQLSQL数据库MVCMVCC
  • FutureTask 核心源码解析

    研究源码,一般我们都从整体以及实例先入手,再研究细节,不至于一开始就“深陷其中而"当局者迷".

    JavaEdge
    HTTPJava
  • 200行代码落地人脸识别开锁应用

    2019年国庆,帮朋友实现了一个人脸识别进行开锁的功能,用在他的真人实景游戏业务中。几个月来运行稳定,体验良好,借着这个春节宅家的时间,整理一下这个应用的实现过程。

    高树磊
    人脸识别图像处理
  • 滑动验证码攻防对抗

        在业务安全领域,滑动验证码已经是国内继,传统字符型验证码之后的标配。众所周知,打码平台和机器学习这两种绕过验证码的方式,已经是攻击者很主流的思路,不再阐述。冷渗透介绍的是一个冷门的绕过思路和防御方案。这些积累,均来自于实战之中,希望有用。

    周俊辉
    HTTP网络安全安全网站
  • 程序员进阶必读,万字总结Mysql优化精华篇

    price decimal(8,2)有2位小数的定点数,定点数支持很大的数(甚至是超过int,bigint存储范围的数)

    程序员内点事
    全文检索缓存SQL数据库Python
  • 运维转型 | 运维人不再只是“救火英雄”

    各行各业都开启了数字化转型的进程,运维团队在这种时代的浪潮中又该何去何从?我在帮助一些企业落地了运维技术平台之后,开始反思这个问题,并将所思所想整理成本篇文章。

    嘉为科技
    企业运维自动化云计算

扫码关注云+社区

领取腾讯云代金券