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 相关文章推荐
我的论坛源代码(一)
Oct 09 PHP
php下保存远程图片到本地的办法
Aug 08 PHP
使用bcompiler对PHP文件进行加密的代码
Aug 29 PHP
PHP取得一个类的属性和方法的实现代码
May 22 PHP
PHP中ob_start函数的使用说明
Nov 11 PHP
php中判断数组相等的方法以及数组运算符介绍
Mar 30 PHP
盘点PHP和ASP.NET的10大对比!
Dec 24 PHP
PHP Callable强制指定回调类型的方法
Aug 30 PHP
PHP读取zip文件的方法示例
Nov 17 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
阿里云Win2016安装Apache和PHP环境图文教程
Mar 11 PHP
Laravel5.5以下版本中如何自定义日志行为详解
Aug 01 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
thinkphp制作404跳转页的简单实现方法
2016/09/22 PHP
thinkphp下MySQL数据库读写分离代码剖析
2017/04/18 PHP
PHP面向对象程序设计继承用法简单示例
2018/12/28 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
2019/10/09 PHP
IE与FireFox中的childNodes区别
2011/10/20 Javascript
Js实现当前点击a标签变色突出显示其他a标签回复原色
2013/11/27 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
2014/08/08 Javascript
JS是按值传递还是按引用传递
2015/01/30 Javascript
打造自己的jQuery插件入门教程
2016/09/23 Javascript
javascript实现消灭星星小游戏简单版
2016/11/15 Javascript
layui树形菜单动态遍历的例子
2019/09/23 Javascript
[07:09]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant 选手采访
2021/03/11 DOTA
Python使用post及get方式提交数据的实例
2019/01/24 Python
Python递归函数 二分查找算法实现解析
2019/08/12 Python
python的json中方法及jsonpath模块用法分析
2019/12/06 Python
NumPy统计函数的实现方法
2020/01/21 Python
django-利用session机制实现唯一登录的例子
2020/03/16 Python
Pycharm安装python库的方法
2020/11/24 Python
详解python中的异常和文件读写
2021/01/03 Python
HTML5 实现一个访问本地文件的实例
2012/12/13 HTML / CSS
销售业务实习自我鉴定
2013/09/23 职场文书
自荐信格式范文
2013/10/07 职场文书
2013年高中生自我评价
2013/10/23 职场文书
采购文员岗位职责
2013/11/20 职场文书
纺织工程专业个人求职信范文
2014/01/27 职场文书
《小熊住山洞》教学反思
2014/02/21 职场文书
有多年工作经验的自我评价
2014/03/02 职场文书
交通事故调解协议书
2014/04/16 职场文书
小学向国旗敬礼活动方案
2014/09/27 职场文书
房地产项目合作意向书
2015/05/08 职场文书
微信小程序和php的登录实现
2021/04/01 PHP
python的netCDF4批量处理NC格式文件的操作方法
2022/03/21 Python
【海涛dota】偶遇拉娜娅 质量局德鲁伊第一视角解说
2022/04/01 DOTA
python画条形图的具体代码
2022/04/20 Python
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS