laravel5.5手寫教程3的基於資源路由的CURD操做(適合初學者)

本文我將結合簡單例子,完成laravel框架下的增刪改查,但願會對你們有所幫助。
在進行以前,你們應該保證本身的數據庫連接無誤,artisan命令能正常使用,路由連接無問題。php

1、建立控制器、路由
避免影響其餘路由,咱們先註釋掉以前聯繫時編寫的全部路由。
由於上一章咱們已經學會創建了資源控制器,這裏再次複習一下。
1)打開CMD並切換到項目根目錄
2)建立REST風格的控制器css

php artisan make:controller NewsController --resource

3)建立資源路由打開routes/web.php,輸入:html

Route::resource('/','NewsController');

2、展現頁面
當咱們訪問URL 127.0.0.1:9999時,經過資源路由訪問的是NewsController控制器裏的index方法。此刻咱們在控制器裏引入Model類,經過Eloquent ORM方法,往視圖層引入參數。
圖片描述前端

此時咱們須要建立視圖層,位置在resourcec/views/news/index.blade.php。
具體代碼以下:jquery

<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">
                            {!! implode('<br>', $errors->all()) !!}
                        </div>
                    @endif

                    <a href="{{ url('/create') }}" class="btn btn-lg btn-primary">新增</a>

                    @foreach ($news as $new)
                        <hr>
                        <div class="article">
                            <h4>{{ $new->title }}</h4>
                            <div class="content">
                                <p>
                                    {{ $new->content }}
                                </p>
                            </div>
                        </div>
                        <a href="{{ url('/'.$new->id.'/edit') }}" class="btn btn-success">編輯</a>
                        <form action="{{ url('/'.$new->id) }}" method="POST" style="display: inline;">
                            {{ method_field('DELETE') }}
                            {{ csrf_field() }}
                            <button type="submit" class="btn btn-danger">刪除</button>
                        </form>
                    @endforeach

                </div>
            </div>
        </div>
    </div>
</div>

下面咱們訪問頁面:127.0.0.1:9999,查看數據展現狀況以下:
圖片描述laravel

如上圖,咱們的列表展現已經完成,不過由於時間問題,界面未加前端樣式,你們不要在乎,至此,咱們的展現頁面完成。web

3、增長頁面
由於展現頁面點擊新增後,頁面經過路由跳轉到News控制器的create方法下:create方法以下:
圖片描述ajax

上圖咱們要注意,在laravel中,視圖url連接能夠用「 / 」分割,也能夠用「 . 」來分割,後者看起來更爲優雅一些。數據庫

<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>
                            {!! implode('<br>', $errors->all()) !!}
                        </div>
                    @endif

                    <form action="{{ url('/') }}" method="POST">
                        {!! csrf_field() !!}
                        <input type="text" name="title" class="form-control" required="required" placeholder="請輸入標題">
                        <br>
                        <textarea name="content" rows="10" class="form-control" required="required" placeholder="請輸入內容"></textarea>
                        <br>
                        <button class="btn btn-lg btn-info">新增文章</button>
                    </form>

                </div>
            </div>
        </div>
    </div>
</div>

(上面代碼中的{!! csrf_field() !!} 是爲了防CSRF攻擊的,每一個表單都必須存在。)
web頁面:
圖片描述bootstrap

根據資源路由,提交該表單後,會經過路由,提交到News控制器的store方法下:
此刻輸入以下代碼:

/**
 * Store a newly created resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function store(Request $request)
{
   var_dump($request->all());
}

打印出來傳遞過來的全部變量,以下所示:

clipboard.png

咱們能夠看到傳遞過來的參數除了表字段外還有CSRF驗證碼,_token字段,因此若是去掉這個字段,跳轉是不會成功的。
此時咱們能夠經過get 或者post來接收參數並賦值給數組,而後經過Eloquent 方法來入庫,具體操做以下:

/**
 * Store a newly created resource in storage.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return \Illuminate\Http\Response
 */
public function store(Request $request)
{
    // 對提交過來的數據進行數據驗證
    $this->validate($request, [
        'title' => 'required|unique:news|max:255', // 必填、在 news 表中惟1、最大長度 255
        'content' => 'required', // 必填
    ]);

    // 經過 News Model 插入一條數據進 news 表
    $news = new News; // 初始化 Article 對象
    $news->title = $request->get('title'); // 將 POST 提交過了的 title 字段的值賦給 news 的 title 屬性
    $news->content = $request->get('content'); // 同上

    // 將數據保存到數據庫,經過判斷保存結果,控制頁面進行不一樣跳轉
    if ($news->save()) {
        return redirect('/'); // 保存成功,跳轉到 文章管理 頁
    } else {
        // 保存失敗,跳回來路頁面,保留用戶的輸入,並給出提示
        return redirect()->back()->withInput()->withErrors('保存失敗!');
    }
}

此刻咱們能夠看到頁面:

clipboard.png

添加失敗,咱們分析緣由能夠得出是由於在進行數據庫save()時,laravel會自動多出兩個字段updated_at和created_at,而咱們的表是手動建的,並無這兩個字段,那如何取消呢?
咱們只須要往模型層加入屬性:

public $timestamps = false;

便可添加完成,併成功跳轉到新聞列表頁面,至此表單的簡單添加完成。

4、刪除頁面
接下來咱們來看一下刪除頁面,相對於添加來講,刪除頁面尤其簡單,咱們是經過展現頁面中的
刪除按鈕來經過表單提交方式進行刪除操做,index.blade.php裏面是這樣寫的。

<form action="{{ url('/'.$new->id) }}" method="POST" style="display: inline;">
                            {{ method_field('DELETE') }}
                            {{ csrf_field() }}
                            <button type="submit" class="btn btn-danger">刪除</button>
                        </form>

能夠看到表單中的提交方法仍然是POST,而爲了讓資源路由識別,咱們加上了{{ method_field('DELETE') }}這段代碼 ,他的做用等同於
<input type="hidden" name="_method" value="DELETE">
提交後,會把該條數據的ID傳遞到資源控制器的destroy方法內,下面咱們來實現如下:
根據咱們路由裏寫的:

Route::resource('/','NewsController');

此刻咱們會發現,點擊刪除按鈕後竟然報404錯誤,跳轉路徑爲127.0.0.1/{id} ,確認刪除的表單按鈕傳遞參數無誤以後,咱們在cmd中輸入 php artisan route:list,能夠看到下面的資源路由信息:

clipboard.png
咱們能夠看到資源路由器的更新和刪除,以及查詢方法的URL路徑是{},既花括號裏是沒有值,這樣子是找不到網頁的,因此咱們須要經過從新命名路由來實現即改成:

Route::resource('comment','NewsController');

這樣咱們再看:

clipboard.png
此時URL中的變量是有值的。這裏咱們要注意記得修改index.blade.php 以及 create.blade.php 視圖頁面的跳轉url路徑加上comment。
咱們繼續完成NewsController控制器裏的destroy刪除方法:

/**
 * Remove the specified resource from storage.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function destroy($id)
{
    News::find($id)->delete();
    return redirect()->back()->withInput()->withErrors('刪除成功!');
}

至此,表單的簡單刪除已經完成,若是須要作ajax刪除的時候,只須要把id傳遞到控制器進行刪除,須要重寫方法,此時就須要繼續定義路由。

5、修改頁面
當咱們點擊index.blade.php頁面的修改以後,經過cmd裏的路由資源列表能夠知道,正確路徑應該是經過超連接把id傳遞到控制器的edit方法裏了。

「<a href="{{ url('/'.$new->id.'/edit') }}" class="btn btn-success">編輯</a>」

此時edit方法代碼以下:

/**
 * Show the form for editing the specified resource.
 *
 * @param  int  $id
 * @return \Illuminate\Http\Response
 */
public function edit($id)
{
    //        var_dump(News::find($id)->toArray());
    return view('news.edit')->withNew(News::find($id));
}

經過Eloquent 對象關係映射獲取到該ID對應的該條信息,傳遞到視圖層中,並展現出來:
edit.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>Learn Laravel 5</title>

        <link href="//cdn.bootcss.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
        <script src="//cdn.bootcss.com/jquery/1.11.1/jquery.min.js"></script>
        <script src="//cdn.bootcss.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
    </head>
    <body>
        <div id="content" style="padding: 50px;">

    <div id="comments" style="margin-top: 50px;">

        @if (count($errors) > 0)
            <div class="alert alert-danger">
                <strong>操做失敗</strong> 輸入不符合要求<br><br>
                {!! implode('<br>', $errors->all()) !!}
            </div>
        @endif

        <div id="new">
            <form action="{{ url('comment/'.$new->id) }}" method="POST">
                {!! csrf_field() !!}
                {{--<input type="hidden" name="id" value="{{ $comment->id }}">--}}
                <input type="hidden" name="_method" value="put">
                <div class="form-group">
                    <label>Title</label>
                    <input type="text" name="title" class="form-control" style="width: 300px;" required="required" value="{{$new->title}}">
                </div>
                <div class="form-group">
                    <label>Content</label>
                    <textarea name="content"  class="form-control" rows="10" required="required">{{$new->content}}</textarea>
                </div>
                <button type="submit" class="btn btn-lg btn-success col-lg-12">修改提交</button>
            </form>
        </div>

        <script>
            function reply(a) {
                var nickname = a.parentNode.parentNode.firstChild.nextSibling.getAttribute('data');
                var textArea = document.getElementById('newFormContent');
                textArea.innerHTML = '@'+nickname+' ';
            }
        </script>
    </div>
</div>
    </body>
</html>

修改好後表單提交,經過資源路由提交到NewsController控制器的update方法內,而後咱們在update內先打印出$request->all()的值,能夠獲得下面數據:

clipboard.png
而後ID也已經傳過來了,咱們經過數據庫修改便可完成修改功能,餘下代碼以下:

/**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
//        var_dump($request->all());
        $comment = News::findOrFail($id);
        $comment->title = $request->get('title');
        $comment->content = $request->get('content');
        if($comment->save()){
            return redirect('comment/');
        }else{
            return redirect()->back()->withInput()->withErrors('保存信息失敗');
        }
    }

便可完成修改,成功後跳轉到列表頁面。學到這裏咱們不難發現,這個Laravel自帶的Eloquent ORM 是一個優美,穩定,簡潔的ActiveRecord實現。

相關文章
相關標籤/搜索