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 相关文章推荐
将RTF格式的文件转成HTML并在网页中显示的代码
Oct 09 PHP
用PHP实现的生成静态HTML速度快类库
Mar 31 PHP
php获取某个目录大小的代码
Sep 10 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
Sep 13 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
Sep 20 PHP
用php制作简单分页(从数据库读取记录)的方法详解
May 04 PHP
PHP实现根据浏览器跳转不同语言页面代码
Aug 02 PHP
php获取汉字首字母的函数
Nov 07 PHP
ThinkPHP标签制作教程
Jul 10 PHP
php抽象类用法实例分析
Jul 07 PHP
php+flash+jQuery多图片上传源码分享
Jul 27 PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 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的Reflection反射机制
2014/08/05 PHP
使用ob系列函数实现PHP网站页面静态化
2014/08/13 PHP
JavaScript更改class和id的方法
2008/10/10 Javascript
js 禁用浏览器的后退功能的简单方法
2008/12/10 Javascript
jquery实现居中弹出层代码
2010/08/25 Javascript
a标签的href和onclick 的事件的区别介绍
2013/07/26 Javascript
使用JQUERY进行后台页面布局控制DIV实现左右式
2014/01/07 Javascript
javascript自定义右键弹出菜单实现方法
2015/05/25 Javascript
jQuery 获取多选框的值及多选框中文的函数
2016/05/16 Javascript
jQuery fadeOut 异步实例代码详解
2016/08/18 Javascript
浅谈jquery高级方法描述与应用
2016/10/04 Javascript
浅谈函数调用的不同方式,以及this的指向
2017/09/17 Javascript
浅析JavaScript中的特殊数据类型
2017/12/15 Javascript
浅析vue-router jquery和params传参(接收参数)$router $route的区别
2018/08/03 jQuery
vue动态绑定class选中当前列表变色的方法示例
2018/12/19 Javascript
JavaScript enum枚举类型定义及使用方法
2020/05/15 Javascript
浅谈React中组件逻辑复用的那些事儿
2020/05/21 Javascript
vue项目中使用rem,在入口文件添加内容操作
2020/11/11 Javascript
[01:32]2014DOTA2西雅图邀请赛 CIS我们有信心进入正赛
2014/07/08 DOTA
python网络编程学习笔记(二):socket建立网络客户端
2014/06/09 Python
Python三级目录展示的实现方法
2016/09/28 Python
Python中类型检查的详细介绍
2017/02/13 Python
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
2018/04/27 Python
python实现寻找最长回文子序列的方法
2018/06/02 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
2019/06/05 Python
安装Pycharm2019以及配置anconda教程的方法步骤
2019/11/11 Python
python解释器pycharm安装及环境变量配置教程图文详解
2020/02/26 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
python列表删除和多重循环退出原理详解
2020/03/26 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
2020/04/26 Python
C++和python实现阿姆斯特朗数字查找实例代码
2020/12/07 Python
是否有自动比较结构的方法
2015/06/03 面试题
公司司机岗位职责
2014/02/07 职场文书
初婚未育证明样本
2014/10/24 职场文书
论文答谢词
2015/01/20 职场文书
详解Python中的进程和线程
2021/06/23 Python