laravel项目的目录安排

Author Avatar
Max Yang 7月 09, 2017
  • 在其它设备中阅读本文章

目的:

模块化项目,简化多个项目的拆分和合并过程,简化laravel版本升级带来的改变。

做法:

以下以公司命名空间为 Apple, 项目名称Crm为例

主项目目录 下包含模型和控制器,在项目组合拆分时不变。

项目视图目录 下包含项目视图,项目组合拆分时不变。

可公用的视图 可以放在resources/views/vendor/[Apple]目录下,一般以layouts为主。

路由 放在独立的路由文件,通过RouteServiceProvider注册进去。

测试 按项目文件夹放置

注意 不要直接从原生的Eloquent Model,Controller继承,而要在项目中新建BaseModel和BaseController作为依赖隔离,项目中的模型和控制器均继承自BaseModel和BaseController

示例目录结构 (基于laravel 5.4)

带*号的为项目新增文件,带[]的为项目新增目录.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
app/ : 基础设施,配置为主,少改代码,以便日后升级。
Console/
- Kernel.php : 注册 routes 下面 console 类的 routes; 注册 schedule 项目
Exceptions/
- Handler.php : excetpion 处理
Http/
Controllers/ : 基础controllers
Auth/ : 基础认证包,适度修改
- Controller.php : 基础 controller 类,不要修改
Middleware/
- Kernel.php
Providers/
- RouteServiceProvider : 注册 routes 下面 web 和 api 类的 routes
[Crm]/ : 主项目目录
Http/
Controllers/
* BaseController.php : 继承自 App/Controller,所有项目controller均需从BaseController扩展
* XyzController.php : 项目相关 Controllers
Models/
- BaseModel : 继承自 Illuminate\Database\Eloquent\Model,所有项目model均需从BaseModel扩展
- 注意,多个项目的model可能会出现重名,导致表格重名,model命名尽量加入项目名
bootstrap/
config/
database/ : 该目录下所有class都无需namespace,而直接可用
factories/
- ModelFactory.php : 基础Factory
- * CrmModelFactory.php: 项目Factory
migrations/
- 注意,多个项目的model可能会出现表格重名,model命名尽量加入项目名
seeds/
public/
css/ : 该目录下应该是编译结果
js/ : 该目录下应该是编译结果
resources/
assets/
lang/
en/
[crm]/
- ...
views/
vendor/ :
layouts/
[crm]/ : 项目视图目录
layouts/
- ...
routes/
- api.php
- * CrmApi.php : 在 RouteServiceProvider 里面 mapApiRoutes() 注册
- channels.php
- console.php
- * CrmConsole.php
- web.php
- * CrmWeb.php - 在 RouteServiceProvider 里面 mapWebRoutes() 注册
storage/
test/
Feature/ - 集成Feature test
Unit/ - 集成 Unit test
[Crm]/
Feature/
Unit/
- BaseTestCase : 继承自TestCase,use migration,所有test均应继承自BaseTest

composer.json 里面增加 namespace 的mapping:"Apple\\Crm": "Crm"

1
2
3
4
5
6
7
8
9
"autoload": {
"classmap": [
"database"
],
"psr-4": {
"App\\": "app/",
"Apple\\Crm": "Crm"
}
},

改完记得执行composer dump-autoload

基础设施部分:

routes: http请求的入口,url到内部逻辑的接口。每个项目应该有自己的routes,通过path prefix来配置具体的项目根目录。通过 RouteServiceProvider 里面的 mapWebRoutes()mapApiRoutes()

controller: 同类routes的组合,如一个restful resource的所有route可以放在一个controller里面。并对request进行认证和权限管理