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 页面编码声明方法详解(header或meta)
Mar 12 PHP
linux iconv方法的使用
Oct 01 PHP
windows下zendframework项目环境搭建(通过命令行配置)
Dec 06 PHP
PHP flock 文件锁详细介绍
Dec 29 PHP
PHP_SELF,SCRIPT_NAME,REQUEST_URI区别
Dec 24 PHP
PHP向socket服务器收发数据的方法
Jan 24 PHP
Adnroid 微信内置浏览器清除缓存
Jul 11 PHP
php cookie工作原理与实例详解
Jul 18 PHP
基于PHP实现栈数据结构和括号匹配算法示例
Aug 10 PHP
laravel项目利用twemproxy部署redis集群的完整步骤
May 11 PHP
PHP微信发送推送消息乱码的解决方法
Feb 28 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
Apr 17 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
php5.5新数组函数array_column使用
2013/07/08 PHP
PHP实现的简单网络硬盘
2015/07/29 PHP
php求今天、昨天、明天时间戳的简单实现方法
2016/07/28 PHP
谈谈php对接芝麻信用踩的坑
2016/12/01 PHP
PHP自动识别当前使用移动终端
2018/05/21 PHP
Laravel框架使用monolog_mysql实现将系统日志信息保存到mysql数据库的方法
2018/08/16 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
2019/10/15 PHP
完美解决JS中汉字显示乱码问题(已解决)
2006/12/27 Javascript
javascript hashtable实现代码
2009/10/13 Javascript
js去除空格的12种实用方法
2013/11/08 Javascript
JavaScript图片放大技术(放大镜)实现代码分享
2013/11/14 Javascript
JQuery判断HTML元素是否存在的两种解决方法
2013/12/26 Javascript
中止javascript执行的方法
2014/02/14 Javascript
js图片预加载示例
2014/04/30 Javascript
处理文本部分内容的TextRange对象应用实例
2014/07/29 Javascript
百度地图给map添加右键菜单(判断是否为marker)
2016/03/04 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
2019/08/23 Javascript
js实现网页随机验证码
2020/10/19 Javascript
Python中列表元素转为数字的方法分析
2016/06/14 Python
python交互式图形编程实例(二)
2017/11/17 Python
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
详解Python使用tensorflow入门指南
2018/02/09 Python
Python数据可视化 pyecharts实现各种统计图表过程详解
2019/08/15 Python
利用pandas向一个csv文件追加写入数据的实现示例
2020/04/23 Python
快速一键生成Python爬虫请求头
2021/03/04 Python
如何用SQL语句进行模糊查找
2015/09/25 面试题
英语专业毕业生自荐信
2013/10/28 职场文书
母亲80寿诞答谢词
2014/01/16 职场文书
放飞梦想演讲稿
2014/05/05 职场文书
2015年推普周活动总结
2015/03/27 职场文书
因工资原因离职的辞职信范文
2015/05/12 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书
Alexa停服!网站排名将何去何从?目前还没有替代品。
2022/04/15 杂记
python manim实现排序算法动画示例
2022/08/14 Python