14 創(chuàng)建REST服務(wù)

2018-02-24 15:53 更新

創(chuàng)建REST服務(wù)

14.1 數(shù)據(jù)庫遷移

這個(gè)名字是源自于Ruby On Rails在那時(shí)候的印象,不直接使用MySQL的目的在于讓我們可以專注于過程。

14.1.1 創(chuàng)建表

表的概念,類似于在Excel中的表,如果你真實(shí)不懂?dāng)?shù)據(jù)庫。 讓我們創(chuàng)建一個(gè)athomes的表,為什么是athomes,因?yàn)橐郧霸趯慳ndroid程序的時(shí)候就叫的是athome,忽略掉這些次要的因素吧。

$ php artisan migrate:make create_athomes_table

打開 app/database/migrations/create_athomes_table.php 這里的是由日期和某些隨機(jī)變量組成的,修改生成的PHP代碼,如下:

use Illuminate\Database\Schema\Blueprint;  
use Illuminate\Database\Migrations\Migration;  

class CreateAthomesTable extends Migration {
    public function up()  
    {  
        Schema::create('athomes', function(Blueprint $table)  
        {  
            $table--->increments('id');  
            $table->float('temperature');  
            $table->float('sensors1');  
            $table->float('sensors2');  
            $table->boolean('led1');  
            $table->timestamps();  
        });  
    }  
    public function down()  
    {  
        Schema::drop('athomes');  
    }  
}

id值是自加的,也就是我們在localhost/athome/{id},當(dāng)我們創(chuàng)建一個(gè)新的數(shù)據(jù)的時(shí)候,會(huì)自動(dòng)加上去。最后一個(gè)timestamps批的是時(shí)間,會(huì)包含創(chuàng)建時(shí)間和修改時(shí)間。 剩下的temperature,sensors1,sensors2是小數(shù),以及只有true和false的led1。

14.1.2 數(shù)據(jù)庫遷移

我們只是寫了我們需要的數(shù)據(jù)的格式而并沒有丟到數(shù)據(jù)庫里,

$ php artisan migrate

這個(gè)就是我們執(zhí)行遷移的命令,如果你用phpmyadmin可以直接打開查看,沒有的話,可以。

$ mysql -uroot -p
use iot;
select * from athomes;

就可以看到我們寫的東西,那么接下來就是創(chuàng)建RESTful服務(wù)了

14.2 創(chuàng)建RESTful

用下面的代碼實(shí)現(xiàn)我們稱之為Athomes控制器的創(chuàng)建

$ php artisan controller:make AthomesController

就會(huì)在app/controllers下面生成下面的代碼

class AthomesController extends \BaseController {  
    public function index() {}  
    public function create()  {} 
    public function store() {}  
    public function show($id) {}  
    public function edit($id) {}  
    public function update($id) {}  
    public function destroy($id) {} 
}

14.3 Laravel Resources

上面的代碼過于沉重,請讓我用 Ctrl+C 來帶來點(diǎn)知識吧。

|

Verb

|

Path

|

Action

|

Route Name

GET

|

/resource

|

index

|

resource.index

GET

|

/resource/create

|

create

|

resource.create

POST

|

/resource

|

store

|

resource.store

GET

|

/resource/{resource}

|

show

|

resource.show

GET

|

/resource/{resource}/edit

|

edit

|

resource.edit

PUT/PATCH

|

/resource/{resource}

|

update

|

resource.update

DELETE

|

/resource/{resource}

|

destroy

|

resource.destroy

|

所以我們只需要專注于創(chuàng)建 create, edit, show, destory 等等。好吧,你可能沒有耐心了,但是在修改這個(gè)之前我們需要先在 app/model 加個(gè) class

class Athomes extends Eloquent {  
    protected $table = 'athomes';  
}

如果你想要的只是控制器Athomes的代碼的話。。

class AthomesController extends \BaseController {
    public $restful=true;
    protected $athome;
    public function __construct(Athomes $athome)
    {
        $this--->athome = $athome ;
     }
    public function index()
    {
        $maxid=Athomes::all();
        return Response::json($maxid);
    }
    public function create()
    {
        $maxid=Athomes::max('id');
        return View::make('athome.create')->with('maxid',$maxid);
    }
    public function store()
    {
        $rules = array(
            'led1'=>'required',
            'sensors1' => 'required|numeric|Min:-50|Max:80',
            'sensors2' => 'required|numeric|Min:-50|Max:80',
            'temperature' => 'required|numeric|Min:-50|Max:80'
        );
        $validator = Validator::make(Input::all(), $rules);
        if ($validator->fails()) {
            return Redirect::to('athome/create')
                ->withErrors($validator)
                ->withInput(Input::except('password'));
        } else {
            $nerd = new Athomes;
            $nerd->sensors1       = Input::get('sensors1');
            $nerd->sensors2       = Input::get('sensors2');
            $nerd->temperature    = Input::get('temperature');
            $nerd->led1              = Input::get('led1');
            $nerd->save();
            Session::flash('message', 'Successfully created athome!');
            return Redirect::to('athome');
        }
    }
    public function show($id)
    {
        $myid=Athomes::find($id);
        $maxid=Athomes::where('id','=',$id)
                        ->select('id','temperature','sensors1','sensors2','led1')
                        ->get();
        return Response::json($maxid);
    }
    public function edit($id)
    {
        $athome = Athomes::find($id);
        return View::make('athome.edit')
            ->with('athome', $athome);
    }
    public function update($id)
    {
        $rules = array(
            'led1'=>'required|',
            'sensors1' => 'required|numeric|Min:-50|Max:80',
            'sensors2' => 'required|numeric|Min:-50|Max:80',
            'temperature' => 'required|numeric|Min:-50|Max:80'
        );
        $validator = Validator::make(Input::all(), $rules);
        if ($validator->fails()) {
            return Redirect::to('athome/' . $id . '/edit')
                ->withErrors($validator);
        } else {
            $nerd = Athomes::find($id);
            $nerd->sensors1       = Input::get('sensors1');
            $nerd->sensors2       = Input::get('sensors2');
            $nerd->temperature    = Input::get('temperature');
            $nerd->led1              = Input::get('led1');
            $nerd->save();
            Session::flash('message', 'Successfully created athome!');
            return Redirect::to('athome');
        }
    }
    public function destroy($id)
    {
        $athome = Athomes::find($id);
        $athome->delete();
        if(is_null($athome))
        {
             return Response::json('Todo not found', 404);
        }
        Session::flash('message', 'Successfully deleted the nerd!');
        return Redirect::to('athome');
    }
}

希望你能讀懂,沒有的話,繼續(xù)。

下面這部分來自于之前的博客,這里就不多加論述了。 這個(gè)也就是我們要的模板,

14.3.1 修改Create()

public function create()
{
    $maxid=Athomes::max('id');
    return View::make('athome.create')->with('maxid',$maxid);
}

這里需要在app/views/創(chuàng)建一個(gè)athome里面創(chuàng)建一個(gè)create.blade.php,至于maxid,暫時(shí)還不需要,后面會(huì)用到show。如果只需要模板,可以簡化為

public function create()
{
    return View::make('athome.create');
}

這里只是對其中代碼的進(jìn)行一下說明。

14.3.2 創(chuàng)建前臺頁面

14.3.2.1 開始之前

由于使用到了bootstrap以及bootstrap-select,記得添加css。

<link rel="stylesheet" type="text/css" href="<?= url('css/bootstrap.min.css') ?>" />
<link rel="stylesheet" type="text/css" href="<?= url('css/bootstrap-select.min.css') ?>" />

以及javascript

<script type="text/javascript" src="https://atts.w3cschool.cn/attachments/image/cimg/jquery.min.js')?>"></script>
<script type="text/javascript" src="https://atts.w3cschool.cn/attachments/image/cimg/bootstrap.min.js') ?>"></script>
<script type="text/javascript" src="https://atts.w3cschool.cn/attachments/image/cimg/script>
<script>
$('.selectpicker').selectpicker();
</script>

14.3.2.2 創(chuàng)建資源頁面

這里用到的是之前提到的那個(gè)作者寫下的,稍微修改了一下。

<div class="row-fluid">
  {{ HTML::ul($errors->all()) }}
  {{ Form::open(array('url' => 'athome')) }}
     <div class="form-group">
          {{ Form::label('led1', '開關(guān)1') }}
          {{ Form::select('led1',array('關(guān)','開'),$selected=NULL,array('class'=>'selectpicker')) }}
      </div>
      <div class="form-group">
          {{ Form::label('sensors1', 'sensors1') }}
          {{ Form::text('sensors1', Input::old('sensors1'), array('class' => 'form-control')) }}
      </div>
      <div class="form-group">
          {{ Form::label('sensors2', 'sensors2') }}
          {{ Form::text('sensors2', Input::old('sensors2'), array('class' => 'form-control')) }}
      </div>
      <div class="form-group">
          {{ Form::label('temperature', 'temperature') }}
          {{ Form::text('temperature', Input::old('temperature'), array('class' => 'form-control')) }}
      </div>
      {{ Form::submit('Create!', array('class' => 'btn btn-primary')) }}
  {{ Form::close() }}
  </div>

開關(guān)一開始打算用 checkbox,加上 bootstrap-switch 實(shí)現(xiàn)

ON  OFF

弱弱地覺得還是沒掌握好的節(jié)奏,所以最后用 select 來實(shí)現(xiàn)。

還需要修改一下之前的 create(),添加一行

return Redirect::to('athome');

也就是添加完后,重定向到首頁查看,最后例子給出的 create 如下

public function store()
{
    $rules = array(
        'led1'=>'required',
        'sensors1' => 'required|numeric|Min:-50|Max:80',
        'sensors2' => 'required|numeric|Min:-50|Max:80',
        'temperature' => 'required|numeric|Min:-50|Max:80'
    );
    $validator = Validator::make(Input::all(), $rules);
    if ($validator->fails()) {
        return Redirect::to('athome/create')
            ->withErrors($validator);
    } else {
        // store
        $nerd = new Athomes;
        $nerd->sensors1       = Input::get('sensors1');
        $nerd->sensors2       = Input::get('sensors2');
        $nerd->temperature    = Input::get('temperature');
        $nerd->led1            = Input::get('led1');
        $nerd->save();
        Session::flash('message', 'Successfully created athome!');
        return Redirect::to('athome');
    }
}

效果圖:

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號