zoukankan      html  css  js  c++  java
  • 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 AppHttpControllers;
    
    use IlluminateSupportFacadesDB;
    
    /**
     *
     * @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');
    Route::get('blog/info', 'BlogController@info'); //get请求
    Route::post('blog/info', 'BlogController@info'); //post请求
    Route::any('blog/info', 'BlogController@info'); //'GET', 'HEAD', 'POST', 'PUT', 'PATCH', 'DELETE'请求均可
    Route::match(['get', 'post'], 'blog/info', 'BlogController@info'); //'get', 'post'请求
    
    Route::get('blog', ['uses' => 'BlogController@index']);
    Route::get('blog/info/{id}', ['uses' => 'BlogController@info'])->where('id', '[0-9]+'); //匹配正则
    Route::get('blog/tag/{name}', ['uses' => 'BlogController@tag'])->where('name', 'w+');
    

    访问

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

    即可。

    隐式控制器路由

    注意:laravel5.2已废弃该方法。

    默认的,每新增一个方法,需要写一条路由,比较繁琐。Laravel支持针对一个控制器里所有方法仅写一条路由。需要遵循的规则是:

    1. 方法的名称应由它们所响应的 HTTP 动词作为开头,紧跟着首字母大写的 URI 所组成:控制器里方法必须以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
    

    路由组:

    Route::controllers([
        'blog' => 'BlogController',
        'user' => 'UserController'
    ]);
    

    资源控制器路由
    资源控制器会创建多个路由,用来处理各式各样和相片资源相关的的 RESTful 行为。例如:

    Route::resource('photos', 'PhotosController');
    

    该路由会根据HTTP动作及路径自动对应方法名:

    动词	    	路径	      	行为(方法)  	路由名称
    GET	     	/photos	            	index		photos.index
    GET	     	/photos/create	    	create		photos.create
    POST	 	/photos	            	store		photos.store
    GET	     	/photos/{photo}	    	show		photos.show
    GET         /photos/{photo}/edit    edit		photos.edit
    PUT/PATCH   /photos/{photo}	    	update		photos.update
    DELETE      /photos/{photo}	    	destroy		photos.destroy
    

    声明资源路由时,你可以指定让此路由仅处理一部分的行为:

    Route::resource('photos', 'PhotosController',
                    ['only' => ['index', 'show']]);
    
    Route::resource('photos', 'PhotosController',
                    ['except' => ['create', 'store', 'update', 'destroy']]);
    

    路由组

    Route::group(['prefix'=>'admin','middleware'=>'auth'],function(){
        Route::any('/','backendHomeController@index');
        Route::resource('home', 'backendHomeController');
        Route::resource('cate','backendCateController');
        Route::controllers([
            'system'=>'backendSystemController',
            'upload'=>'backendUploadFileController'
        ]);
    
    });
    

    该路由组前缀是admin,及url里admin开头的都会调用该路由组。使用了中间件auth进行验证身份。

    新增文章详情页

    控制器新增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 IlluminateDatabaseEloquentModel;
    
    /** 
     * @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 AppHttpControllers;
    
    //需要use模型
    use AppBlog;
    
    /**
     *
     * @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。必须导入 IlluminateSupportFacadesRequest
        // $title = IlluminateSupportFacadesRequest::input('title');
        
        //方法三:依赖注入,需导入IlluminateHttpRequest
        // $data = $request->all();
        // $title = $request->input('title');
        //或者:
        // $title = $request->title;
        
        
        //方法四:使用Facade Input。必须导入 IlluminateSupportFacadesInput
        // $data = Input::get();
    
        $blog = new Blog;
        $blog->title = Input::get('title');
        $blog->content = Input::get('content');
        $blog->uid = 1;
    
        //保存数据
        if ($blog->save()) {
            //重定向,需要先导入IlluminateSupportFacadesRedirect
            return Redirect::to('blog');
        } else {
            return Redirect::back()->withInput()->withErrors('保存失败!');
        }
    }
    
    

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

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

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

    输出json

    1、建立 JSON 响应

    json 方法会自动将响应头的 Content-Type 配置为 application/json:

    return response()->json(['name' => 'Abigail', 'state' => 'CA']);
    

    2、建立 JSONP 响应#

    return response()->json(['name' => 'Abigail', 'state' => 'CA'])
                     ->setCallback($request->input('callback'));
    

    这里用到了Laravel的下列知识点:

    1. 表单验证:http://laravel-china.org/docs/5.0/validation
    2. 请求:http://laravel-china.org/docs/5.0/requests
    3. Facades:http://laravel-china.org/docs/5.0/facades
    4. 响应http://laravel-china.org/docs/5.0/responses

    辅助工具

    给IDE添加智能提示

    Laravel里很多类没有提示,如Route类。barryvdh/laravel-ide-helper 扩展包能让你的 IDE ( PHPStorm, Sublime ) 实现自动完成、代码智能提示和代码跟踪等功能,大大提高你的开发效率。

    安装

    1)使用 Composer 安装该扩展包:

    composer require barryvdh/laravel-ide-helper
    

    2)安装完成后,在 config/app.php 添加以下内容到 providers 数组。

    BarryvdhLaravelIdeHelperIdeHelperServiceProvider::class,
    

    3)接下来运行以下命令生成代码对应文档:

    php artisan ide-helper:generate
    

    由于使用此扩展包会生成相应的代码结构文件, 这些文件可能只有当前的开发者的 IDE 需要, 因此需要添加对应配置到.gitignore 文件中:

    .idea
    _ide_helper.php
    

    到此,此拓展包即安装成功。

    页面调试工具栏

    laravel-debugbar 用于直观的显示调试及错误信息,提高开发效率。

    安装

    1)使用 Composer 安装该扩展包:

    composer require barryvdh/laravel-debugbar
    

    2)安装完成后,修改 config/app.php 在 providers 数组内追加 Debugbar 的 Provider

    'providers' => [
        BarryvdhDebugbarServiceProvider::class,
    ],
    

    同时在 aliases 数组内追加如下内容

    'aliases' => [
        'Debugbar' => BarryvdhDebugbarFacade::class,
    ]
    

    3)接下来运行以下命令生成此扩展包的配置文件 config/debugbar.php:

    php artisan vendor:publish --provider="BarryvdhDebugbarServiceProvider"
    

    打开 config/debugbar.php,将 enabled 的值设置为:

    'enabled' => env('APP_DEBUG', false),
    

    修改完以后, Debugbar 分析器的启动状态将由 .env文件中 APP_DEBUG 值决定。

    页面刷新后, 看到下图即表示运行成功。

    更多:
    summerblue/laravel-package-top-100:
    https://github.com/summerblue/laravel-package-top-100

  • 相关阅读:
    MooseFS基础和安装
    自动化运维工具SaltStack详细部署
    linux中的通配符与正则表达式
    使用GitHub做个人博客
    mysql数据库分库备份脚本
    php-fpm配置详解
    php-fpm安装、配置与优化
    ceph的正常卸载与非正常卸载
    CentOS系统/tmp目录里面的文件默认保留多久
    ansible常用命令
  • 原文地址:https://www.cnblogs.com/52fhy/p/5277622.html
Copyright © 2011-2022 走看看