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 相关文章推荐
PHP 分页类(模仿google)-面试题目解答
Sep 13 PHP
PHP下通过系统信号量加锁方式获取递增序列ID
Sep 25 PHP
php实现批量下载百度云盘文件例子分享
Apr 10 PHP
百度地图API应用之获取用户的具体位置
Jun 10 PHP
Ubuntu12下编译安装PHP5.3开发环境
Mar 27 PHP
php微信公众平台开发类实例
Apr 01 PHP
PHP获取数组的键与值方法小结
Jun 13 PHP
PHP代码维护,重构变困难的4种原因分析
Jan 25 PHP
PHP实现的通过参数生成MYSQL语句类完整实例
Apr 11 PHP
php实现将base64格式图片保存在指定目录的方法
Oct 13 PHP
PHP验证码无法显示的原因及解决办法
Aug 11 PHP
php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析
Feb 28 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入库和出库
2013/06/25 PHP
php数据访问之查询关键字
2016/05/09 PHP
php实现基于openssl的加密解密方法
2016/09/30 PHP
浅谈PHP中try{}catch{}的使用方法
2016/12/09 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
2019/10/11 PHP
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
基于jquery的时间段实现代码
2012/08/02 Javascript
JavaScript中统计Textarea字数并提示还能输入的字符
2014/06/10 Javascript
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
jQuery ui实现动感的圆角渐变网站导航菜单效果代码
2015/08/26 Javascript
Bootstrap布局组件应用实例讲解
2016/02/17 Javascript
微信开发之调起摄像头、本地展示图片、上传下载图片实例
2016/12/08 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
es6新特性之 class 基本用法解析
2018/05/05 Javascript
解决webpack+Vue引入iView找不到字体文件的问题
2018/09/28 Javascript
微信小程序wx:for循环的实例详解
2018/10/07 Javascript
使用electron实现百度网盘悬浮窗口功能的示例代码
2018/10/24 Javascript
使用Python中的greenlet包实现并发编程的入门教程
2015/04/16 Python
Python开发虚拟环境使用virtualenvwrapper的搭建步骤教程图解
2018/09/19 Python
解决pyinstaller打包pyqt5的问题
2019/01/08 Python
python itchat实现调用微信接口的第三方模块方法
2019/06/11 Python
python如何实现代码检查
2019/06/28 Python
python修改FTP服务器上的文件名
2019/09/11 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
2020/10/16 Python
Python Web项目Cherrypy使用方法镜像
2020/11/05 Python
CSS3 3D立方体效果示例-transform也不过如此
2016/12/05 HTML / CSS
介绍一下JNDI的基本概念
2013/07/26 面试题
先进工作者获奖感言
2014/02/08 职场文书
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
学生不参加考试检讨书
2015/02/19 职场文书
大学生英文求职信范文
2015/03/19 职场文书
法人代表资格证明书
2015/06/18 职场文书
婚宴主持词
2015/06/30 职场文书
导游词之西安大清真寺
2019/12/17 职场文书
解决mysql:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO/YES)
2021/06/26 MySQL
nginx作grpc的反向代理踩坑总结
2021/07/07 Servers