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 相关文章推荐
利用static实现表格的颜色隔行显示
Oct 09 PHP
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
Dec 06 PHP
人尽可用的Windows技巧小贴士之下篇
Mar 22 PHP
用PHP实现维护文件代码
Jun 14 PHP
php 取得瑞年与平年的天数的代码
Aug 10 PHP
PHP 源代码压缩小工具
Dec 22 PHP
Array of country list in PHP with Zend Framework
Oct 17 PHP
PHP统计二维数组元素个数的方法
Nov 12 PHP
PHP中怎样防止SQL注入分析
Oct 23 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
Nov 21 PHP
PHP使用OB缓存实现静态化功能示例
Mar 23 PHP
PHP设计模式之组合模式定义与应用示例
Feb 01 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 MySQL与分页效率
2008/06/04 PHP
php setcookie(name, value, expires, path, domain, secure) 参数详解
2013/06/28 PHP
一个比较不错的PHP日历类分享
2014/11/18 PHP
php读取远程gzip压缩网页的方法
2014/12/29 PHP
PHP实现Google plus的好友拖拽分组效果
2016/10/21 PHP
PHP表单验证内容是否为空的实现代码
2016/11/14 PHP
php实现文件上传及头像预览功能
2017/01/15 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
js页面滚动时层智能浮动定位实现(jQuery/MooTools)
2011/08/23 Javascript
javascript中的window.location.search方法简介
2013/09/02 Javascript
jquery中获取元素里某一特定子元素的代码
2014/12/02 Javascript
jquery中object对象循环遍历的方法
2015/12/18 Javascript
JavaScript数组去重算法实例小结
2018/05/07 Javascript
浅谈Layui的eleTree树式选择器使用方法
2019/09/25 Javascript
JavaScript修改注册表实例代码
2020/01/05 Javascript
vue实现购物车加减
2020/05/30 Javascript
vue 使用async写数字动态加载效果案例
2020/07/18 Javascript
[05:04]DOTA2上海特级锦标赛主赛事第二日TOP10
2016/03/04 DOTA
分析Python编程时利用wxPython来支持多线程的方法
2015/04/07 Python
python实现文件快照加密保护的方法
2015/06/30 Python
老生常谈python的私有公有属性(必看篇)
2017/06/09 Python
python数据结构之链表详解
2017/09/12 Python
python pands实现execl转csv 并修改csv指定列的方法
2018/12/12 Python
Python实现批量执行同目录下的py文件方法
2019/01/11 Python
对python中类的继承与方法重写介绍
2019/01/20 Python
Django 外键的使用方法详解
2019/07/19 Python
浅析python中while循环和for循环
2019/11/19 Python
Python Opencv 通过轨迹(跟踪)栏实现更改整张图像的背景颜色
2020/03/09 Python
keras.layer.input()用法说明
2020/06/16 Python
CSS3实现菜单悬停效果
2020/11/17 HTML / CSS
经典c++面试题三
2015/07/08 面试题
几个SQL的面试题
2014/03/08 面试题
群众路线对照检查剖析材料
2014/10/09 职场文书
小学生禁毒教育心得体会
2016/01/15 职场文书
python读取mnist数据集方法案例详解
2021/09/04 Python