Laravel 4 初级教程之Pages、表单验证


Posted in PHP onOctober 30, 2014

1. 构建Pages管理功能

运行命令:

php artisan generate:controller admin/PagesController

修改PagesController.php 内容:

<?php
namespace App\Controllers\Admin;
use Page;
use Input, Notification, Redirect, Sentry, Str;
use App\Services\Validators\PageValidator;
class PagesController extends \BaseController {
    public function index()
    {
        return \View::make('admin.pages.index')->with('pages', Page::all());
    }
    public function show($id)
    {
        return \View::make('admin.pages.show')->with('page', Page::find($id))->withAuthor(Sentry::findUserById(Page::find($id)->user_id)->name);
    }
    public function create()
    {
        return \View::make('admin.pages.create');
    }
    public function store()
    {
        $validation = new PageValidator;
        if ($validation->passes())
        {
      $page          = new Page;
      $page->title   = Input::get('title');
      $page->body    = Input::get('body');
      $page->user_id = Sentry::getUser()->id;
            $page->save();
            Notification::success('新增页面成功!');
            return Redirect::route('admin.pages.edit', $page->id);
        }
        return Redirect::back()->withInput()->withErrors($validation->errors);
    }
    public function edit($id)
    {
        return \View::make('admin.pages.edit')->with('page', Page::find($id));
    }
    public function update($id)
    {
        $validation = new PageValidator;
        if ($validation->passes())
        {
      $page          = Page::find($id);
      $page->title   = Input::get('title');
      $page->body    = Input::get('body');
      $page->user_id = Sentry::getUser()->id;
            $page->save();
            Notification::success('更新页面成功!');
            return Redirect::route('admin.pages.edit', $page->id);
        }
        return Redirect::back()->withInput()->withErrors($validation->errors);
    }
    public function destroy($id)
    {
        $page = Page::find($id);
        $page->delete();
        Notification::success('删除成功!');
        return Redirect::route('admin.pages.index');
    }
}

然后,打开http://localhost:8000/admin 页面,用之前 seed 进去的账号密码登录,我们会得到一个错误:

Class App\Controllers\Admin\PagesController does not exist

这个文件明明已经有了啊,为什么Laravel报错说没有呢?!原因在第二篇教程里,我在这里直接说了吧。因为这个类不在顶级命名空间下,而我们没有告诉Laravel我们已经新添了一个子命名空间下的类。我们现在来告诉它:

composer dump-autoload

OK,刷新,我们又会得到以下错误:

View [admin.pages.index] not found.

这时候,把我的视图中的整个pages文件夹复制过去吧。

刷新。你会得到以下错误:

Class 'Notification' not found

这是因为我们还没有装这个composer包,edvinaskrucas/notification,请自行安装3.0.1 版(4是为 Laravel 5 准备的),这是第三个小作业。一定要放在 require 里面,require-dev 里面的包只在开发的时候使用。

这里的Notification 就是那个更好用的通知组件。

这个包装好以后,运行:

composer dump-autoload

然后在 config/app.php 里面恰当的位置分别增加下面两行:

'Krucas\Notification\NotificationServiceProvider'
'Notification' => 'Krucas\Notification\Facades\Notification'

恰当的位置很多人不理解,导致很多人出现了错误,解决方式也很简单:请直接参考我的示例代码:https://github.com/johnlui/Learn-Laravel-4/blob/master/app/config/app.php

刷新,如果你看到以下界面:

Laravel 4 初级教程之Pages、表单验证

恭喜你~ Pages的管理页面完成了!

2. 表单验证

Laravel提供了原生的非常好用的表单验证功能,但是有时候验证规则需要复用,所以我们将利用强大的命名空间来实现代码复用,同时将展示Laravel之外的,PHP的命名空间带来的强大的组件化功能和模块解耦,HMVC什么的已经落后啦。

新建app/services/validators 两级文件夹,并在composer.json的 autoload > classmap 最后新增:

"app/services"

这是在告诉composer:来把我下面的所有文件和子文件夹中的所有文件合并到你的命名空间树上吧! 这样就让 app/services 下的类可以声明自己的命名空间了,子文件夹中的文件也可以声明的自己属于子命名空间了。这个文件夹将承载我们的表单验证类群,当然也可以承载许多其他组件和模块,实现完全解耦。

添加完成后,新建app/services/validators/Validator.php 文件:

<?php
namespace App\Services\Validators;
abstract class Validator {
    protected $data;
    public $errors;
    public static $rules;
    public function __construct($data = null)
    {
        $this->data = $data ?: \Input::all();
    }
    public function passes()
    {
        $validation = \Validator::make($this->data, static::$rules);
        if ($validation->passes()) return true;
        $this->errors = $validation->messages();
        return false;
    }
}

新建app/services/validators/PageValidator.php 文件:

<?php
namespace App\Services\Validators;
class PageValidator extends Validator {
    public static $rules = array(
        'title' => 'required',
        'body'  => 'required',
    );
}

然后运行:

composer dump-autoload

这时候,就可以尝试整个页面上的所有操作啦!新建,编辑,查看,删除,至此,pages管理部分全部完成!

大作业:目前Pages管理部分已经全部完成,但是Articles管理部分还是啥都没有,尝试模仿Pages的代码,完成一个跟Pages一样的管理系统。小提示:包含 控制器、视图和表单验证哦。等你完成了Articles管理部分,Laravel就真正入门啦!

PHP 相关文章推荐
Notice: Trying to get property of non-object problem(PHP)解决办法
Mar 11 PHP
php实现可用于mysql,mssql,pg数据库操作类
Dec 13 PHP
高质量PHP代码的50个实用技巧必备(上)
Jan 22 PHP
PHP读取大文件的几种方法介绍
Oct 27 PHP
php版微信小店调用api示例代码
Nov 12 PHP
php实现与python进行socket通信的方法示例
Aug 30 PHP
Docker搭建自己的PHP开发环境
Feb 24 PHP
PHP性能测试工具xhprof安装与使用方法详解
Apr 29 PHP
PHP基于面向对象封装的分页类示例
Mar 15 PHP
PHP使用 Pear 进行安装和卸载包的方法详解
Jul 08 PHP
thinkPHP5.1框架中Request类四种调用方式示例
Aug 03 PHP
laravel Validator ajax返回错误信息的方法
Sep 29 PHP
Laravel 4 初级教程之视图、命名空间、路由
Oct 30 #PHP
Laravel 4 初级教程之安装及入门
Oct 30 #PHP
推荐几款用 Sublime Text 开发 Laravel 所用到的插件
Oct 30 #PHP
Thinkphp中数据按分类嵌套循环实现方法
Oct 30 #PHP
Thinkphp将二维数组变为标签适用的一维数组方法总结
Oct 30 #PHP
ThinkPHP模板中数组循环实例
Oct 30 #PHP
Laravel 4.2 中队列服务(queue)使用感受
Oct 30 #PHP
You might like
PHP编程与应用
2006/10/09 PHP
PHP的简易冒泡法代码分享
2012/08/28 PHP
详谈PHP编码转换问题
2015/07/28 PHP
Javascript中valueOf与toString区别浅析
2013/03/19 Javascript
zTree插件之多选下拉菜单实例代码
2013/11/06 Javascript
javascript获取所有同类checkbox选项(实例代码)
2013/11/07 Javascript
怎样判断jQuery当前元素是隐藏还是显示
2016/11/23 Javascript
微信小程序--组件(swiper)详细介绍
2017/06/13 Javascript
JS实现商品筛选功能
2020/08/19 Javascript
详解如何在vue中使用sass
2017/06/21 Javascript
简单谈谈require模块化jquery和angular的问题
2017/06/23 jQuery
Vue项目webpack打包部署到服务器的实例详解
2017/07/17 Javascript
webpack-dev-server自动更新页面方法
2018/02/22 Javascript
vue-cli2打包前和打包后的css前缀不一致的问题解决
2018/08/24 Javascript
[43:48]Ti4正赛第一天 VG vs NEWBEE 2
2014/07/19 DOTA
[28:42]Ti4正赛VG vs NEWBEE1
2014/07/19 DOTA
python3 模拟登录v2ex实例讲解
2017/07/13 Python
Django实现简单分页功能的方法详解
2017/12/05 Python
Python并发编程协程(Coroutine)之Gevent详解
2017/12/27 Python
详解python 拆包可迭代数据如tuple, list
2017/12/29 Python
PyCharm导入python项目并配置虚拟环境的教程详解
2019/10/13 Python
python 实现从高分辨图像上抠取图像块
2020/01/02 Python
Python模块 _winreg操作注册表
2020/02/05 Python
Python使用monkey.patch_all()解决协程阻塞问题
2020/04/15 Python
Python+Django+MySQL实现基于Web版的增删改查的示例代码
2020/05/13 Python
vscode+PyQt5安装详解步骤
2020/08/12 Python
HTML+CSS3模拟心的跳动实例代码
2017/09/05 HTML / CSS
布鲁明戴尔百货店:Bloomingdale’s
2016/12/21 全球购物
爱普生美国官网:Epson美国
2018/11/05 全球购物
FC-Moto英国:欧洲最大的摩托车服装和头盔商店之一
2019/08/25 全球购物
公司道歉信范文
2014/01/09 职场文书
中专毕业生自我鉴定
2014/02/02 职场文书
乡镇网格化管理实施方案
2014/03/23 职场文书
幼儿园安全责任书范本
2014/07/24 职场文书
2016党校学习心得体会
2016/01/07 职场文书
MySQL Server层四个日志的实现
2022/03/31 MySQL