Welcome to

Mr.Xiong

Home / Laravel / Laravel 框架实战

Laravel 框架实战

前言:

你能想象开发了半个来月的项目崩溃后那种心情吗?要我说,就像失恋一样痛苦。当看到朋友圈,@孙大圣一杯茶毁了1W多的外星人,再加上重新开发效率极高的那种快感,我又找到了恋爱的感觉……

中文文档:

https://laravel-china.org/docs/laravel/5.5

完整流程:

http://www.xiongweiyang.com/laravel实战流程.html

一、安装与配置

a)安装框架

配置 composer.json,修改为中国镜像,或者全局配置好。

{
    "repositories": {
        "packagist": {
            "type": "composer",
            "url": "https://packagist.phpcomposer.com"
        }
    }
}

提前配置好国内镜像,否则很慢…

composer create-project --prefer-dist laravel/laravel video

b)安装提示插件

#打开packagist.org搜索laravel-ide-helper

#提前配置好中国镜像
composer require barryvdh/laravel-ide-helper

#config/app.php中,找到providers在最后一行增加配置项
Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class,

#然后再执行
php artisan ide-helper:generate

#重启编辑器,找到有一个路由文件Config::试试

c)配置数据库

mysql 版本最好是 5.7,找到 .env ,然后修改配置。

d)数据迁移

#创建表的数据迁移文件
php artisan make:migration create_users_table --create=users

#执行迁移,如果版本过低就会报错
php artisan migrate

更改 config/database.php , 把

'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',

修改成

'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',

就可以支持mysql低版本了。

二、模型/迁移/填充操作(后台用户表为例)

a)模型配置

执行以下命令创建模型,如果加上 -m 代表一同创建数据迁移文件。 创建完毕之后在 app 目录会有一个 Model 目录并里面就会有模型。 database/migrations 也会多一个数据迁移文件。

php artisan make:model Model/Admin -m

b)数据迁移

默认的 users 作为前台用户表,我们使用 admins 作为后台用户表,在迁移文件中,增加 admins 字段(username 非重,password)。

执行数据迁移:

php artisan migrate

c)数据填充

找到 database/factories/ModelFactory.php 文件 复制已有代码改成:

$factory->define(\App\Model\Admin::class, function (Faker $faker) {
	static $password;//$password第一次为null,再一次就有值了,之后密码都一样。

	return [
		'username' => $faker->name,
		'password' => $password ?: $password = bcrypt('admin888'),
	];
});

接着在命令行执行 tinker 命令来灌数据。

php artisan tinker

再在命令行输入,创建3条用户表的数据。

factory(\App\Model\Admin::class,3)->create();

三、控制器处理

在 app/Http/Controllers 生成控制器。

php artisan make:controller Admin/EntryController

四、路由处理

在控制器中建立一个 login 方法,然后需要设置路由访问, 不能直接通过 get 参数的形式访问。laravel 3 有,laravel 4 取消了这样的模式 找到 routes/web.php 建立路由。

Route::get('/login', 'Admin\EntryController@login');

我们也可以把路由分组,路由组允许共享路由属性,例如中间件和命名空间等,我们没有必要为每个路由单独设置共有属性,共有属性会以数组的形式放到 Route::group 方法的第一个参数中。

Route::group(
['prefix'=>'admin','namespace'=>'Admin'],function(){
	//prefixadmin,所以匹配包含 "你的域名/admin/login"  URL
	//namespaceAdmin,会自动寻找App\Http\Controllers\Admin下面的EntryController
	Route::get('/login','EntryController@login')
});

也可以在 web.php 写入,把路由按照文件夹分开。

include __DIR__ . '/admin/web.php';

如果 get 和 post 同时请求一个方法可以使用 match 。

Route::match( ['get','post'],'/login', 'EntryController@login' );

五、定义自己的函数和类

在 app 目录下面建立 Libraries 目录,建立 helper.php 写入 p函数,更改 composer.json 文件,在 autoload 选项中加入如下代码,再执行 composer dump 。

"files": [
    "app/Libraries/helper.php"
]

六、载入模板

默认视图位置 resource/views/ ,载入模板可以写为:

return view('welcome');

或者

return \View::make('welcome');

如果要建立文件夹 views/admin/user/login.blade.php ,那么需要:

return view('admin.user.login');

可将 Mr.Xiong 的后台模板作为我们项目所用,静态资源放入到 public 目录,可使用 {{asset(“静态资源”)}} 引入静态资源,asset 函数使用当前请求的协议( HTTP 或 HTTPS )为资源文件生成 URL。表单提交需要在 form 元素中加:

{{csrf_field()}}

七、登录处理

使用 Laravel 提供的用户验证,更改 config/auth.php 文件。

//增加admin守卫(guards),驱动为session,交给提供者(provider)的admins处理,然后再找到App\Model\Admin模型,模型需要继承Illuminate\Foundation\Auth\User
'guards' => [
    'admin' => [
        'driver'   => 'session',
        'provider' => 'admins',
    ],
    'web'   => [
        'driver'   => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver'   => 'token',
        'provider' => 'users',
    ],
],

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model'  => App\User::class,
    ],
    'admins' => [
        'driver' => 'eloquent',
        'model'  => App\Model\Admin::class,
    ]
],

Admin 模型:

<?php

namespace App\Model;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;
class Admin extends Authenticatable
{
    //
}

在控制器(先判断是否为 post 提交):

//找到admin门卫,指定的模型 去读数据 进行认证用户
$status = Auth::guard('admin')->attempt([
    'username'=>Request::input('username'),
    'password'=>Request::input('password'),
]);

如果登陆成功或者登陆失败:

if($status){
    //跳转到后台首页,注意写路由
    return redirect('/admin/index');
}
//重新跳转回来,并且分配闪存属性
return redirect('/admin/login')->with('error','用户名或者密码错误');

页面代码:

@if(session('error'))
    <div class="alert alert-danger">
        {{session('error')}}
    </div>
@endif

通过中间件来验证登陆 app/Http/Middleware :

php artisan make:middleware LoginMiddleware

在中间件中写入检测是否登陆:

if(!Auth::guard('admin')->check()){
    return redirect('/admin/login');
}

写入配置项 app/Http/Kernel.php 的 $routeMiddleware :

'login.auth'=>LoginMiddleware::class

在 Entry 控制器构造方法调用中间件,除了登陆方法:

public function __construct() {
    $this->middleware('login.auth')->except(['login']);
}

八、后台视图处理

模板继承

resources/views/admin/entry 新建 index.blade.php ,让后台首页方法载入。

return view('admin.entry.index')

然后建立 resources/views/admin/layout 文件夹放入继承的父模板 master.blade.php 找到不是共用的部分,写入占位符:

@yield('content')

在 index.blade.php 写入以下代码:

@extends('admin.layout.master')
@section('content')
中间内容
@endsection

九、退出处理

构建控制器方法 logout。

Auth::guard('admin')->logout();
return redirect('/admin/login');

更改令牌 app/Model/Admin.php 。(类似于勾住七天免登陆 勾选了令牌会自动进行登录 这里没有勾选给空字符串避免报错)

 protected $rememberTokenName = '';

十、获取用户信息

 //前台页面中
 {{Auth::guard('admin')->user()->username}}

十一、更改密码

a)创建控制器

配置路由指向控制器方法 changePassword ,更改父模板 a链接,构建修改密码页面。

php artisan make:controller Admin/MyController
public function password(){
    return view('admin.my.password');
}

在 password.blade.php 页面的 form 表单指向到 /admin/changePassword ,别忘记配置路由。

b)表单验证

创建表单验证,在 app/Http/Requests 会生成 PasswordPost.php 文件。这样的验证时单写一个类,好处就是在任何控制器中需要处理直接引入改类即可,类似于 Tp5 中的验证器。

php artisan make:request PasswordPost

c)authorize 方法

表单的请求类内包含了 authorize 方法。在这个方法中,你可以确认用户是否真的通过了授权,以便更新指定数据,比如是否登陆?如果自己处理验证,那么返回 true 。

public function authorize()
{
    return true;
}

d)rules方法

rules方法是规则,验证字段值必须和 foo_confirmation 的字段值一致。例如,如果要验证的字段是 password ,就必须和输入数据里的 password_confirmation 的值保持一致。

public function rules() {
    return [
        'old_password'          => 'sometimes|required',
        'password'              => 'sometimes|required|confirmed',
        'password_confirmation' => 'sometimes|required',
    ];
}

在 password.blade.php 页面显示错误消息:

@if (count($errors) > 0)
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

在 app/Http/Controllers/Admin/MyController::changePassword 方法中,注入验证对象。

public function changePassword(PasswordPost $request){
    $model = Auth::guard('admin')->user();
    $model->password = bcrypt($request->input('password'));
    $model->save();
}

d)改成亲切的中文错误提示

在 app/Http/Requests/PasswordPost.php 你可以通过重写表单请求的 messages 方法来自定义错误消息。此方法必须返回一个数组,其中含有成对的属性或规则以及对应的错误消息。

public function messages()
{
  return [
        'old_password.required'          => '原始密码不能为空',
        'old_password.check_password'    => '原始密码输入错误',
        'password.required'              => '新密码不能为空',
        'password.confirmed'             => '两次密码不一致',
        'password_confirmation.required' => '确认密码不能为空'
    ];
}

验证原密码是否正确,新建方法 passwordValidator ,然后在 rules 调用。

use Validator;
use Hash;
use Auth;
public function passwordValidator(){
    Validator::extend('check_password', function ($attribute, $value, $parameters, $validator) {
        return Hash::check($value,Auth::guard('admin')->user()->password);
    });
}

rule 调用,并且制定 check_password 规则,别忘记在messages增加提示信息。

public function rules() {
    $this->passwordValidator();
    return [
        'old_password'          => 'sometimes|required|check_password',
        'password'              => 'sometimes|required|confirmed',
        'password_confirmation' => 'sometimes|required',
    ];
}

十二、消息提示

在 packagist.org 搜索 flash 组件,执行安装。

composer require laracasts/flash

把以下代码放在 config/app.php 的 provider 配置下。

Laracasts\Flash\FlashServiceProvider::class,

在 master.blade.php 文件尾部写入:

@include('flash::message')
<script>
    require(['bootstrap'],function($){
        $('#flash-overlay-modal').modal();
        setTimeout(function(){
            $('#flash-overlay-modal').modal('hide');

        },2000)
    });
</script>

生成消息提示模板,也可以直接更改模板,会在 resources/views 生成 vendor 目录。

php artisan vendor:publish --provider="Laracasts\Flash\FlashServiceProvider"

更改模板 modal.blade.php 代码如下:

<div id="flash-overlay-modal" class="modal fade {{ $modalClass or '' }}">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
                {{--<h4 class="modal-title">{{ $title }}</h4>--}}
                <h4 class="modal-title">友情提示</h4>
            </div>
            <div class="modal-body">
                <div class="row">
                    <div class="col-sm-2">
                        <i class="fa fa-info-circle fa-4x"></i>
                    </div>
                    <div class="col-sm-9">
                        {!! $body !!}
                    </div>
                </div>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
            </div>
        </div>
    </div>
</div>
<script>
    setTimeout(function () {
        $('#flash-overlay-modal').modal('hide');
    },3000)
</script>

在控制器方法中使用 flash 方法。

public function changePassword(PasswordPost $request){
    if($request->isMethod('post')){
        $model = Auth::guard('admin')->user();
        $model->password = bcrypt($request->input('password'));
        $model->save();
        flash()->overlay('密码修改成功', 'Mr.Xiong-友情提示');
    }
    return view('admin.my.changePassword');
}

 

未完待续……
Finally,谢谢大家的阅读!祝每天开心~
版权声明:本文为博主原创文章,未经博主允许不得转载。

赞赏

微信赞赏支付宝赞赏

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

雄心勃勃但谦卑温逊!

>> <<