Laravel5.0学习--02 实例进阶

简介:

本文以laravel5.0.22为例。

本节以新建一个简单的博客作为实例。

准备工作

数据库配置

.env文件(也可以直接修改config/database.php)

DB_HOST=localhost
DB_DATABASE=myblog
DB_USERNAME=root
DB_PASSWORD=123456

数据库表:

CREATE TABLE `blog` (                                  
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,       
  `uid` int(11) NOT NULL DEFAULT '0',                  
  `title` varchar(50) NOT NULL DEFAULT '',             
  `content` text NOT NULL,                             
  `flag` tinyint(2) NOT NULL DEFAULT '1',              
  `create_time` int(11) NOT NULL DEFAULT '0',          
  `update_time` int(11) NOT NULL DEFAULT '0',          
  PRIMARY KEY (`id`)                                   
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8  

开始

这里暂时不使用Eloquent ORM,直接使用DB类。

控制器

新建一个控制器:app/Http/Controllers/BlogController.php

<?php
namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;

/**
 *
 * @author YJC
 *        
 */
class BlogController extends Controller{
    
    public function index() {
        
        $list = DB::table('blog')->get();
        
        //需要return
        return view('blog.index', ['list' => $list]);
    }
}

视图

新建一个母版视图:resources/views/blog/layout.blade.php

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Laravel</title>

    <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
</head>
<body>
    

    @yield('content')

    <!-- Scripts -->
    <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
    <script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</body>
</html>

新建一个普通视图:resources/views/blog/index.blade.php

@extends('blog.layout')

@section('content')
    @foreach($list as $blog)
        <div>
          <h1>{{$blog->title}}</h1>
          <p>{{$blog->content}}</p>
        </div>
    @endforeach

@endsection

路由

Route::get('blog', 'BlogController@index');

访问

http://localhost/laravel5/public/index.php/blog

即可。

路由技巧

默认的,每新增一个方法,需要写一条路由,比较繁琐。Laravel支持针对一个控制器里所有方法仅写一条路由。需要遵循的规则是:
1) 控制器里方法必须以getpost开头。
2) Route::get()改成Route::controller()

示例:上面的index方法我们需要改成getIndex,路由这样写:

Route::controller('blog', 'BlogController');

这样,Blog控制器所有的方法都能被路由匹配。例如,有如下方法:

public function getIndex(){}
public function getDetail(){}
public function postAdd(){}

都可以被匹配。访问的时候直接:

http://localhost/laravel5/public/index.php/blog/index
http://localhost/laravel5/public/index.php/blog/detail/2
http://localhost/laravel5/public/index.php/blog/add

新增文章详情页

控制器新增getDetail()方法:

public function getDetail($id) {
    $blog = DB::table('blog')->find($id);
    
    return view('blog.detail', ['blog' => $blog]);
}

更改index.blade.php:

@extends('blog.layout')

@section('content')
    @foreach($list as $blog)
        <div>
          <h1><a href="{{url('blog/detail/'.$blog->id)}}">{{$blog->title}}</a></h1>
          <p>{{$blog->content}}</p>
        </div>
    @endforeach
    
@endsection

新增文章详情视图页blog/detail.blade.php:

@extends('blog.layout')

@section('content')
    <div class="jumbotron">
      <h1>{{$blog->title}}</h1>
      <p>{{$blog->content}}</p>
    </div>
@endsection

更改路由:

//对应blog/index
Route::get('blog', 'BlogController@index'); 

//对应blog里任何方法,注意方法要加get或者post
Route::controller('blog', 'BlogController');

使用Eloquent ORM

上面我们一直用的是DB类。接下来我们将使用Eloquent ORM代替DB类。

Laravel 的 Eloquent ORM 提供了更优雅的ActiveRecord 实现来和数据库的互动。 每个数据库表对应一个模型文件。

模型(Model)

app下新建Blog.php:

<?php

namespace App;
use Illuminate\Database\Eloquent\Model;

/** 
 * @author YJC
 * 
 */
class Blog extends Model{
    
    //指定表名,不指定系统会默认自动对应名称为「类名称的小写复数形态」的数据库表
    protected $table = 'blog';
    
    //指定主键,默认就是id
    protected $primaryKey = 'id';
    
    //默认情况下,在数据库表里需要有 updated_at 和 created_at 两个字段。如果您不想设定或自动更新这两个字段,则将类里的 $timestamps 属性设为 false即可
    public $timestamps = false;
    
}

提示:所有DB类里查询构造器里的方法,查询 Eloquent 模型时也可以使用。

控制器里使用模型

复制BlogController.phpBlogController.php.bak,清空原BlogController.php里面内容,改为如下内容:

<?php
namespace App\Http\Controllers;

//需要use模型
use App\Blog;

/**
 *
 * @author YJC
 *        
 */
class BlogController extends Controller{
    
    public function index() {
        
        $list = Blog::all();
        
        return view('blog.index', ['list' => $list]);
    }
    
    public function getDetail($id) {
        $blog = Blog::find($id);
        
        return view('blog.detail', ['blog' => $blog]);
    }
}

Eloquent ORM提供了很多易用的方法来操作数据库。例如:

Blog.php模型文件里,我们可以使用以下查询方法(Eloquent ORM同时支持$this静态方式调用):

//取出所有记录,all()得出的是对象集合,可以遍历
$this->all()->toArray();
//根据主键取出一条数据
$one = $this->find('2');
return array(
  $one->id,
  $one->title,
  $one->content,
);
//查找id=2的第一条数据
$this->where('id', 2)->first()->toArray();
//查找id>0的所有数据
$this->where('id', '>', '0')->get()->toArray();
//查找id>0的所有数据,降序排列
$this->where('id', '>', '0')->orderBy('id', 'desc')->get()->toArray();
//查找id>0的所有数据,降序排列,计数
$this->where('id', '>', '0')->orderBy('id', 'desc')->count();
//offset,limit
$this->where('id', '>', '0')->orderBy($order[0], $order[1])->skip($offset)->take($limit);
//等同于
$this->where('id', '>', '0')->orderBy($order[0], $order[1])->offset($offset)->limit($limit);

更多操作方法详见:http://www.golaravel.com/laravel/docs/5.0/eloquent/

访问http://localhost/laravel5/public/index.php/blog页面看看吧!

新增博客

建立新视图:blog/add.blade.php:

@extends('blog.layout')

@section('content')
    <div class="container">
      <div class="row">
        <div class="col-md-10 col-md-offset-1">
          <div class="panel panel-default">
            <div class="panel-heading">新增博客</div>

            <div class="panel-body">

            <!--错误信息输出-->
              @if (count($errors) > 0)
                <div class="alert alert-danger">
                  <strong>输入不正确!</strong> 输入的格式不正确!<br><br>
                  <ul>
                    @foreach ($errors->all() as $error)
                      <li>{{ $error }}</li>
                    @endforeach
                  </ul>
                </div>
              @endif

            <!--表单-->
              <form action="{{ URL('blog/add') }}" method="POST">
                <input type="hidden" name="_token" value="{{ csrf_token() }}">
                <input type="text" name="title" class="form-control" required="required">
                <br>
                <textarea name="content" rows="10" class="form-control" required="required"></textarea>
                <br>
                <button class="btn btn-lg btn-info">新增</button>
              </form>

            </div>
          </div>
        </div>
      </div>
    </div>
@endsection

在首页blog/layout.blade.php新增一个新增按钮:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Laravel</title>

    <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">
</head>
<body>

    <!--新增按钮-->
    <header class="navbar navbar-static-top bs-docs-nav" id="top" role="banner">
      <div class="container">
        
        <nav id="bs-navbar" class="collapse navbar-collapse">
          <ul class="nav navbar-nav">
            <li>
              <a href="{{url('blog/add')}}">新增</a>
            </li>
            </ul>
        </nav>
      </div>
    </header>
    

    @yield('content')

    <!-- Scripts -->
    <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>
    <script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</body>
</html>

控制器新增:

/**
* 显示新增页面
*/
public function getAdd() {
    return view('blog.add');
}

/**
* 执行新增动作
*/
public function postAdd(Request $request) {
    //执行表单验证 http://laravel-china.org/docs/5.0/validation
    $this->validate($request,  [
        'title' => 'required|max:255',
        'content' => 'required',
    ]);
    
    
    //如何获取post过来的title和content等字段信息?
    
    //方法一:使用传统方法
    // $data = $_POST;
    
    //方法二:通过 Facade Request。必须导入 Illuminate\Support\Facades\Request
    // $title = \Illuminate\Support\Facades\Request::input('title');
    
    //方法三:依赖注入,需导入Illuminate\Http\Request
    // $data = $request->all();
    // $title = $request->input('title');
    //或者:
    // $title = $request->title;
    
    
    //方法四:使用Facade Input。必须导入 Illuminate\Support\Facades\Input
    // $data = Input::get();

    $blog = new Blog;
    $blog->title = Input::get('title');
    $blog->content = Input::get('content');
    $blog->uid = 1;

    //保存数据
    if ($blog->save()) {
        //重定向,需要先导入Illuminate\Support\Facades\Redirect
        return Redirect::to('blog');
    } else {
        return Redirect::back()->withInput()->withErrors('保存失败!');
    }
}

点击新增按钮,就可以新增一篇博客了!

在上面代码里面,演示了多种途径获得post过来的数据,大家可以一一尝试。

小技巧:可以使用dd()var_dump()方法打印。

目录
相关文章
|
6月前
|
存储 安全 编译器
C++:入门学习C++,它在C的基础上做了哪些修改?
C++:入门学习C++,它在C的基础上做了哪些修改?
|
8月前
|
Python
Python快速上手系列--函数下篇--详解篇
Python快速上手系列--函数下篇--详解篇
37 0
|
11月前
|
前端开发
前端学习笔记202303学习笔记第五天-template节点的基本使用
前端学习笔记202303学习笔记第五天-template节点的基本使用
32 0
|
中间件 C#
MasaFramework入门第二篇,安装MasaFramework了解各个模板
MasaFramework入门第二篇,安装MasaFramework了解各个模板
175 0
MasaFramework入门第二篇,安装MasaFramework了解各个模板
|
安全 Java 关系型数据库
【web开发基础】php开发基础快速入门(1)-PHP介绍及开发环境快速安装和基本使用介绍
互联网时代,网站是一种非常重要的通讯工具,只要用户有网络和权限,随时随地可访问任意网页,个人可以通过网站发布自己的想要公开的资讯,或者利用网站提供相关的网络服务,企业网站,对于企业来说,是企业对外的窗口,是企业的名片。可通过网站宣传企业自身以及品牌的推广,甚至交流,产品的销售或提供服务工具。在飞速发展的时代,快速开发,快速部署,快速迭代也成了互联网软件行业一直追求的目标,毕竟机会稍纵即逝。而PHP最大好处在于开发部署快速,而且生态完善,社区活跃度高,类库丰
187 1
|
JavaScript 前端开发 Ruby
【Ruby on Rails全栈课程】4.5 评论功能实现(四)--创建评论、另一种传参方式
【Ruby on Rails全栈课程】4.5 评论功能实现(四)--创建评论、另一种传参方式
170 0
|
JavaScript Ruby
【Ruby on Rails全栈课程】4.3 评论功能实现(二)--创建帖子详情页面
1、完善样式,用来显示帖子详情以及评论信息等,编辑app/assets/stylesheets/posts.scss文件,在原有代码下面添加代码:
115 0
|
JavaScript 前端开发 UED
|
C++ Python
ROS入门笔记(十一):编写与测试简单的Service和Client (Python)
ROS入门笔记(十一):编写与测试简单的Service和Client (Python)
439 0
ROS入门笔记(十一):编写与测试简单的Service和Client (Python)
|
JavaScript 前端开发 Ruby
【Ruby on Rails全栈课程】4.7 评论功能实现(六)--其他回复展开
、描述 每条评论下面的回复条数最多显示两条,多于两条,回复下面会显示「更多n条回复 ↓」链接,每次点击此链接,展开8条回复,页面不刷新,需要配合ajax和js实现。 2、实现功能 (1)在routes.rb文件中添加路径,加上两个参数,:comment_id为回复所属的评论的id,point为此次点击为第几次点击
184 0