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

一、课程概述

1.课程介绍

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

  • 路由管理。
  • 用户管理,如用户注册、修改信息、锁定用户等。
  • 文章管理,如发表文章、修改文章等。
  • 标签管理,文章会有一到多个标签。
  • 数据库管理,如迁移、填充数据等。
  • Web表单验证。
  • Blade模版引擎。
  • 分页处理。
  • 安全处理。
  • 单元测试。
  • 部署到应用服务器Apache。

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

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

环境要求

- PHP 5.4+
- MySQL 5.1+
- Composer([中国镜像](http://pkg.phpcomposer.com/))

三、Let's go!

1.新建一个Laravel项目

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

  1. $ composer create-project laravel/laravel blog --prefer-dist

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

  1. $ php artisan serve
  2. Laravel development server started on http://localhost:8000

打开浏览器输入localhost:8000,如果页面如下图就说明项目搭建完成了:

2.安装插件

composer.json中增加:

  1. "require-dev": {
  2. "way/generators": "~2.0"
  3. },

运行composer update安装,完成后在app/config/app.phpproviders中增加:

  1. 'Way\Generators\GeneratorsServiceProvider'

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

3.建立数据库

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

  1. 'mysql' => array(
  2. 'driver' => 'mysql',
  3. 'host' => 'localhost',
  4. 'database' => 'blog',
  5. 'username' => 'root',
  6. 'password' => '',
  7. 'charset' => 'utf8',
  8. 'collation' => 'utf8_unicode_ci',
  9. 'prefix' => '',
  10. ),

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

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

  1. $ php artisan migrate:make create_users_table --create=users

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

  1. Schema::create('users', function(Blueprint $table)
  2. {
  3. $table->increments('id');
  4. $table->string('email');
  5. $table->string('password');
  6. $table->string('nickname');
  7. $table->boolean('is_admin')->default(0);
  8. $table->boolean('block')->default(0);
  9. $table->timestamps();
  10. });

之后进行数据库迁移:

  1. $ php artisan migrate

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

4.创建User模型

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

  1. use Illuminate\Auth\UserInterface;
  2. use Illuminate\Auth\UserTrait;
  3.  
  4. class User extends Eloquent implements UserInterface {
  5. use UserTrait;
  6.  
  7. protected $table = 'users';
  8. protected $hidden = array('password', 'remember_token');
  9. }

5.填充数据

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

  1. class UsersSeeder extends Seeder {
  2. public function run()
  3. {
  4. User::create([
  5. 'email' => 'admin@shiyanlou.com',
  6. 'password' => Hash::make(''),
  7. 'nickname' => 'admin',
  8. 'is_admin' => 1,
  9. ]);
  10. }
  11. }

然后在DatabaseSeeder.php中增加:

  1. $this->call('UserTableSeeder');

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

  1. $ php artisan db:seed

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

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

6.创建视图模版

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

  1. php artisan generate:view _layouts.default
  2. php artisan generate:view _layouts.nav
  3. php artisan generate:view _layouts.footer
  4. php artisan generate:view index

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

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="zh">
  4. <meta charset="UTF-8"/>
  5. <title>ShiYanLou Blog</title>
  6. <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
  7. <meta name="viewport"
  8. content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
  9. <meta name="format-detection" content="telephone=no"/>
  10. <meta name="renderer" content="webkit"/>
  11. <meta http-equiv="Cache-Control" content="no-siteapp"/>
  12. <link rel="alternate icon" type="image/x-icon" href="{{ URL::asset('i/favicon.ico') }}"/>
  13. <link rel="stylesheet" href="//cdn.amazeui.org/amazeui/2.1.0/css/amazeui.min.css"/>
  14. {{ HTML::style('css/custom.css') }}
  15. </head>
  16. <body>
  17. <header class="am-topbar am-topbar-fixed-top">
  18. <div class="am-container">
  19. <h1 class="am-topbar-brand">
  20. <a href="/">ShiYanLou Blog</a>
  21. </h1>
  22. @include('_layouts.nav')
  23. </div>
  24. </header>
  25.  
  26. @yield('main')
  27.  
  28. @include('_layouts.footer')
  29.  
  30. <script src="//cdn.bootcss.com/jquery/2.1.3/jquery.min.js"></script>
  31. <script src="//cdn.amazeui.org/amazeui/2.1.0/js/amazeui.min.js"></script>
  32. </body>
  33. </html>

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

修改nav.blade.php

  1. <button class="am-topbar-btn am-topbar-toggle am-btn am-btn-sm am-btn-secondary am-show-sm-only"
  2. data-am-collapse="{target: '#collapse-head'}"><span class="am-sr-only">nav switch</span>
  3. <span class="am-icon-bars"></span></button>
  4. <div class="am-collapse am-topbar-collapse" id="collapse-head">
  5. <div class="am-topbar-right">
  6. <a href="#" class="am-btn am-btn-primary am-topbar-btn am-btn-sm topbar-link-btn"><span class="am-icon-user"></span> Login</a>
  7. </div>
  8. </div>

修改footer.blade.php

  1. <footer class="footer">
  2. <p>© 2015 By <a href="http://www.shiyanlou.com" target="_blank">www.shiyanlou.com</a></p>
  3. </footer>

修改index.blade.php

  1. @extends('_layouts.default')
  2.  
  3. @section('main')
  4. <div class="am-g am-g-fixed blog-g-fixed">
  5. <div class="am-u-sm-12">
  6. <h1>Welcome to ShiYanLou!</h1>
  7. </div>
  8. </div>
  9. @stop

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

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

  1. .footer p {
  2. color: #7f8c8d;
  3. margin: 0;
  4. padding: 15px 0;
  5. text-align: center;
  6. background: #2d3e50;
  7. }
  8.  
  9. .topbar-link-btn {
  10. color: #fff !important;
  11. }

7.修改路由访问首页

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

  1. Route::get('/', function()
  2. {
  3. return View::make('index');
  4. });

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

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

8.创建登录视图

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

  1. <a href="{{ URL::to('login') }}" class="am-btn am-btn-primary am-topbar-btn am-btn-sm topbar-link-btn"><span class="am-icon-user"></span> Login</a>

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

创建login.blade.php

  1. $ php artisan generate:view login

修改login.blade.php

  1. @extends('_layouts.default')
  2.  
  3. @section('main')
  4. <div class="am-g am-g-fixed">
  5. <div class="am-u-lg-6 am-u-md-8">
  6. <br/>
  7. @if (Session::has('message'))
  8. <div class="am-alert am-alert-danger" data-am-alert>
  9. <p>{{ Session::get('message') }}</p>
  10. </div>
  11. @endif
  12. @if ($errors->has())
  13. <div class="am-alert am-alert-danger" data-am-alert>
  14. <p>{{ $errors->first() }}</p>
  15. </div>
  16. @endif
  17. {{ Form::open(array('url' => 'login', 'class' => 'am-form')) }}
  18. {{ Form::label('email', 'E-mail:') }}
  19. {{ Form::email('email', Input::old('email')) }}
  20. <br/>
  21. {{ Form::label('password', 'Password:') }}
  22. {{ Form::password('password') }}
  23. <br/>
  24. <label for="remember_me">
  25. <input id="remember_me" name="remember_me" type="checkbox" value="1">
  26. Remember Me
  27. </label>
  28. <br/>
  29. <div class="am-cf">
  30. {{ Form::submit('Login', array('class' => 'am-btn am-btn-primary am-btn-sm am-fl')) }}
  31. </div>
  32. {{ Form::close() }}
  33. <br/>
  34. </div>
  35. </div>
  36. @stop

routes.php中增加:

  1. Route::get('login', function()
  2. {
  3. return View::make('login');
  4. });

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

9.实现登录

创建用户登录后主页:

  1. $ php artisan generate:view home

修改home.blade.php

  1. @extends('_layouts.default')
  2.  
  3. @section('main')
  4. <div class="am-g am-g-fixed blog-g-fixed">
  5. <div class="am-u-sm-12">
  6. <h1>Hello {{{ Auth::user()->nickname }}}</h1>
  7. </div>
  8. </div>
  9. @stop

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

修改nav.blade.php

  1. <div class="am-collapse am-topbar-collapse" id="collapse-head">
  2. @if (Auth::check())
  3. <ul class="am-nav am-nav-pills am-topbar-nav am-topbar-right">
  4. <li class="am-dropdown" data-am-dropdown>
  5. <a class="am-dropdown-toggle" data-am-dropdown-toggle href="javascript:;">
  6. <span class="am-icon-users"></span> {{{ Auth::user()->nickname }}} <span class="am-icon-caret-down"></span>
  7. </a>
  8. <ul class="am-dropdown-content">
  9. <li><a href="{{ URL::to('logout') }}"><span class="am-icon-power-off"></span> Exit</a></li>
  10. </ul>
  11. </li>
  12. </ul>
  13. @else
  14. <div class="am-topbar-right">
  15. <a href="{{ URL::to('login') }}" class="am-btn am-btn-primary am-topbar-btn am-btn-sm topbar-link-btn"><span class="am-icon-user"></span> Login</a>
  16. </div>
  17. @endif
  18. </div>

Routes.php中增加:

  1. Route::post('login', array('before' => 'csrf', function()
  2. {
  3. $rules = array(
  4. 'email' => 'required|email',
  5. 'password' => 'required|min:6',
  6. 'remember_me' => 'boolean',
  7. );
  8. $validator = Validator::make(Input::all(), $rules);
  9. if ($validator->passes())
  10. {
  11. if (Auth::attempt(array(
  12. 'email' => Input::get('email'),
  13. 'password' => Input::get('password'),
  14. 'block' => 0), (boolean) Input::get('remember_me')))
  15. {
  16. return Redirect::intended('home');
  17. } else {
  18. return Redirect::to('login')->withInput()->with('message', 'E-mail or password error');
  19. }
  20. } else {
  21. return Redirect::to('login')->withInput()->withErrors($validator);
  22. }
  23. }));
  24.  
  25. Route::get('home', array('before' => 'auth', function()
  26. {
  27. return View::make('home');
  28. }));

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

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

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

10.退出登录

routes.php中增加:

  1. Route::get('logout', array('before' => 'auth', function()
  2. {
  3. Auth::logout();
  4. return Redirect::to('/');
  5. }));

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

退出后会跳转到主页。

11.小结

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

代码下载:

  1. $ git clone https://github.com/shiyanlou/laravel-blog-1.git
  1.  

Laravel大型项目系列教程(一)的更多相关文章

  1. Laravel大型项目系列教程(三)之发表文章

    Laravel大型项目系列教程(三)之发表文章 一.前言 上一节教程中完成了用户管理,这节教程将大概完成发表Markdown格式文章并展示的功能. 二.Let's go 1.数据库迁移 文章模块中我们 ...

  2. Laravel大型项目系列教程(二)之用户管理

    Laravel大型项目系列教程(二) 一.前言 本节教程将大概实现用户的注册.修改个人信息.管理用户功能. 二.Let's go 1.创建用户注册视图 $ php artisan generate:v ...

  3. Laravel大型项目系列教程(四)显示文章列表和用户修改文章

    小编心语:不知不觉已经第四部分了,非常感谢很多人给小编提的意见,改了很多bug,希望以后能继续帮小编找找茬~小编也不希望误导大家~这一节,主要讲的 是如何显示文章列表和让用户修改文章,小编预告一下(一 ...

  4. Laravel大型项目系列教程(五)之文章和标签管理

    一.前言 本节教程将大概完成文章和标签管理以及标签关联. 二.Let's go 1.文章管理 首先创建管理后台文章列表视图: $ php artisan generate:view admin.art ...

  5. 一步一步使用ABP框架搭建正式项目系列教程之本地化详解

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 本篇目录 扯扯本地化 ABP中的本地化 小结 扯扯本地化 本节来说说本地化,也有叫国际化.全球化的,不管怎么个叫法,反正道理都是一 ...

  6. ABP框架搭建项目系列教程基础版完结篇

    返回总目录<一步一步使用ABP框架搭建正式项目系列教程> 经过前面十二篇的基础教程,现在终于该做个总结了. 回顾 第一篇,我们建议新手朋友们先通过ABP官网的启动模板生成解决方案,因为这样 ...

  7. 一步一步使用ABP框架搭建正式项目系列教程

    研究ABP框架好多天了,第一次看到这个框架的名称到现在已经很久了,但由于当时内功有限,看不太懂,所以就只是大概记住了ABP这个名字.最近几天,看到了园友@阳光铭睿的系列ABP教程,又点燃了我内心要研究 ...

  8. J20航模遥控器开源项目系列教程(一)制作教程 | 基础版V1.0发布,从0到1

    我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/C ...

  9. J20航模遥控器开源项目系列教程(五)| 制作STM32F0接收机,8路PWM输出,SBUS输出,PPM输出 | 加密狗无线化,畅玩飞行模拟器

    我们的开源宗旨:自由 协调 开放 合作 共享 拥抱开源,丰富国内开源生态,开展多人运动,欢迎加入我们哈~ 和一群志同道合的人,做自己所热爱的事! 项目开源地址:https://github.com/J ...

随机推荐

  1. Windows10自适应和交互式toast通知[1]

    阅读目录: 概述 toast通知的结构 视觉区域(Visual) 行为(Actions) 特定场景下的Toast通知 带多内容的通知 带行为的通知(例子1) 带行为的通知(例子2) 带文本输入框和行为 ...

  2. EasyPR--开发详解(5)颜色定位与偏斜扭转

    本篇文章介绍EasyPR里新的定位功能:颜色定位与偏斜扭正.希望这篇文档可以帮助开发者与使用者更好的理解EasyPR的设计思想. 让我们先看一下示例图片,这幅图片中的车牌通过颜色的定位法进行定位并从偏 ...

  3. (转) [it-ebooks]电子书列表

    [it-ebooks]电子书列表   [2014]: Learning Objective-C by Developing iPhone Games || Leverage Xcode and Obj ...

  4. 如何在VMware中安装Windows Phone SDK 8.0 (支持模拟器调试)

    相信很多开发者目前的系统还是Win7或Mac,一般不会为了开发某个程序而重装系统,所以我们就需要用到VMware这类的虚拟机来模拟预期的开发环境.在开始介绍前,给大家说明下我当前的软硬件环境,本文所讲 ...

  5. AngularJs之八

    ***今天讲一下angularJs的路由功能: 一:angularJs路由. 1.AngularJS 路由允许我们通过不同的 URL 访问不同的内容. 2.通过 AngularJS 可以实现多视图的单 ...

  6. 在PC上测试移动端网站和模拟手机浏览器的5大方

    查了很多资料,尝试了大部分方法,下面将这一天的努力总结下分享给大家,也让大家免去看那么多文章,以下介绍的方法,都是本人亲自测试成功的方法,测试环境winxp. 一.Chrome*浏览器 chrome模 ...

  7. ElasticSearch 5学习(5)——第一个例子(很实用)

    想要知道ElasticSearch是如何使用的,最快的方式就是通过一个简单的例子,第一个例子将会包括基本概念如索引.搜索.和聚合等,需求是关于公司管理员工的一些业务. 员工文档索引 业务首先需要存储员 ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统(31)-MVC使用RDL报表

    系列目录 这次我们来演示MVC3怎么显示RDL报表,坑爹的微软把MVC升级到5都木有良好的支持报表,让MVC在某些领域趋于短板 我们只能通过一些方式来使用rdl报表. Razor视图不支持asp.ne ...

  9. NGUI学习笔记(一)UILabel介绍

    来个前言: 作为一个U3D程序员,自然要写一写U3D相关的内容了.想来想去还是从UI开始搞起,可能这也是最直观同时也最重要的部分之一了.U3D自带的UI系统,也许略坑,也没有太多介绍的价值,那么从今天 ...

  10. 跨域之同源策略 Same-origin policy

    同源策略是浏览器中最基本的隔离潜在恶意文件的安全策略,他限制了来自不同源(origin)的文档或脚本之间的相互作用. 何谓同源 在跨域之URL中介绍过一个URL的标准格式如下: 协议类型://服务器地 ...