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模型
数据库迁移完成之后我们将使用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中的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。我们将使用
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自带的
csrf过滤器可以使我们轻松地防御
csrf攻击。
10.退出登录
在routes.php中增加:
Route::get('logout',array('before'=>'auth',function() { Auth::logout(); returnRedirect::to('/'); }));
现在你就可以实现退出功能了,点击
Exit:
退出后会跳转到主页。
11.小结
至此简单的用户登录功能就完成了,你除了要完成上述的例子外,还要完成记住我的功能哦!你可以通过下面途径来完成:
代码下载:
$gitclone'target='_blank'>https://github.com/shiyanlou/laravel-blog-1.git[/code]