首页 > 编程 > PHP > 正文

初识laravel5

2020-03-22 20:15:57
字体:
来源:转载
供稿:网友
目录结构变化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
html' target='_blank'>public
package
resources
lang
views
storage
cache
logs
meta
sessions
views
work
tests4.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标准。HTTPlaravel5认为,新的目录结构是目前最好的结构之一,可以让我们的开发更加得心应手,比如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教程

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表