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 之 没有mysql支持时的替代方案
Oct 09 PHP
php 输出双引号&quot;与单引号'的方法
May 09 PHP
phpmyadmin3 安装配置图解教程
Mar 29 PHP
PHP引用符&amp;的用法详细解析
Aug 22 PHP
PHP中array_keys和array_unique函数源码的分析
Feb 26 PHP
Zend Framework动作助手Json用法实例分析
Mar 05 PHP
PHP中header函数的用法及其注意事项详解
Jun 13 PHP
简单PHP会话(session)说明介绍
Aug 21 PHP
thinkPHP5.0框架API优化后的友好性分析
Mar 17 PHP
实例分析PHP中PHPMailer发邮件
Dec 13 PHP
PHP使用两个栈实现队列功能的方法
Jan 15 PHP
PHP判断是否是微信打开还是浏览器打开的方法
Feb 27 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
NT IIS下用ODBC连接数据库
2006/10/09 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
2014/06/23 PHP
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
PHP机器学习库php-ml的简单测试和使用方法
2017/07/14 PHP
php使用redis的有序集合zset实现延迟队列应用示例
2020/02/20 PHP
Prototype使用指南之selector.js
2007/01/10 Javascript
javascript实现的像java、c#之类的sleep暂停的函数代码
2010/03/04 Javascript
javascript针对DOM的应用分析(三)
2012/04/15 Javascript
JavaScript子窗口ModalDialog中操作父窗口对像
2012/12/11 Javascript
JavaScript实现复制功能各浏览器支持情况实测
2013/07/18 Javascript
JavaScript使用indexOf获得子字符串在字符串中位置的方法
2015/04/06 Javascript
详解JavaScript表单验证(E-mail 验证)
2016/03/31 Javascript
浅谈jquery点击label触发2次的问题
2016/06/12 Javascript
浅析Bootstrap表格的使用
2016/06/23 Javascript
原生js实现简单的链式操作
2017/07/04 Javascript
vue2使用keep-alive缓存多层列表页的方法
2018/09/21 Javascript
React 组件渲染和更新的实现代码示例
2019/02/21 Javascript
node.js实现简单的压缩/解压缩功能示例
2019/11/05 Javascript
Vue+tracking.js 实现前端人脸检测功能
2020/04/16 Javascript
[49:43]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
Python全局变量操作详解
2015/04/14 Python
python利用paramiko连接远程服务器执行命令的方法
2017/10/16 Python
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
解决pandas read_csv 读取中文列标题文件报错的问题
2018/06/15 Python
Python将一个CSV文件里的数据追加到另一个CSV文件的方法
2018/07/04 Python
python颜色随机生成器的实例代码
2020/01/10 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
2020/01/19 Python
python:解析requests返回的response(json格式)说明
2020/04/30 Python
一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃
2020/11/02 Python
Python3 用matplotlib绘制sigmoid函数的案例
2020/12/11 Python
罗兰·穆雷官网:Roland Mouret
2018/09/28 全球购物
碧欧泉Biotherm加拿大官方网站:法国高端护肤品牌
2019/10/18 全球购物
《充气雨衣》教学反思
2014/04/07 职场文书
基层党员学习党的群众路线教育实践活动心得体会
2014/11/04 职场文书
Python Socket编程详解
2021/04/25 Python
vue使用refs获取嵌套组件中的值过程
2022/03/31 Vue.js