初识laravel5


Posted in PHP onMarch 02, 2015

目录结构变化

laravel5最先强调的是项目目录结构的变化,与4.2区别还是蛮大的,逐条来说吧。

新的目录结构看上去像这样:

app
    Commands
    Console
    Events
    Handlers
        Commands
        Events
    Http
        Controllers
        Middleware
        Requests
        Kernel.php
        routes.php
    Providers
    Services
bootstrap
config
database
    migrations
    seeds
public
    package
resources
    lang
    views
storage
    cache
    logs
    meta
    sessions
    views
    work
tests

4.2的目录结构:

app
    commands
    config
    controllers
    database
    lang
    models
    start
    storage
    tests
    views
bootstrap
public
对比一下,改变还是比较大的,可以看到 config,database被移动到根目录,lang,views目录被移动到resources目录下,controllers被整合到http目录里,models目录不见了,还有一些新增的目录就略了。

App命名空间

laravel5里还有一个变化,那就是app目录默认加上了一个根命名空间 App ,在 App 下的所有目录、类都应当在该命名空间下,简而言之就是采用了psr4标准。

HTTP

laravel5认为,新的目录结构是目前最好的结构之一,可以让我们的开发更加得心应手,比如http目录:

Http
    Controllers
    Middleware
    Requests
    Kernel.php
    routes.php
Middleware 很陌生,其实它是原来的路由filter的一个升级版,现在不用在filters.php里定义过滤器,取而代之的是在 Middleware 目录中创建类,并在Kernel.php中配置全局还是可选,全局的Middleware在每个请求都会执行,而可选的就相当于原来的filter,可以在路由中使用,也可以在控制器中使用。

Requests是对核心类Request的扩展,你可以扩展不同的Requests类,添加不同的功能。

可以认为,所有关于http请求有关的处理都在http目录中,比如控制器就是用来接受一个请求并返回的,所以将它放在 Http 目录里合情合理。

路由

路由跟以前的区别不大,但是需要注意的当我们指定控制器命名空间时,命名空间不是绝对路径,而是相对于 App\Http\Controllers,举例:

Route::controllers([

    'auth' => 'Auth\AuthController',

    'password' => 'Auth\PasswordController',

]);

可以在 App/Http/Controllers/Auth 目录下找到对应的类。

此外,路由还支持缓存,以提升性能,通过命令行工具

php artisan route:cache

即可轻松生成,也可以通过

php artisan route:clear

清理缓存。

Services

我们看到在App目录下还有一个Services目录,我觉得这是一个很赞的理念,一直以来,我都对于控制器中出现大段的业务逻辑代码而烦躁,我很想用一个单独的层把这些业务逻辑封装起来,而services就可以用来干这个活,当然,它不是必须的,但我强烈建议使用。就以laravel5自带的demo来看看吧:

# Http/Controllers/Auth/AuthController.php

<?php namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;

use Illuminate\Contracts\Auth\Guard;

use Illuminate\Contracts\Auth\Registrar;

use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;

class AuthController extends Controller {

    /*

    |--------------------------------------------------------------------------

    | Registration & Login Controller

    |--------------------------------------------------------------------------

    |

    | This controller handles the registration of new users, as well as the

    | authentication of existing users. By default, this controller uses

    | a simple trait to add these behaviors. Why don't you explore it?

    |

    */

    use AuthenticatesAndRegistersUsers;

    /**

     * Create a new authentication controller instance.

     *

     * @param  \Illuminate\Contracts\Auth\Guard  $auth

     * @param  \Illuminate\Contracts\Auth\Registrar  $registrar

     * @return void

     */

    public function __construct(Guard $auth, Registrar $registrar)

    {

        $this->auth = $auth;

        $this->registrar = $registrar;

        $this->middleware('guest', ['except' => 'getLogout']);

    }

}

这是一个登陆授权的控制器,我们看 __construct构造函数,利用参数自动注入了一个 "接口实现(参考手册IoC)" 的绑定,我们看下Registrar:

<?php namespace App\Services;

use App\User;

use Validator;

use Illuminate\Contracts\Auth\Registrar as RegistrarContract;

class Registrar implements RegistrarContract {

    /**

     * Get a validator for an incoming registration request.

     *

     * @param  array  $data

     * @return \Illuminate\Contracts\Validation\Validator

     */

    public function validator(array $data)

    {

        return Validator::make($data, [

            'name' => 'required|max:255',

            'email' => 'required|email|max:255|unique:users',

            'password' => 'required|confirmed|min:6',

        ]);

    }

    /**

     * Create a new user instance after a valid registration.

     *

     * @param  array  $data

     * @return User

     */

    public function create(array $data)

    {

        return User::create([

            'name' => $data['name'],

            'email' => $data['email'],

            'password' => bcrypt($data['password']),

        ]);

    }

}

提交用户名密码时的处理:

public function postRegister(Request $request)

{

    $validator = $this->registrar->validator($request->all());

    if ($validator->fails())

    {

        $this->throwValidationException(

            $request, $validator

        );

    }

    $this->auth->login($this->registrar->create($request->all()));

    return redirect($this->redirectPath());

}

可以看到,表单验证的业务逻辑仅仅一行:

$validator = $this->registrar->validator($request->all());

整个控制器的代码显得干净易读,我们可以把很多通用的业务逻辑封装成service,比不伦不类地直接封装在控制器类好。

模型

models目录不见了,因为不是所有应用都需要用到数据库的,所以laravel5默认不提供该目录可以理解,而且由于提供了 App 这个namespace,所以我们可以自己在 App/ 下创建 Models 目录,其中所有模型类都声名namespace App\Models;即可,只是使用上比以前麻烦一些,需要先use,不过这样也使得项目结构更加清晰,一切类库都在命名空间的组织之下。

时间有限,先写这么多吧。希望大家能够喜欢。

PHP 相关文章推荐
php 数组排序 array_multisort与uasort的区别
Mar 24 PHP
对text数据类型不支持代码页转换 从: 1252 到: 936
Apr 23 PHP
php中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
Jul 03 PHP
PHP 字符串正则替换函数preg_replace使用说明
Jul 15 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
Dec 29 PHP
基于php验证码函数的使用示例
May 03 PHP
解析php DOMElement 操作xml 文档的实现代码
May 10 PHP
Codeigniter上传图片出现“You did not select a file to upload”错误解决办法
Jun 12 PHP
php模仿asp Application对象在线人数统计实现方法
Jan 04 PHP
Yii中创建自己的Widget实例
Jan 05 PHP
thinkPHP多域名情况下使用memcache方式共享session数据的实现方法
Jul 21 PHP
深入解析PHP中SESSION反序列化机制
Mar 01 PHP
避免Smarty与CSS语法冲突的方法
Mar 02 #PHP
实现PHP+Mysql无限分类的方法汇总
Mar 02 #PHP
Java和PHP在Web开发方面对比分析
Mar 01 #PHP
php中return的用法实例分析
Feb 28 #PHP
php多次include后导致全局变量global失效的解决方法
Feb 28 #PHP
Windows7下的php环境配置教程
Feb 28 #PHP
php数组使用规则分析
Feb 27 #PHP
You might like
深入PHP magic quotes的详解
2013/06/17 PHP
PHP错误提示的关闭方法详解
2013/06/23 PHP
php获取英文姓名首字母的方法
2015/07/13 PHP
适合PHP初学者阅读的4本经典书籍
2016/09/23 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
PHP文件类型检查及fileinfo模块安装使用详解
2019/05/09 PHP
laravel 实现用户登录注销并限制功能
2019/10/24 PHP
js实现数组转换成json
2015/06/26 Javascript
jquery实现漂亮的二级下拉菜单代码
2015/08/26 Javascript
基于jquery实现动态竖向柱状条特效
2016/02/12 Javascript
JS获取屏幕高度的简单实现代码
2016/05/24 Javascript
jQuery简单实现仿京东分类导航层效果
2016/06/07 Javascript
js replace(a,b)之替换字符串中所有指定字符的方法
2016/08/17 Javascript
网页瀑布流布局jQuery实现代码
2016/10/21 Javascript
微信小程序 scroll-view实现锚点滑动的示例
2017/12/06 Javascript
微信公众号服务器验证Token步骤图解
2019/12/30 Javascript
javascript canvas检测小球碰撞
2020/04/17 Javascript
基于vue中的scoped坑点解说
2020/09/04 Javascript
Python语言描述机器学习之Logistic回归算法
2017/12/21 Python
Python中装饰器学习总结
2018/02/10 Python
python编程嵌套函数实例代码
2018/02/11 Python
python实现写数字文件名的递增保存文件方法
2018/10/25 Python
解决django后台样式丢失,css资源加载失败的问题
2019/06/11 Python
Django 用户登陆访问限制实例 @login_required
2020/05/13 Python
基于python计算滚动方差(标准差)talib和pd.rolling函数差异详解
2020/06/08 Python
解决导入django_filters不成功问题No module named 'django_filter'
2020/07/15 Python
Ralph Lauren拉夫·劳伦美国官网:带有浓郁美国气息的高品味时装品牌
2017/11/01 全球购物
李维斯牛仔裤荷兰官方网站:Levi’s NL
2020/08/23 全球购物
Myprotein亚太地区:欧洲第一在线运动营养品牌
2020/12/20 全球购物
仓库管理计划书
2014/05/04 职场文书
股票投资建议书
2014/05/19 职场文书
落实八项规定专题民主生活会对照检查材料
2014/09/15 职场文书
化验员岗位职责
2015/02/14 职场文书
2015年社区服务活动总结
2015/03/25 职场文书
vue中控制mock在开发环境使用,在生产环境禁用方式
2022/04/06 Vue.js
Moment的feature导致线上bug解决分析
2022/09/23 Javascript