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系统流量分析的程序
Oct 09 PHP
ZF等常用php框架中存在的问题
Jan 10 PHP
PHP 编程的 5个良好习惯
Feb 20 PHP
php读取mysql乱码,用set names XXX解决的原理分享
Dec 29 PHP
php读取文件内容的方法汇总
Jan 24 PHP
PHP页面跳转操作实例分析(header方法)
Sep 28 PHP
PHP通过引用传递参数用法分析
Dec 01 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
Mar 05 PHP
php中通过eval实现字符串格式的计算公式
Mar 18 PHP
PHP双向链表定义与用法示例
Jan 31 PHP
在Laravel中使用DataTables插件的方法
May 29 PHP
laravel实现一个上传图片的接口,并建立软链接,访问图片的方法
Oct 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
如何使用FireFox插件FirePHP调试PHP
2013/07/23 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
PHP实现Javascript中的escape及unescape函数代码分享
2015/02/10 PHP
PHP中你应该知道的require()文件包含的正确用法
2015/06/12 PHP
Javascript公共脚本库系列(一): 弹出层脚本
2011/02/24 Javascript
jquery js 重置表单 reset()具体实现代码
2013/08/05 Javascript
Firefox中使用outerHTML的2种解决方法
2014/06/07 Javascript
Javascript进制转换实例分析
2015/05/14 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
JS中页面与页面之间超链接跳转中文乱码问题的解决办法
2016/12/15 Javascript
JS解析url查询参数的简单代码
2017/08/06 Javascript
前端开发不得不知的10个最佳ES6特性
2017/08/30 Javascript
Angular6笔记之封装http的示例代码
2018/07/27 Javascript
详解离线安装npm包的几种方法
2018/11/25 Javascript
微信小程序实现点击图片旋转180度并且弹出下拉列表
2018/11/27 Javascript
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
[54:02]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 IG vs VGJ.T
2018/04/03 DOTA
python编写简单爬虫资料汇总
2016/03/22 Python
python3写爬取B站视频弹幕功能
2017/12/22 Python
python查找指定文件夹下所有文件并按修改时间倒序排列的方法
2018/10/21 Python
使用Python获取并处理IP的类型及格式方法
2018/11/01 Python
Python+Selenium使用Page Object实现页面自动化测试
2019/07/14 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
Python3 main函数使用sys.argv传入多个参数的实现
2019/12/25 Python
基于CentOS搭建Python Django环境过程解析
2020/08/24 Python
详解Django ORM引发的数据库N+1性能问题
2020/10/12 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
python中re模块知识点总结
2021/01/17 Python
美国最受欢迎的度假租赁网站:VRBO
2016/08/02 全球购物
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
美国名牌香水折扣网站:Hottperfume
2021/02/10 全球购物
社会实践自我鉴定
2013/11/07 职场文书
教师职位说明书
2014/07/29 职场文书
python图片灰度化处理的几种方法
2021/06/23 Python
SpringBoot整合阿里云视频点播的过程详解
2021/12/06 Java/Android
详解CSS3浏览器兼容
2022/12/24 HTML / CSS