目录结构变化
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,不过这样也使得项目结构更加清晰,一切类库都在命名空间的组织之下。
时间有限,先写这么多吧。希望大家能够喜欢。