你能想象开发了半个来月的项目崩溃后那种心情吗?要我说,就像失恋一样痛苦。当看到朋友圈,@孙大圣一杯茶毁了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(){
//prefix是admin,所以匹配包含 "你的域名/admin/login" 的 URL
//namespace为Admin,会自动寻找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">×</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,谢谢大家的阅读!祝每天开心~
版权声明:本文为博主原创文章,未经博主允许不得转载。
微信赞赏
支付宝赞赏
发表评论