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水印
Mar 16 PHP
PHP的autoload自动加载机制使用说明
Dec 28 PHP
php中获得视频时间总长度的另一种方法
Sep 15 PHP
关于IIS php调用com组件的权限问题
Jan 11 PHP
PHP反转字符串函数strrev()函数的用法
Feb 04 PHP
php5.3 goto函数介绍和示例
Mar 21 PHP
php去除字符串中空字符的常用方法小结
Mar 17 PHP
php实现猴子选大王问题算法实例
Apr 20 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
May 12 PHP
mysql alter table命令修改表结构实例详解
Sep 24 PHP
php实现等比例压缩图片
Jul 26 PHP
PHP __call()方法实现委托示例
May 20 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函数
2006/10/09 PHP
PHP批量去除BOM头代码分享
2015/06/26 PHP
Yii中实现处理前后台登录的新方法
2015/12/28 PHP
thinkphp验证码的实现(form、ajax实现验证)
2016/07/28 PHP
python进程与线程小结实例分析
2018/11/11 PHP
ExtJS下grid的一些属性说明
2009/12/13 Javascript
javascript 终止函数执行操作
2014/02/14 Javascript
javascript怎么禁用浏览器后退按钮
2014/03/27 Javascript
百度UEditor编辑器如何关闭抓取远程图片功能
2015/03/03 Javascript
node.js中 stream使用教程
2016/08/28 Javascript
Javascript从数组中随机取出不同元素的两种方法
2016/09/22 Javascript
Bootstrop实现多级下拉菜单功能
2016/11/24 Javascript
详解vue2.0组件通信各种情况总结与实例分析
2017/03/22 Javascript
使用javascript函数编写简单银行取钱存钱流程
2018/05/26 Javascript
js实现文件上传功能 后台使用MultipartFile
2018/09/08 Javascript
vue动态禁用控件绑定disable的例子
2019/10/28 Javascript
vue父子模板传值问题解决方法案例分析
2020/02/26 Javascript
关于javascript中的promise的用法和注意事项(推荐)
2021/01/15 Javascript
[03:22]DSPL第一期精彩集锦:酷炫到底!
2014/11/07 DOTA
[38:54]完美世界DOTA2联赛PWL S2 Rebirth vs LBZS 第一场 11.28
2020/12/01 DOTA
Python单例模式的两种实现方法
2017/08/14 Python
python爬虫_实现校园网自动重连脚本的教程
2018/04/22 Python
python生成密码字典的方法
2018/07/06 Python
pip指定python位置安装软件包的方法
2019/07/12 Python
深入浅析python的第三方库pandas
2020/02/13 Python
django2.2 和 PyMySQL版本兼容问题
2020/02/17 Python
HttpServlet类中的主要方法都有哪些?各自的作用是什么?
2014/03/16 面试题
高校学生干部的自我评价分享
2013/11/04 职场文书
经济管理专业自荐信
2013/12/30 职场文书
致1500米运动员广播稿
2014/02/07 职场文书
迎国庆横幅标语
2014/10/08 职场文书
优秀团员个人总结
2015/02/26 职场文书
科技活动总结范文
2015/05/11 职场文书
《普罗米修斯》教学反思
2016/02/22 职场文书
详解Flask开发技巧之异常处理
2021/06/15 Python