初识laravel5 |
本文标签:laravel5 目录结构变化 laravel5最先强调的是项目目录结构的变化,与4.2区别还是蛮大的,逐条来说吧 。 新的目录结构看上去像这样: app 4.2的目录结构: app App命名空间 laravel5里还有一个变化,那就是app目录默认加上了一个根命名空间 App ,在 App 下的所有目录、类都应当在该命名空间下,简而言之就是采用了psr4标准 。 HTTP laravel5认为,新的目录结构是目前最好的结构之一,可以让我们的开发更加得心应手,比如http目录: Http 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 dont 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,不过这样也使得项目结构更加清晰,一切类库都在命名空间的组织之下 。 时间有限,先写这么多吧 。希望大家能够喜欢 。 |