Laravel入门教程——一个简单cms的实现(05)

作者: douyasi
网站:https://douyasi.com/category/startlaravel/
备注:本教程是在当前最新Laravel稳定版v4.2.X下实现的,其它相异版本如果有问题请自行排除。
本文为作者原创记录,转载请保留署名与来源。

RESTFUL路由与控制器

RESTFUL详解

资源控制器可以简单的建立跟资源相关的 RESTful 控制器。下面,我们开始演示操作文章资源。

命令行执行以下命令建立控制器:

php artisan controller:make ArticleController

然后我们可以注册一个资源化路由至控制器上:

Route::resource('article', 'ArticleController');

打开 /app/controllers/ 目录,我们可以看见框架已经自动地给我们生成 ArticleController.php 文件,打开我们看看,大致可以看到以下结构:

<?php

class ArticleController extends \BaseController {

    /**
     * Display a listing of the resource.
     *
     * @return Response
     */
    public function index()
    {
        //
    }


    /**
     * Show the form for creating a new resource.
     *
     * @return Response
     */
    public function create()
    {
        //
    }


    /**
     * Store a newly created resource in storage.
     *
     * @return Response
     */
    public function store()
    {
        //
    }


    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return Response
     */
    public function show($id)
    {
        //
    }


    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return Response
     */
    public function edit($id)
    {
        //
    }


    /**
     * Update the specified resource in storage.
     *
     * @param  int  $id
     * @return Response
     */
    public function update($id)
    {
        //
    }


    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return Response
     */
    public function destroy($id)
    {
        //
    }

}

框架自动给我生成了 indexcreatestoreshoweditupdatedestroy 7个方法。那么,这7个对应具体那些页面和操作呢,我们来看下官网帮助手册。

VerbPathActionRoute Name
GET/resourceindexresource.index
GET/resource/createcreateresource.create
POST/resourcestoreresource.store
GET/resource/{resource}showresource.show
GET/resource/{resource}/editeditresource.edit
PUT/PATCH/resource/{resource}updateresource.update
DELETE/resource/{resource}destroyresource.destroy

简单的来说就是:

index用于展示资源列表(页面);create用于展示新建资源(页面);store用于接受POST过来的数据,存储新资源数据到数据库;show用于展示特定id的资源(页面);edit用于展示编辑特定id资源(页面);update用于接受PUTPATCH过来的数据,更新特定id资源数据到数据库;destroy使用DELETE方式从数据库里实际删除特定id资源。

好了,我们依次安装上面方法来写控制器和视图。

资源页面和控制器

index方法

index用于展示资源列表,我们先把这个页面模版(位于/apps/views/article/index.blade.php)给套出来,具体模版写作与套用就不说,这里我们完善下index方法(这里我们没有触及分页等操作),把数据传入视图中。

    public function index()
    {
        $arts = Article::all();
        return View::make('article.index')->with('arts',$arts);
    }

访问 http://{locdomain}/article 展示出来的页面如下图:

article_index

create方法

create 方法用于显示创建新资源页面,我们先把这个页面模版(位于/apps/views/article/create.blade.php)给套出来,完善下 create 方法。

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

访问http://{locdomain}/article/create展示出来的页面如下图:

article_create

store方法

store 方法用于接受 post 过来的数据,将接受过来的经过数据验证,验证通过之后,写入到数据库中。 完善下 store 方法,这里我们略去数据校验那一块东西,直接假定它合法存入数据库中。

    public function store()
    {
        $art = new Article;
        $art->title = Input::get('title');
        $art->content = Input::get('text_editor');
        $art->slug = Input::get('slug');
        $art->created_at = $art->updated_at  = date('Y-m-d H:i:s');
        $art->save();
    }

存储数据使用到 Eloquent ORM

show方法

show 方法用于显示某个特定 id 的资源,这里没啥好说的,由于文章的显示主要是在前台,这里我们简单的打印输出下变量。

    public function show($id)
    {
        $art = Article::find($id);
        var_dump($art);
    }

edit方法

edit 方法用于修改特定 id 资源的页面,我们先把这个页面模版(位于/apps/views/article/edit.blade.php)给套出来。

这里简单说下,由于 edit 页面要使用 PUTPATCH 方法向服务器传输修改请求的数据,我们需要对表单进行改造,由于某些低版本的浏览器对PUT/PATCH/DELETE请求方法支持的不是很好,所以,Laravel本身提供了一个很好的倒退兼容解决方法:

仍然使用 POST 方法,但在表单中提供一个 name_methodvaluePUTPATCH 的隐藏域,以便Laravel 能够很好地处理 PUT/PATCH 过来的数据。

只要在模版表单中使用以下标签即可:

{{ Form::open( array('url' => 'article/'.$art->id, 'method' => 'put') ) }}
......
{{ Form::close() }}

或者

<form action="{{ url('article') }}" method="post">
<input type="hidden" name="_method" value="PUT">
......
</form>

节奏我们完善下 edit 方法:

    public function edit($id)
    {
        $art = Article::find($id);
        return View::make('article.edit')->with('art',$art);
    }

访问 http://{locdomain}/article/2/edit 展示出来的页面如下图:

article_edit

edit 页面需要把原始的数据 value 传入模版中。

update 方法

update 方法接受 edit 页面 PUTPATCH 过来的数据,理应也对数据进行校验,校验通过之后,写入数据库。这里,我们仍然略去了校验一步,update 方法代码如下:

    public function update($id)
    {
        //
        $art = Article::find($id);
        $art->title = Input::get('title');
        $art->content = Input::get('text_editor');
        $art->slug = Input::get('slug');
        $art->updated_at  = date('Y-m-d H:i:s');
        $art->save();
    }

destroy方法

destroy 方法,使用 DELETE 方式来删除特定 id 资源。类似于 PUT/PATCH 方式,Laravel也提供了一个倒退兼容解决方案。

仍然使用 POST 方法,但在表单中提供一个 name_methodvalueDELETE 的隐藏域,以便 Laravel 能够很好地通过 DELETE 方式删除特定资源数据。

只要在模版表单中使用以下标签即可:

{{ Form::open( array('url' => 'article/'.$art->id, 'method' => 'delete') ) }}
......
{{ Form::close() }}

或者

<form action="{{ url('article') }}" method="post">
<input type="hidden" name="_method" value="DELETE">
......
</form>

如果我们使用 jQuery 来实现删除某个特定的资源,可以使用它常规的 POST Ajax 方式。这里有个相关演示 jQuery 代码:

    $('.delete_item').click(function(){
        var id = $(this).data('id');
        $.ajax({
                type: "POST",
                url: "{{ url('article') }}" + '/' + id,
                data: "_method=DELETE&_token={{{ csrf_token() }}}>",
                success: function(msg){
                if(msg == 1)
                {
                    alert( "删除:成功" );
                }
                else{
                    alert( "删除:失败" );
                }
            }
        });
    });

注意到 data 那一行,我们将 _method=DELETE_token={{{ csrf_token() }}} 两个隐藏域值通过常规的 POST 方式传递过去了。后面的 _token 是为了抵制 CSRF(跨站请求伪造)的令牌值。

好了到此,这一节我们完整讲解了 RESTFUL 的路由及其控制器。下一节,我们开始铺垫下数据校验与前台文章页面的显示等内容。

标签:laravel