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 strstr查找字符串中是否包含某些字符的查找函数
Jun 03 PHP
使用session判断用户登录用户权限(超简单)
Jun 08 PHP
php二分查找二种实现示例
Mar 12 PHP
通过curl模拟post和get方式提交的表单类
Apr 23 PHP
php实现对两个数组进行减法操作的方法
Apr 17 PHP
php获取指定范围内最接近数的方法
Jun 02 PHP
discuz图片顺序混乱解决方案
Jul 29 PHP
PHP请求远程地址设置超时时间的解决方法
Oct 29 PHP
php显示页码分页类的封装
Jun 08 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
Aug 25 PHP
Laravle eloquent 多对多模型关联实例详解
Nov 22 PHP
PHP的imageTtfText()函数深入详解
Mar 03 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中读取和写入WORD文档的代码
2008/04/09 PHP
php提取字符串中网站url地址的方法
2014/12/03 PHP
Web程序工作原理详解
2014/12/25 PHP
javascript控制Div层透明属性由浅变深由深变浅逐渐显示
2013/11/12 Javascript
浅谈Javascript数组索引
2015/07/29 Javascript
jQuery插件jquery-barcode实现条码打印的方法
2015/11/25 Javascript
详解Jquery实现ready和bind事件
2016/04/14 Javascript
通过jquery-ui中的sortable来实现拖拽排序的简单实例
2016/05/24 Javascript
AngularJS中$watch和$timeout的使用示例
2016/09/20 Javascript
JavaScript重定向URL参数的两种方法小结
2016/10/19 Javascript
详解jQuery的表单验证插件--Validation
2016/12/21 Javascript
php输出全部gb2312编码内的汉字方法
2017/03/04 Javascript
详解vue.js下引入百度地图jsApi的两种方法
2018/07/27 Javascript
VueJS 取得 URL 参数值的方法
2019/07/19 Javascript
JavaScript Image对象实现原理实例解析
2020/08/26 Javascript
在Python3中初学者应会的一些基本的提升效率的小技巧
2015/03/31 Python
探索Python3.4中新引入的asyncio模块
2015/04/08 Python
Python3中的真除和Floor除法用法分析
2016/03/16 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
python爬虫之urllib3的使用示例
2018/07/09 Python
Pycharm简单使用教程(入门小结)
2019/07/04 Python
python多线程案例之多任务copy文件完整实例
2019/10/29 Python
Python实现变声器功能(萝莉音御姐音)
2019/12/05 Python
Python字典底层实现原理详解
2019/12/18 Python
Python代码中如何读取键盘录入的值
2020/05/27 Python
Viking Direct爱尔兰:办公用品和家具
2019/11/21 全球购物
酒店服务实习自我鉴定
2013/09/22 职场文书
标准的毕业生自荐信
2014/04/20 职场文书
运动会广播稿100字
2014/09/14 职场文书
公司副总经理岗位职责
2015/04/08 职场文书
费城故事观后感
2015/06/10 职场文书
2015年秋季灭鼠工作总结
2015/07/27 职场文书
Java实现多线程聊天室
2021/06/26 Java/Android
python开发飞机大战游戏
2021/07/15 Python
golang实现浏览器导出excel文件功能
2022/03/25 Golang
Apache Kafka 分区重分配的实现原理解析
2022/07/15 Servers