目录结构变化

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

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

app    Commands    Console    Events    Handlers        Commands        Events    Http        Controllers        Middleware        Requests        Kernel.php        routes.php    Providers    Servicesbootstrapconfigdatabase    migrations    seedspublic    packageresources    lang    viewsstorage    cache    logs    meta    sessions    views    worktests

4.2的目录结构:

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

App命名空间

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

HTTP

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

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

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

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

路由

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

复制代码 代码如下:Route::controllers([    "auth" => "AuthAuthController",    "password" => "AuthPasswordController",]);

可以在 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 AppHttpControllersAuth;use AppHttpControllersController;use IlluminateContractsAuthGuard;use IlluminateContractsAuthRegistrar;use IlluminateFoundationAuthAuthenticatesAndRegistersUsers;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  IlluminateContractsAuthGuard  $auth     * @param  IlluminateContractsAuthRegistrar  $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 AppServices;use AppUser;use Validator;use IlluminateContractsAuthRegistrar as RegistrarContract;class Registrar implements RegistrarContract {    /**     * Get a validator for an incoming registration request.     *     * @param  array  $data     * @return IlluminateContractsValidationValidator     */    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 AppModels;即可,只是使用上比以前麻烦一些,需要先use,不过这样也使得项目结构更加清晰,一切类库都在命名空间的组织之下。

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