您的位置:首页 > 编程语言 > PHP开发

Laravel大型项目系列教程(一)

2015-01-21 14:18 447 查看

Laravel大型项目系列教程(一)

一、课程概述

1.课程介绍

本教程将使用Laravel完成一个多用户的博客系统,大概会包含如下内容:

路由管理。

用户管理,如用户注册、修改信息、锁定用户等。

文章管理,如发表文章、修改文章等。

标签管理,文章会有一到多个标签。

数据库管理,如迁移、填充数据等。

Web表单验证。

Blade模版引擎。

分页处理。

安全处理。

单元测试。

部署到应用服务器Apache。

尽量保证每节教程完整并能运行,会在教程的最后附上这节教程的代码下载地址。


Tip:教程中必要的知识点都会有一个超链接


[b]二环境要求[/b]

-PHP5.4+
-MySQL5.1+
-Composer([中国镜像](http://pkg.phpcomposer.com/))

三、Let'sgo!

1.新建一个Laravel项目

使用如下命令创建一个名为blog的Laravel项目:

$composercreate-projectlaravel/laravelblog--prefer-dist


创建完成之后进入到blog目录,修改
app/config/app.php
中的
timezone
RPC
locale
zh
,然后在blog目录下启动它自带的开发服务器:

$phpartisanserve
Laraveldevelopmentserverstartedon'target='_blank'>http://localhost:8000[/code]
打开浏览器输入
localhost:8000
,如果页面如下图就说明项目搭建完成了:



2.安装插件

composer.json
中增加:

"require-dev":{
"way/generators":"~2.0"
},


运行
composerupdate
安装,完成后在
app/config/app.php
providers
中增加:

'Way\Generators\GeneratorsServiceProvider'


运行
phpartisan
是不是多了
generate
选项,它可以快速地帮我们创建想要的组件。

3.建立数据库

app/config/database.php
connections
下的
mysql
改成你自己的配置:

'mysql'=>array(
'driver'=>'mysql',
'host'=>'localhost',
'database'=>'blog',
'username'=>'root',
'password'=>'',
'charset'=>'utf8',
'collation'=>'utf8_unicode_ci',
'prefix'=>'',
),



需要在MySQL中先创建一个名为blog的数据库


配置完成之后,创建users表的数据库迁移文件:

$phpartisanmigrate:makecreate_users_table--create=users


我们会发现在
app\database\migrations
下多了一个
*_create_users_table.php
文件,在这个文件中修改:

Schema::create('users',function(Blueprint$table)
{
$table->increments('id');
$table->string('email');
$table->string('password');
$table->string('nickname');
$table->boolean('is_admin')->default(0);
$table->boolean('block')->default(0);
$table->timestamps();
});


之后进行数据库迁移:

$phpartisanmigrate


你会惊讶地发现在数据库中多了两张表
users
migrations
users
表就是我们定义的表,
migrations
表记录了迁移的信息。

4.创建User模型

数据库迁移完成之后我们将使用EloquentORM,这是Laravel让人着迷的重要原因之一。我们会发现在
app\models
下已经有一个
User.php
文件了,对其修改:

useIlluminate\Auth\UserInterface;
useIlluminate\Auth\UserTrait;

classUserextendsEloquentimplementsUserInterface{
useUserTrait;

protected$table='users';
protected$hidden=array('password','remember_token');
}


5.填充数据

有了User模型后,我们就可以向数据库填充数据了,在
app/database/seeds
下创建一个名为
UsersSeeder.php
的文件,增加如下:

classUsersSeederextendsSeeder{
publicfunctionrun()
{
User::create([
'email'=>'admin@shiyanlou.com',
'password'=>Hash::make(''),
'nickname'=>'admin',
'is_admin'=>1,
]);
}
}


然后在
DatabaseSeeder.php
中增加:

$this->call('UserTableSeeder');


之后就真正地向数据库填充数据:

$phpartisandb:seed


你可以查看数据库,会发现users表中多了一条记录。


详情可以查看Laravel中数据库的迁移和填充


6.创建视图模版

我们将使用Laravel中的Blade模版引擎,使用下面命令创建三个视图:

phpartisangenerate:view_layouts.default
phpartisangenerate:view_layouts.nav
phpartisangenerate:view_layouts.footer
phpartisangenerate:viewindex


之后你可以在
app/views
下发现多了一个
index.blade.php
和一个
_layouts
文件夹,在
_layouts
文件夹下有三个文件
default.blade.php
footer.blade.php
nav.blade.php
。我们将使用AmazeUI框架来做为前端框架,修改
default.blade.php


<!DOCTYPEhtml>
<html>
<headlang="zh">
<metacharset="UTF-8"/>
<title>ShiYanLouBlog</title>
<metahttp-equiv="X-UA-Compatible"content="IE=edge"/>
<metaname="viewport"
content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">
<metaname="format-detection"content="telephone=no"/>
<metaname="renderer"content="webkit"/>
<metahttp-equiv="Cache-Control"content="no-siteapp"/>
<linkrel="alternateicon"type="image/x-icon"href="{{URL::asset('i/favicon.ico')}}"/>
<linkrel="stylesheet"href="//cdn.amazeui.org/amazeui/2.1.0/css/amazeui.min.css"/>
{{HTML::style('css/custom.css')}}
</head>
<body>
<headerclass="am-topbaram-topbar-fixed-top">
<divclass="am-container">
<h1class="am-topbar-brand">
<ahref="/">ShiYanLouBlog</a>
</h1>
@include('_layouts.nav')
</div>
</header>

@yield('main')

@include('_layouts.footer')

<scriptsrc="//cdn.bootcss.com/jquery/2.1.3/jquery.min.js"></script>
<scriptsrc="//cdn.amazeui.org/amazeui/2.1.0/js/amazeui.min.js"></script>
</body>
</html>


URL::asset('i/favicon.ico')
会生成
http://localhost:8000/i/favicon.ico
HTML::style('css/custom.css')
会生成
<linkmedia="all"type="text/css"rel="stylesheet"href="http://localhost:8000/css/custom.css">
,其中的
i
css
文件夹是放在
public
目录下的,
public
目录是项目的资源文件夹。
@include('_layouts.nav')
会包含
app/views/_layouts/nav.blade.php
文件,
@yield('main')
是用于模版继承的。

修改
nav.blade.php


<buttonclass="am-topbar-btnam-topbar-toggleam-btnam-btn-smam-btn-secondaryam-show-sm-only"
data-am-collapse="{target:'#collapse-head'}"><spanclass="am-sr-only">navswitch</span>
<spanclass="am-icon-bars"></span></button>
<divclass="am-collapseam-topbar-collapse"id="collapse-head">
<divclass="am-topbar-right">
<ahref="#"class="am-btnam-btn-primaryam-topbar-btnam-btn-smtopbar-link-btn"><spanclass="am-icon-user"></span>Login</a>
</div>
</div>


修改
footer.blade.php


<footerclass="footer">
<p>©2015By<ahref="http://www.shiyanlou.com"target="_blank">www.shiyanlou.com</a></p>
</footer>


修改
index.blade.php


@extends('_layouts.default')

@section('main')
<divclass="am-gam-g-fixedblog-g-fixed">
<divclass="am-u-sm-12">
<h1>WelcometoShiYanLou!</h1>
</div>
</div>
@stop


@extends('_layouts.default')
会继承
app/views/_layouts/default.blade.php
文件,
@yield('main')
对应
@section('main')
并填充为其中的内容。

public
目录下新建两个文件夹
i
css
,在
i
文件夹里放置一个名为
favicon.ico
的图标,在
css
文件夹下新建一个名为
custom.css
的文件,修改如下:

.footerp{
color:#7f8c8d;
margin:0;
padding:15px0;
text-align:center;
background:#2d3e50;
}

.topbar-link-btn{
color:#fff!important;
}


7.修改路由访问首页

视图已经有了,这时候需要把路由跟视图进行关联,修改
app/routes.php
如下:

Route::get('/',function()
{
returnView::make('index');
});


不出意外,这时候访问
localhost:8000
会出现下图这样:



终于见到了亲手编写的第一个页面,是不是有点小激动啊?

8.创建登录视图

nav.blade.php
中修改登录超链接的地址:

<ahref="{{URL::to('login')}}"class="am-btnam-btn-primaryam-topbar-btnam-btn-smtopbar-link-btn"><spanclass="am-icon-user"></span>Login</a>


URL::to('login')
会生成
http://localhost:8000/login
这个地址。

创建
login.blade.php


$phpartisangenerate:viewlogin


修改
login.blade.php


@extends('_layouts.default')

@section('main')
<divclass="am-gam-g-fixed">
<divclass="am-u-lg-6am-u-md-8">
<br/>
@if(Session::has('message'))
<divclass="am-alertam-alert-danger"data-am-alert>
<p>{{Session::get('message')}}</p>
</div>
@endif
@if($errors->has())
<divclass="am-alertam-alert-danger"data-am-alert>
<p>{{$errors->first()}}</p>
</div>
@endif
{{Form::open(array('url'=>'login','class'=>'am-form'))}}
{{Form::label('email','E-mail:')}}
{{Form::email('email',Input::old('email'))}}
<br/>
{{Form::label('password','Password:')}}
{{Form::password('password')}}
<br/>
<labelfor="remember_me">
<inputid="remember_me"name="remember_me"type="checkbox"value="1">
RememberMe
</label>
<br/>
<divclass="am-cf">
{{Form::submit('Login',array('class'=>'am-btnam-btn-primaryam-btn-smam-fl'))}}
</div>
{{Form::close()}}
<br/>
</div>
</div>
@stop


routes.php
中增加:

Route::get('login',function()
{
returnView::make('login');
});


这时候访问
localhost:8000/login
或者点击导航条的
Login
按钮会出现下图这样:



9.实现登录

创建用户登录后主页:

$phpartisangenerate:viewhome


修改
home.blade.php


@extends('_layouts.default')

@section('main')
<divclass="am-gam-g-fixedblog-g-fixed">
<divclass="am-u-sm-12">
<h1>Hello{{{Auth::user()->nickname}}}</h1>
</div>
</div>
@stop


上面的
{{{}}}
可以对字符串做转义处理,一定程度上避免XSS攻击。

修改
nav.blade.php


<divclass="am-collapseam-topbar-collapse"id="collapse-head">
@if(Auth::check())
<ulclass="am-navam-nav-pillsam-topbar-navam-topbar-right">
<liclass="am-dropdown"data-am-dropdown>
<aclass="am-dropdown-toggle"data-am-dropdown-togglehref="javascript:;">
<spanclass="am-icon-users"></span>{{{Auth::user()->nickname}}}<spanclass="am-icon-caret-down"></span>
</a>
<ulclass="am-dropdown-content">
<li><ahref="{{URL::to('logout')}}"><spanclass="am-icon-power-off"></span>Exit</a></li>
</ul>
</li>
</ul>
@else
<divclass="am-topbar-right">
<ahref="{{URL::to('login')}}"class="am-btnam-btn-primaryam-topbar-btnam-btn-smtopbar-link-btn"><spanclass="am-icon-user"></span>Login</a>
</div>
@endif
</div>


Routes.php
中增加:

Route::post('login',array('before'=>'csrf',function()
{
$rules=array(
'email'=>'required|email',
'password'=>'required|min:6',
'remember_me'=>'boolean',
);
$validator=Validator::make(Input::all(),$rules);
if($validator->passes())
{
if(Auth::attempt(array(
'email'=>Input::get('email'),
'password'=>Input::get('password'),
'block'=>0),(boolean)Input::get('remember_me')))
{
returnRedirect::intended('home');
}else{
returnRedirect::to('login')->withInput()->with('message','E-mailorpassworderror');
}
}else{
returnRedirect::to('login')->withInput()->withErrors($validator);
}
}));

Route::get('home',array('before'=>'auth',function()
{
returnView::make('home');
}));


下面就可以尝试用户登录了,如果输入信息有误,会出现错误信息如:



登录成功后会出现下图这样:



这里我们使用了Laravel自带的身份验证Auth,你也可以使用更加强大的Sentry,Web表单验证用了Validator,View和Redirect详细可以查看视图和响应文档,还使用了路由过滤器,
csrf
过滤器可以使我们轻松地防御
csrf
攻击。

10.退出登录

routes.php
中增加:

Route::get('logout',array('before'=>'auth',function()
{
Auth::logout();
returnRedirect::to('/');
}));


现在你就可以实现退出功能了,点击
Exit




退出后会跳转到主页。

11.小结

至此简单的用户登录功能就完成了,你除了要完成上述的例子外,还要完成
记住我
的功能哦!你可以通过下面途径来完成:

Laravel官网

中文文档1、中文文档2

实验楼论坛

Laravel中文网问答社区

PHPHub中文社区

API文档

laravel.io

LARACASTS

代码下载:

$gitclone'target='_blank'>https://github.com/shiyanlou/laravel-blog-1.git[/code]

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航