需要使用laravel搭建一个后台内容管理系统,但是laravel默认的登陆注册不能满足目前的需求,重置密码的话因为是用在后台,并且不需要发送邮件进行重置,所以默认的重置密码肯定是不行的。

Laravel身为最优雅的PHP框架,很多学习PHP的小伙伴造就对Laravel垂涎欲滴。今天就来实现你的愿望,让我们一起从零开始,利用Laravel实现Web应用最常见的注册和登录功能!所有的课程源码已放在Github上:laravel-start.
Race Start !

目录结构变化

1、首先确定重置密码的路由

首先我们来明确一下我们这个课程需要的东西:

laravel5最先强调的是项目目录结构的变化,与4.2区别还是蛮大的,逐条来说吧。

我们在安装好laravel的时候默认生成的重置密码是在用户未登录的情况下进行的。所以使用原来的控制器是不可行的,并且原有的重置密码,并不需要查看原始密码是否正确,而是通过邮件来进行直接更改密码,所以控制器方法的话,我们也需要重新写个。我们使用
php artisan make:controller UserController
创建一个控制器类,然后创建两条路由 Route::get(‘reset’,
‘UserController@getReset’) 和 Route::post(‘reset’,
‘UserController@postReset’)
。前者是显示一个重置密码的页面get请求,后面是重置密码post请求。

Laravel 4.2
Bootstrap 3.3
Laravel就是我们关心的核心部分,Bootstrap用来快速设置一些前端的CSS样式。

新的目录结构看上去像这样:

2、显示重置密码页

1.安装Laravel

app
    Commands
    Console
    Events
    Handlers
        Commands
        Events
    Http
        Controllers
        Middleware
        Requests
        Kernel.php
        routes.php
    Providers
    Services
bootstrap
config
database
    migrations
    seeds
public
    package
resources
    lang
    views
storage
    cache
    logs
    meta
    sessions
    views
    work
tests

这个使用的是 getReset
这个方法,这个方法只需要显示一个视图所以并没有特别的逻辑

简单说明之后我们来进入下一步,安装Laravel,在这我们是通过Composer来安装,打开命令行终端,执行:

4.2的目录结构:

public function getReset()
{
    return view(‘auth.reset’);
}
3、请求重置密码

复制代码 代码如下:

app
    commands
    config
    controllers
    database
    lang
    models
    start
    storage
    tests
    views
bootstrap
public
对比一下,改变还是比较大的,可以看到
config,database被移动到根目录,lang,views目录被移动到resources目录下,controllers被整合到http目录里,models目录不见了,还有一些新增的目录就略了。

这个使用的是 postReset
这个方法,接收数据的话我们使用两种方法接收传过来的数据都可以:一种是使用
request
的方法接收数据,另外一种是使用 Input::get
的方法获取数据。Request的话需要引入 use Illuminate\Http\Request
类,Input的话需要引入 use Input 类,这里我们选择使用 request 来接收。

cd Sites

App命名空间

4、 验证 规则

Sites就是web应用的根目录,你可以根据需要换成你自己的根目录,然后再执行:

laravel5里还有一个变化,那就是app目录默认加上了一个根命名空间 App ,在
App 下的所有目录、类都应当在该命名空间下,简而言之就是采用了psr4标准。

验证的话,laravel为我们提供了一套验证的规则,使用 validator 的
Validator::make() 方法进行验证

复制代码 代码如下:

HTTP

$data = $request->all(); //接收所有的数据
$rules = [
    ‘oldpassword’=>’required|between:6,20’,
    ‘password’=>’required|between:6,20|confirmed’,
];
$messages = [
    ‘required’ => ‘密码不能为空’,
    ‘between’ => ‘密码必须是6~20位之间’,
    ‘confirmed’ => ‘新密码和确认密码不匹配’
];
$validator = Validator::make($data, $rules, $messages);
$data 接收到从from传过来的数据信息; rules
对接收到的值进行判断,其中数组前面的 oldpassword 和 password
是从前端from接收到的原始密码和新密码的name字段数据进行验证;

composer create-project laravel/laravel laravel

laravel5认为,新的目录结构是目前最好的结构之一,可以让我们的开发更加得心应手,比如http目录:

验证规则的话在手册的验证章节都有,值得注意的是,使用confirmed的话是为了新密码和确认密码进行相同判断,确认密码必须的name值必须是新密码的name值后面加上’_confirmation’,比如新密码的name值为
newpassword 的话,确认密码的name值则必须为 newpassword_confirmation
才可以进行判断 messages 对验证的数据请求,显示什么提示。

laravel就是你的应用目录名,你可以取一个你喜欢的名字。执行上面的命令之后,等一段时间(毕竟在国内,网速是个大坑),安装完以后你会得到这一堆目录:

Http
    Controllers
    Middleware
    Requests
    Kernel.php
    routes.php
Middleware
很陌生,其实它是原来的路由filter的一个升级版,现在不用在filters.php里定义过滤器,取而代之的是在
Middleware
目录中创建类,并在Kernel.php中配置全局还是可选,全局的Middleware在每个请求都会执行,而可选的就相当于原来的filter,可以在路由中使用,也可以在控制器中使用。

然后通过上面的验证,还有个情况是没有验证的,那就是输入的原始密码是否和数据库里的原始密码相同。这里我们可以先把这个用户的信息从数据库里给查出来,然后和输入的原始密码进行比对。这里我们使用
Auth::user() 来获取用户的信息,这个方法需要引入 use Auth; 类,然后通过
Hash::check()
来进行密码判断。判断完以后还有个问题,那就是,如何把错误信息给压入到validator的错误信息里,这里laravel为我们提供了
after 方法:

图片 1

Requests是对核心类Request的扩展,你可以扩展不同的Requests类,添加不同的功能。

$user = Auth::user();
$validator->after(function($validator) use ($oldpassword, $user) {
    if (!\Hash::check($oldpassword, $user->password)) {
//原始密码和数据库里的密码进行比对
        $validator->errors()->add(‘oldpassword’, ‘原密码错误’);
//错误的话显示原始密码错误
    }
});
if ($validator->fails()) {      //判断是否有错误
    return back()->withErrors($validator); 
//重定向页面,并把错误信息存入一次性session里
}
$user->password = bcrypt($password);      
//使用bcrypt函数进行新密码加密
$user->save();      //成功后,保存新密码
这里因为 after 引入了一个PHP的匿名函数,所以我们需要使用 use
关键字把外部数据给传入到匿名函数里(PS:php新特性,闭包和匿名函数)

我们主要操作models和 controllers和 views这三个目录:这就是MVC的构成啊!

可以认为,所有关于http请求有关的处理都在http目录中,比如控制器就是用来接受一个请求并返回的,所以将它放在
Http 目录里合情合理。

在匿名函数里我们引入了一个全局函数所以我们需要在函数前面加 \
(PS:php新特性,命名空间章节,全局命名空间)

2.安装Bootstrap

路由

5、前端显示错误信息

然后再命令行执行:

路由跟以前的区别不大,但是需要注意的当我们指定控制器命名空间时,命名空间不是绝对路径,而是相对于
App\Http\Controllers,举例:

前端显示的话,我们使用 $errors
变量来显示错误,根据官方文档说明,调用的是
Illuminate\Support\MessageBag 的示例,有兴趣的话,可以看下。我们使用
count($errors) > 0 来判断是否有错误,使用 $errors->first()
显示一条错误信息:

复制代码 代码如下:

复制代码 代码如下:

@if(count($errors) > 0)
    <div class=”alert alert-danger display-hide” style=”display:
block;”>
        <button class=”close” data-close=”alert”></button>
        <span>   </span>
    </div>
@endif
可能会有人问,如果我的错误不是显示在固定的一个地方,而是在每个表单的后面显示错误信息的话,这样我们该怎么判断和显示呢?
答案是使用 $errors->has(‘oldpassword’)
来判断有没有这个名称的错误,如果有的话,使用
$errors->first(‘oldpassword’) 显示这条错误:

cd laravel/public/packages

Route::controllers([
    ‘auth’ => ‘Auth\AuthController’,
    ‘password’ => ‘Auth\PasswordController’,
]);

@if( $errors->has(‘oldpassword’) )
    <div class=”alert alert-danger display-hide” style=”display:
block;”>
        <button class=”close” data-close=”alert”></button>
        <span>   </span>
    </div>
@endif
其中oldpassword是每个表单的里的name值,所以在使用 after
方法添加自定义错误的时候 $validator->errors()->add(‘oldpassword’,
‘原密码错误’);
中,oldpassword一定要写对是在哪个表单的错误,这样才能正确的显示。

这里的laravel与上面的应用目录对应,如果你在安装的时候用了其他的名字,请对应换上。来到packages这个目录后安装Bootstrap,直接在命令行执行:

可以在 App/Http/Controllers/Auth 目录下找到对应的类。

6、完成后的示例

复制代码 代码如下:

此外,路由还支持缓存,以提升性能,通过命令行工具

UserController

bower install bootstrap

复制代码 代码如下:

public function getReset()
{
    return view(‘auth.reset’);
}

这个比较快,然后等这个下载完之后你就会得到最新的稳定版Bootstrap。在目录packages目录下的
bower_components/bootstrap/dist/这里就包含了Bootstrap的css,js,fonts这三个我们在开发过程中经常用到的样式文件,js和字体文件。成功后你将看到这个:

php artisan route:cache

public function postReset(Request $request)
{
    $oldpassword = $request->input(‘oldpassword’);
    $password = $request->input(‘password’);
    $data = $request->all();
    $rules = [
        ‘oldpassword’=>’required|between:6,20’,
        ‘password’=>’required|between:6,20|confirmed’,
    ];
    $messages = [
        ‘required’ => ‘密码不能为空’,
        ‘between’ => ‘密码必须是6~20位之间’,
        ‘confirmed’ => ‘新密码和确认密码不匹配’
    ];
    $validator = Validator::make($data, $rules, $messages);
    $user = Auth::user();
    $validator->after(function($validator) use ($oldpassword, $user)
{
        if (!\Hash::check($oldpassword, $user->password)) {
            $validator->errors()->add(‘oldpassword’,
‘原密码错误’);
        }
    });
    if ($validator->fails()) {
        return back()->withErrors($validator);  //返回一次性错误
    }
    $user->password = bcrypt($password);
    $user->save();
    Auth::logout();  //更改完这次密码后,退出这个用户
    return redirect(‘/login’);
}
reset.blade

图片 2

即可轻松生成,也可以通过

<form class=”login-form” action=”” method=”post”>
        <h3 class=”font-green”>修改密码</h3>
        @if($errors->first())
            <div class=”alert alert-danger display-hide”
style=”display: block;”>
                <button class=”close”
data-close=”alert”></button>
                <span>   </span>
            </div>
        @endif
        {!! csrf_field() !!}

注:这里使用的bower这个工具,它负责管理一些前端的包。
到这里,我们的前期工作已经准备好了。不过在进入下一步之前,我们得先确保我们的laravel/app/storage目录有相应的写入权限,所以回到laravel目录,如果你在安装完bower之后没动过命令行,可以直接通过:

复制代码 代码如下:

        <div class=”form-group”>
            <label class=”control-label visible-ie8
visible-ie9″>原始密码</label>
            <input class=”form-control placeholder-no-fix”
type=”password” autocomplete=”off” placeholder=”Old Password”
name=”oldpassword”> </div>
        <div class=”form-group”>
            <label class=”control-label visible-ie8
visible-ie9″>新密码</label>
            <input class=”form-control placeholder-no-fix”
type=”password” autocomplete=”off” id=”register_password”
placeholder=”New password” name=”password”> </div>
        <div class=”form-group”>
            <label class=”control-label visible-ie8
visible-ie9″>重复密码</label>
            <input class=”form-control placeholder-no-fix”
type=”password” autocomplete=”off” placeholder=”Repeat password”
name=”password_confirmation”> </div>
        <div class=”form-actions”>
            <button type=”submit” id=”register-submit-btn” class=”btn
btn-success uppercase pull-right”>确定</button>
        </div>
    </form>

复制代码 代码如下:

php artisan route:clear

cd ../../

清理缓存。

回到laravel目录,然后在执行:

Services

复制代码 代码如下:

我们看到在App目录下还有一个Services目录,我觉得这是一个很赞的理念,一直以来,我都对于控制器中出现大段的业务逻辑代码而烦躁,我很想用一个单独的层把这些业务逻辑封装起来,而services就可以用来干这个活,当然,它不是必须的,但我强烈建议使用。就以laravel5自带的demo来看看吧:

chmod -R 755 app/storage

复制代码 代码如下:

这一步搞定之后我们就可以进入真正的开发阶段了。

# Http/Controllers/Auth/AuthController.php
<?php namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Contracts\Auth\Registrar;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
class AuthController extends Controller {
    /*
   
|————————————————————————–
    | Registration & Login Controller
   
|————————————————————————–
    |
    | This controller handles the registration of new users, as well as
the
    | authentication of existing users. By default, this controller
uses
    | a simple trait to add these behaviors. Why don’t you explore it?
    |
    */
    use AuthenticatesAndRegistersUsers;
    /**
     * Create a new authentication controller instance.
     *
     * @param  \Illuminate\Contracts\Auth\Guard  $auth
     * @param  \Illuminate\Contracts\Auth\Registrar  $registrar
     * @return void
     */
    public function __construct(Guard $auth, Registrar $registrar)
    {
        $this->auth = $auth;
        $this->registrar = $registrar;
        $this->middleware(‘guest’, [‘except’ => ‘getLogout’]);
    }
}

3.配置数据库并建表:

这是一个登陆授权的控制器,我们看
__construct构造函数,利用参数自动注入了一个 “接口实现(参考手册IoC)”
的绑定,我们看下Registrar:

在开始配置之前,我们要为我们的laravel应用创建一个数据库,我将它命名为laravel-start,

复制代码 代码如下:

图片 3

<?php namespace App\Services;
use App\User;
use Validator;
use Illuminate\Contracts\Auth\Registrar as RegistrarContract;
class Registrar implements RegistrarContract {
    /**
     * Get a validator for an incoming registration request.
     *
     * @param  array  $data
     * @return \Illuminate\Contracts\Validation\Validator
     */
    public function validator(array $data)
    {
        return Validator::make($data, [
            ‘name’ => ‘required|max:255’,
            ’email’ => ‘required|email|max:255|unique:users’,
            ‘password’ => ‘required|confirmed|min:6’,
        ]);
    }
    /**
     * Create a new user instance after a valid registration.
     *
     * @param  array  $data
     * @return User
     */
    public function create(array $data)
    {
        return User::create([
            ‘name’ => $data[‘name’],
            ’email’ => $data[’email’],
            ‘password’ => bcrypt($data[‘password’]),
        ]);
    }
}

然后在编辑器中打开app/config/database.php文件,对相应的数据库配置项填入,如:

提交用户名密码时的处理:

复制代码 代码如下:

复制代码 代码如下:

‘default’ => ‘mysql’,
// 数据库连接
‘connections’ => array(
    ‘mysql’ => array(
        ‘driver’    => ‘mysql’,
        ‘host’      => ‘127.0.0.1’,
        ‘database’  => ‘laravel-start’,
        ‘username’  => ‘root’,
        ‘password’  => ”,
        ‘charset’   => ‘utf8’,
        ‘collation’ => ‘utf8_unicode_ci’,
        ‘prefix’    => ”,
    ),

public function postRegister(Request $request)
{
    $validator =
$this->registrar->validator($request->all());
    if ($validator->fails())
    {
        $this->throwValidationException(
            $request, $validator
        );
    }
   
$this->auth->login($this->registrar->create($request->all()));
    return redirect($this->redirectPath());
}

连接完数据库之后,还得创建一个Users表,你可以直接在数据库中创建Users表,也可以利用Laravel的artisan来创建,这里我们使用Laravel的artisan来建表,顺道了解一点点关于Laravel
migrate的知识。执行下面语句:

可以看到,表单验证的业务逻辑仅仅一行:

php artisan migrate:make create-users-table
以上命令会创建一个migrate文件(文件位于app/database/migrations目录下),这个文件的名字就是create-users-table,然后我们可以通过编辑刚刚生成的migrate文件来创建Users表。

复制代码 代码如下:

复制代码 代码如下:

$validator = $this->registrar->validator($request->all());

public function up() {
       Schema::create(‘users’, function($table){
        $table->increments(‘id’);
        $table->string(‘username’, 20);
        $table->string(’email’, 100)->unique();
        $table->string(‘password’, 64);
       
$table->string(‘remember_token’,62)->default(‘default’);
        $table->timestamps();
        });
}

整个控制器的代码显得干净易读,我们可以把很多通用的业务逻辑封装成service,比不伦不类地直接封装在控制器类好。

上面的方法使用了laravel的Schema
Builder类,上面这段代码使用up()方法的创建一个users表,这个表里有5个字段:id自增
,username长度20以内 ,email长度100以内并且是唯一的 ,password长度64以内
,remember_token是为了在登录的时候更方便实用,Laravel会自动将token值填充进来,但在最开始你必须设一个默认值,timestamp当前的时间戳。在这我们需要注意的一点是:最好在down()加上下面的代码,以防某天我们需要删除Users这个表。

模型

复制代码 代码如下:

models目录不见了,因为不是所有应用都需要用到数据库的,所以laravel5默认不提供该目录可以理解,而且由于提供了
App 这个namespace,所以我们可以自己在 App/ 下创建 Models
目录,其中所有模型类都声名namespace
App\Models;即可,只是使用上比以前麻烦一些,需要先use,不过这样也使得项目结构更加清晰,一切类库都在命名空间的组织之下。

public function down()
{
    Schema::drop(‘users’);
}

时间有限,先写这么多吧。希望大家能够喜欢。

上面的都做好以后,执行一下下面这一句神奇的命令:

您可能感兴趣的文章:

  • 跟我学Laravel之快速入门
  • Laravel 5 框架入门(一)
  • 跟我学Laravel之配置Laravel
  • Laravel框架学习笔记(一)环境搭建
  • laravel技巧之查询构造器Query
    Builder叠加链式调用的方法

复制代码 代码如下:

php artisan migrate

有图有真相:

图片 4

终于,我们的前奏搞完了,可以正式来鲁Laravel了。

4.启动服务来试试

直接在laravel目录执行:

复制代码 代码如下:

php artisan serve

打开浏览器,输入localhost:8000,回车,Bingo!
OK,先给自己三十秒的掌声时间,如果你顺利地走到了这一步的话。恭喜你,你已经进入Laravel的大门,更多惊喜我们再一一道来…..

5.创建公用视图

好了,我们现在开始了,首先在app/views/文件夹下创建一个layouts文件夹,再再这个文件夹下新建一个php文件,命名为main.blade.php,在这个文件里写上下面这些代码:

复制代码 代码如下:

<!DOCTYPE html>
<html lang=”en”>
    <head>
        <meta charset=”utf-8″>
        <meta name=”viewport” content=”width=device-width,
initial-scale=1.0″>
        <title>发现Laravel 4之美</title>
    </head>
    <body>
    </body>
</html>

PS:layouts文件夹通常用来存放视图文件的功用部分,比如一些网页的头部<header>和尾部<footer>,这里就是存放了头部<header>部分
感觉main.blade.php的名字很奇怪?不用担心,Laravel的视图文件命名遵循filename.blade.php的规则,因为Laravel是用Blade这个模板引擎解析的,你不用深究,就照着上面的名字规则来命名视图文件就OK

为视图文件添加CSS样式:

复制代码 代码如下:

<!DOCTYPE html>
<html lang=”en”>
    <head>
        <meta charset=”utf-8″>
        <meta name=”viewport” content=”width=device-width,
initial-scale=1.0″>
        <title>发现Laravel 4之美</title>
      
{{HTML::style(‘packages/bower_components/bootstrap/dist/css/bootstrap.min.css’)
}}
        {{ HTML::style(‘css/main.css’)}}
    </head>
    <body>
    </body>
</html>

没错,就是在原来的main.blade.php的基础上添加两行代码;然后我们来创建我们的main.css,这个主要是用来放我们自己定义的样式。在public文件夹下创建css文件夹,在css文件夹创建main.css文件,大功告成。

添加导航栏。在main.blade.php文件的<body>标签中加上以下代码:

复制代码 代码如下:

<body>
        <div class=”navbar navbar-inverse navbar-fixed-top”>
            <div class=”container”>
                <div class=”navbar-header”>
                    <a class=”navbar-brand hidden-sm”
href=”/”>Laravel新手上路</a>
                </div>
                <ul class=”nav navbar-nav navbar-right
hidden-sm”>
                    <li>{{ HTML::link(‘users/register’, ‘注册’)
}}</li>
                    <li>{{ HTML::link(‘users/login’, ‘登陆’)
}}</li>
                </ul>
            </div>
        </div>
</body>

Author

发表评论

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