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 相关文章推荐
php提示undefined index的几种解决方法
May 21 PHP
如何使用FireFox插件FirePHP调试PHP
Jul 23 PHP
php操作xml
Oct 27 PHP
PHP实例分享判断客户端是否使用代理服务器及其匿名级别
Jun 04 PHP
php项目中百度 UEditor 简单安装调试和调用
Jul 15 PHP
php实现zip文件解压操作
Nov 03 PHP
PHP命名空间namespace用法实例分析
Sep 27 PHP
PHP基于DOM创建xml文档的方法示例
Feb 08 PHP
PHP实现更改hosts文件的方法示例
Aug 08 PHP
PHP之多条件混合筛选功能的实现方法
Oct 09 PHP
laravel框架查询数据集转为数组的两种方法
Oct 10 PHP
PHP正则表达式函数preg_replace用法实例分析
Jun 04 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
用PHP实现多级树型菜单
2006/10/09 PHP
PHPUnit PHP测试框架安装方法
2011/03/23 PHP
PHP框架Swoole定时器Timer特性分析
2014/08/19 PHP
PHP微信开发之文本自动回复
2016/06/23 PHP
一段实时更新的时间代码
2006/07/07 Javascript
PPK 谈 JavaScript 的 this 关键字 [翻译]
2009/09/29 Javascript
Javascript中Event属性搜集整理
2013/09/17 Javascript
JavaScript中window.showModalDialog()用法详解
2014/12/18 Javascript
自己封装的常用javascript函数分享
2015/01/07 Javascript
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
JS/jQ实现免费获取手机验证码倒计时效果
2016/06/13 Javascript
JavaScript编码风格指南(中文版)
2016/08/26 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
jQuery实现的无缝广告图片左右滚动功能详解
2016/12/24 Javascript
如何利用JQuery实现从底部回到顶部的功能
2016/12/27 Javascript
微信小程序联网请求的轮播图
2017/07/07 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
原生JavaScript实现拖动校验功能
2020/09/29 Javascript
用Python编写脚本使IE实现代理上网的教程
2015/04/23 Python
Python实现简单的四则运算计算器
2016/11/02 Python
详解Python中for循环是如何工作的
2017/06/30 Python
python实现求特征选择的信息增益
2018/12/18 Python
Python实现的IP端口扫描工具类示例
2019/02/15 Python
Tensorflow 多线程设置方式
2020/02/06 Python
一文轻松掌握python语言命名规范规则
2020/06/18 Python
Android本地应用打开方法——通过html5写连接
2016/03/11 HTML / CSS
html5中svg canvas和图片之间相互转化思路代码
2014/01/24 HTML / CSS
html5使用canvas绘制太阳系效果
2014/12/15 HTML / CSS
Kathmandu澳洲户外商店:新西兰户外运动品牌
2017/11/12 全球购物
德国亚马逊官方网站:Amazon.de
2020/11/15 全球购物
教研活动总结
2014/04/28 职场文书
个人收入证明模板
2014/09/18 职场文书
2016党员三严三实心得体会
2016/01/15 职场文书
用Python爬取各大高校并可视化帮弟弟选大学,弟弟直呼牛X
2021/06/11 Python
Java实现经典游戏泡泡堂的示例代码
2022/04/04 Java/Android
Springboot集成kafka高级应用实战分享
2022/08/14 Java/Android