Laravel 5框架学习之子视图和表单复用


Posted in PHP onApril 09, 2015

我们需要处理编辑文章的问题。当然我们可以手工添加新的路由,就像这样:

Route::get('/articles/{id}/edit', 'ArticleController@edit');

让我们在命令行下使用 artisan 的 route:list 来查看我们当前的路由:

php artisan route:list

在符合 RESTful 的情况下,可能直接使用 laravel 的 resource 路由是一种好的选择,然我们将所有的路由都去掉,只添加唯一的一个:

Route::resource('articles', 'ArticlesController');

再次使用 php artisan route:list 查看路由,哇,一堆的符合我们期望的路由产生了。每一项都仔细查看一下。

现在在控制器中添加方法:

public function edit($id) {
    $article = Article::findOrFail($id);

    return view('articles.edit', compact('article'));
  }

现在创建视图

@extends('layout')

@section('content')
  <h1>Edit: {!! $article->title !!} </h1>

  <hr/>

  ...

好吧,我承认这些代码都是从 create.blade.php 中拷贝出来的,修改了一下,问题是我们需要重复吗?后面我们会处理这个问题,现在来看一下表单的提交问题。在路由中 php artisan route:list ,再看一遍,修改使用了 PATCH 方法,我们来修改视图:

{!! Form::open(['method' => 'PATCH', 'url' => 'articles/' . $article->id]) !!}

在浏览器中访问 /articles/1/edit ,查看一下源代码,发现laravel自动生成了 _method=PATCH 的隐藏字段。

一问题是,我们编辑文章,但是文章的信息并没有显示出来,我们修改一下视图:

 {!! Form::model($article, ['method' => 'PATCH', 'url' => 'articles/' . $article->id]) !!}

OK,everything's ok,除了 published_on 字段仍然设置为当前日期,后面我们来处理。

现在在控制器中添加方法:

public function update($id, \Illuminate\Http\Request $request) {
    $article = Article::findOrFail($id);
    $article->update($request->all());

    return redirect('articles');
  }

我们在修改的过程中也需要验证,让我们复用我们的 Request 类,将 CreateArticleRequest 更名为更通用的 ArticleRequest,别忘了修改 store 方法中的参数。

public function update($id, Requests\ArticleRequest $request) {
    $article = Article::findOrFail($id);
    $article->update($request->all());

    return redirect('articles');
  }

现在剩下的问题是我们的新建和编辑使用了大部分相同的代码,比如显示错误,但他们存在两份,我们来修改这个问题。

我们直接在 views/articles 下面新建文件 list.blade.php,并把错误处理代码从 create.blade.php 中拷贝出来:

@if ($errors->any())
  <ul class="alert alert-danger">
    @foreach($errors->all() as $error)
      <li>{{ $error }}</li>
    @endforeach
  </ul>
@endif

在 create.blade.php 只需用下面语句替换错误处理代码即可:

@include('articles.list')

让我们再来处理表单代码,表单代码中除了 form 不大一样和提交按钮有区别,其他都差不多。我们创建一个视图 articles/form_partial.blade.php,将代码拷贝出来

<div class="form-group">
  {!! Form::label('title', 'Title:') !!}
  {!! Form::text('title', null, ['class' => 'form-control']) !!}
</div>

<div class="form-group">
  {!! Form::label('body', 'Body:') !!}
  {!! Form::textarea('body', null, ['class' => 'form-control']) !!}
</div>

<div class="form-group">
  {!! Form::label('published_at', 'Publish On:') !!}
  {!! Form::input('date', 'published_at', date('Y-m-d'), ['class' => 'form-control']) !!}
</div>

<div class="form-group">
  {{--这里要设置变量,依据是编辑还是修改来改变,当然也可以不放置在partial中--}}
  {!! Form::submit($submitButtonText, ['class' => 'btn btn-primary form-control']) !!}
</div>

修改 create.blade.php

@extends('layout')

@section('content')
  <h1>Write a New Article</h1>

  <hr/>

  @include('articles.list')

  {{--使用我们添加的 illuminate\html 开源库--}}
  {!! Form::open(['url' => 'articles']) !!}
    @include('articles.form_partial', ['submitButtonText' => 'Add Article'])
  {!! Form::close() !!}

@stop

修改 edit.blade.php

@extends('layout')

@section('content')
  <h1>Edit: {!! $article->title !!} </h1>

  <hr/>

  @include('articles.list')
  {{--使用我们添加的 illuminate\html 开源库--}}
  {!! Form::model($article, ['method' => 'PATCH', 'url' => 'articles/' . $article->id]) !!}
  @include('articles.form_partial', ['submitButtonText' => 'Update Article'])

  {!! Form::close() !!}

@stop

以上就是本文给大家介绍的全部内容了,希望能够对大家熟练掌握Laravel5框架有所帮助。

PHP 相关文章推荐
用Flash图形化数据(二)
Oct 09 PHP
PHP中的正则表达式函数介绍
Feb 27 PHP
php控制linux服务器常用功能 关机 重启 开新站点等
Sep 05 PHP
php一行代码获取文件后缀名实例分析
Nov 12 PHP
php中stdClass的用法分析
Feb 27 PHP
PHP Warning: Module 'modulename' already loaded in问题解决办法
Mar 16 PHP
Symfony2使用第三方库Upload制作图片上传实例详解
Feb 04 PHP
php事件驱动化设计详解
Nov 10 PHP
PHP实现RTX发送消息提醒的实例代码
Jan 03 PHP
Thinkphp3.2实用篇之计算型验证码示例
Feb 09 PHP
PHP Post获取不到非表单数据的问题解决办法
Feb 27 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
Nov 13 PHP
php判断文件夹是否存在不存在则创建
Apr 09 #PHP
从wamp到xampp的升级之路
Apr 08 #PHP
Laravel 5框架学习之表单验证
Apr 08 #PHP
Laravel 5框架学习之日期,Mutator 和 Scope
Apr 08 #PHP
Laravel 5框架学习之表单
Apr 08 #PHP
Laravel 5框架学习之模型、控制器、视图基础流程
Apr 08 #PHP
Laravel 5框架学习之Eloquent (laravel 的ORM)
Apr 08 #PHP
You might like
Windows下XDebug 手工配置与使用说明
2010/07/11 PHP
php实现的农历算法实例
2015/08/11 PHP
通过PHP简单实例介绍文件上传
2015/12/16 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
JS+ACTIVEX实现网页选择本地目录路径对话框
2013/03/18 Javascript
获取offsetTop和offsetLeft值的js代码(兼容)
2013/04/16 Javascript
js Array对象的扩展函数代码
2013/04/24 Javascript
JavaScript中for..in循环陷阱介绍
2013/11/12 Javascript
alert出数组中的随即值代码
2014/09/25 Javascript
AngularJS指令与指令之间的交互功能示例
2016/12/14 Javascript
ionic选择多张图片上传的示例代码
2017/10/10 Javascript
Vue.js2.0中的变化小结
2017/10/24 Javascript
关于axios不能使用Vue.use()浅析
2018/01/12 Javascript
JS基于封装函数实现的表格分页完整示例
2018/06/26 Javascript
JavaScript函数的特性与应用实践深入详解
2018/12/30 Javascript
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
[02:05]2014DOTA2西雅图邀请赛 专访啸天mik夫妻档
2014/07/08 DOTA
Python描述器descriptor详解
2015/02/03 Python
Python实现二分查找算法实例
2015/05/26 Python
python异常和文件处理机制详解
2016/07/19 Python
TensorFlow平台下Python实现神经网络
2018/03/10 Python
mac安装scrapy并创建项目的实例讲解
2018/06/13 Python
Windows下安装Scrapy
2018/10/17 Python
基于PyQt4和PySide实现输入对话框效果
2019/02/27 Python
OpenCV 之按位运算举例解析
2020/06/19 Python
浅谈CSS3特性查询(Feature Query: @supports)功能简介
2017/07/31 HTML / CSS
关于webview适配H5上传照片或者视频文件的方法
2020/11/04 HTML / CSS
viagogo法国票务平台:演唱会、体育比赛、戏剧门票
2017/03/27 全球购物
意大利灯具购物网站:Lampade.it
2018/10/18 全球购物
设计总监岗位职责
2013/12/07 职场文书
服务宗旨标语
2014/07/01 职场文书
解除聘用合同证明书范本
2014/09/11 职场文书
2014年群众路线教育实践活动整改措施
2014/09/24 职场文书
2014年音乐教师工作总结
2014/12/03 职场文书
java开发双人五子棋游戏
2022/05/06 Java/Android
React自定义hook的方法
2022/06/25 Javascript