写给thinkphp开发者的laravel系列教程 (三) 目录结构

我之前写过详细的thinkphp目录设计总结;
thinkphp的目录结构设计经验总结
laravel的话;
换laravel真的需要勇气;去面对六眼飞鱼;
目录结构首先就够让新手懵一会了;
这么多目录可怎么下手;
既然是面向thinkphp开发者;
我这里准备先以tp的方式讲;

laravel-bjyadmin
├─app
│  ├─Console  
│  ├─Exceptions  
│  ├─Http  请求处理
│  │  ├─Controllers  控制器目录
│  │  ├─Middleware 
│  ├─Providers
│  ├─Library      [+] 自定义类库目录
│  │  ├─Function  [+] 自定义函数库
│  │  ├─Org       [+] 自定义类
│  ├─Models       [+] 模型文件夹
├─bootstrap 
├─config 配置项
├─database 
├─public
├─resources
│  ├─assert 
│  ├─lang 
│  ├─views 视图
├─routes 路由
├─storage 
├─tests

为了尽快入门;
我把目录简化了下;
先以我备注了中文的目录为主;
其他的目录先暂时忽略了;
laravel也是MVC框架;
咱先掌握了这最基本的三项;
就可以初步的写项目了;

thinkphp-bjyadmin
├─Application 项目逻辑目录
│  ├─Common 公共模块
│  │  ├─Common  公共函数目录
│  │  │  ├─functioin.php 公共函数php文件
│  │  ├─Conf  公共配置文件目录
│  │  │  ├─config.php  tp的配置 用于覆盖框架默认配置项
│  │  │  ├─db.php  数据库配置 用户名 密码等
│  │  │  ├─webconfig.php  项目的配置;网站名;是否开启网站等
│  │  ├─Controller  公共控制器目录 
│  │  │  ├─BaseController.class.php 应用最基础的控制器
│  │  │  ├─HomeBaseController.class.php  Home基础控制器继承BaseController
│  │  │  ├─AdminBaseController.class.php  Admin基础控制器继承BaseController
│  │  │  ├─UserBaseController.class.php  User基础控制器继承BaseController
│  │  │  ├─...
│  │  ├─Model  公共模型目录
│  │  │  ├─BaseModel.class.php  应用最基础的Model
│  │  │  ├─ArticleModel.class.php 文章model  继承BaseModel
│  │  │  ├─UserModel.class.php  用户model 继承BaseModel
│  │  │  ├─...
│  │  ├─Tag  公共标签目录
│  │  │  ├─My.class.php  自定义的标签库
│  │  │  ├─...
│  ├─Home  Home模块
│  │  ├─Controller  Home控制器目录 继承HomeBaseController
│  │  │  ├─ArticleController.class.php 文章控制器目录  
│  │  │  ├─IndexController.class.php  首页控制器
│  │  │  ├─ ...  
│  ├─Admin  Admin模块
│  │  ├─Controller  Admin控制器目录 继承AdminBaseController
│  │  │  ├─IndexController.class.php  后台管理首页控制器
│  │  │  ├─ ...  
│  ├─User  User模块
│  │  ├─Controller  User控制器目录 继承UserBaseController
│  │  │  ├─IndexController.class.php  用户个人中心首页控制器
│  │  │  ├─ ...  

thinkphp是以模块划分项目的;
如上我在 laravel-bjyadmin 示例中就划分了 Common 公共模块;
还有 Admin、Home、User模块;
路由就是自动绑定的 模块/控制器/方法 三级;
模型、控制器、视图、配置项等都是在模块下面;

反观 laravel;
已经可以初窥自由了;
但是这种自由也会让新手略有不知所措;
那么我们依然可以以 thinkphp 的模式来理解;

M;
laravel 没有强制定义模型的目录;
默认给了一个 User 模型就是直接给扔到 app 目录下了;
为了防止模型比较多的时候把 app 目录下搞的乱七八糟;
我这里是在 app 目录下建了一个 Models 目录;
所有的模型都放在app/Models目录下;

app
├─Models 模型目录
│  ├─Category.php  分类模型
│  ├─Tag.php  标签模型
│  ├─Article.php  文章模型

C;
把控制器放在视图前面讲;
控制器是在app/Http/Controllers目录下;
我依然以 thinkphp-bjyadmin 的结构来划分;

app
├─Http 请求处理目录
│  ├─Controller  控制器目录
│  │  ├─admin  后台Admin模块
│  │  │  ├─IndexController.php 后台首页控制器
│  │  │  ├─CategoryController.php 分类管理控制器
│  │  ├─home   前台Home模块
│  │  │  ├─IndexController.php 前台首页控制器
│  │  │  ├─ArticleController.php 文章展示控制器
│  │  ├─user   用户User模块
│  │  │  ├─IndexController.php 用户首页控制器
│  │  │  ├─TagController.php 标签管理控制器

V;
html视图都是在 resources/view 目录下;
视图就可以按照控制器的目录来了;

resources
├─view 视图目录
│  ├─admin  后台admin模块下的视图目录
│  │  ├─index  后台admin模块Index控制器下的视图目录
│  │  │  ├─index.blade.php 后台admin模块Index控制器下index方法的视图文件
│  │  ├─category   后台admin模块Category控制器下的视图目录
│  │  │  ├─index.blade.php 后台admin模块Category控制器下index方法的视图文件
│  │  │  ├─create.blade.php 后台admin模块Category控制器下create方法的视图文件
│  ├─home  前台Home模块下的视图目录
│  │  ├─index  前台Home模块Index控制器下的视图目录
│  │  │  ├─index.blade.php 前台Home模块Index控制器下index方法的视图文件
│  │  ├─article   前台Home模块Article控制器下的视图目录
│  │  │  ├─index.blade.php 前台Home模块Article控制器下index方法的视图文件
│  │  │  ├─create.blade.php 前台Home模块Article控制器下create方法的视图文件
│  ├─user  用户User模块下的视图目录
│  │  ├─index  用户User模块Index控制器下的视图目录
│  │  │  ├─index.blade.php 用户User模块Index控制器下index方法的视图文件
│  │  ├─tag   用户User模块Tag控制器下的视图目录
│  │  │  ├─index.blade.php 用户User模块Tag控制器下index方法的视图文件
│  │  │  ├─create.blade.php 用户User模块Tag控制器下create方法的视图文件

thinkphp 模块下是有公共函数文件 function.php ;
laravel 没有定义目录;
我是给定义在 app/Library/Function/helpers.php ;

thinkphp 模块下是有配置项文件的;
laravel 没有按模块;
而是统一放在了 跟目录的 config 目录下;

就 mvc 而言的话;
laravel 多了一个定义路由的过程;
路由都是在 routes/web.php 文件中定义的;

这里寥寥几句简单把用到的目录先介绍下;
有个初步的印象即可;
后续再详细讲解每个模块;

我已经在我最新的 laravel-bjyblog 项目中使用这种结构;
想在完整的项目中理解的话;
可以关注 用laravel重构的白俊遥博客开源代码laravel-bjyblog
现在是在内测中;
可能会有大的改动;
不过用来参考还是可以的;
前台的路由为了兼容 thinkphp-bjyblog 的设计;
没有完全按照本篇文章的讲解;

白俊遥博客
请先登录后发表评论
  • 最新评论
  • 总共15条评论
白俊遥博客

:正在学习。。

2017-12-11 14:55:39 回复

白俊遥博客

:test

2017-10-31 16:12:00 回复

白俊遥博客

金松:白老师,久久未来,这段时间在学js方面的知识。刚好也在了解 laravel这块儿,最初是接触tp这个框架来学习php的,开发也是分的前端后端,但是看了很多laravel的开源项目,发现不知道前端要怎么修改了,所以,希望还能教教这方面,看看怎么好入手laravel白俊遥博客

2017-09-03 01:45:53 回复

白俊遥博客 白俊遥博客
  • 云淡风晴 回复 金松:前端是一大块;这得开系列文章慢慢讲;
  • 2017-09-09 00:26:06 回复
白俊遥博客

new soul:gfdgdfgfd

2017-08-20 09:11:00 回复

白俊遥博客
  • 健♂ 回复 new soul:test
  • 2017-08-23 15:54:11 回复
白俊遥博客
  • 健♂ 回复 健♂白俊遥博客白俊遥博客test
  • 2017-08-23 15:54:31 回复
白俊遥博客

蓝天白云:我喜欢把Models文件夹放到Http文件夹下面,和Controllers平级

2017-07-19 18:21:57 回复

白俊遥博客 白俊遥博客
  • 云淡风晴 回复 蓝天白云:参考了许多项目后;为了跟多数人的习惯保持一致;减少别人适应的时间;我最后是决定放app目录下了;
  • 2017-07-24 22:57:18 回复
白俊遥博客
  • 小川☆哲梦 回复 云淡风晴:很棒
  • 2017-10-26 15:06:34 回复
白俊遥博客

isu5:还是喜欢index.php在根目录

2017-07-19 17:30:08 回复

白俊遥博客 白俊遥博客
  • 云淡风晴 回复 isu5:相比于在跟目录;laravel 这种放在 public目录下的更加安全合理些;
  • 2017-07-24 22:58:02 回复
白俊遥博客
  • 找电影上琵琶影院 回复 云淡风晴:有个问题请教下,nginx  root 指向我的一个site目录,并没有直接指public,然后访问路由是 ip/项目名/public/ 这样只能访问默认的首页,配置其他路由在访问就都是404,请问这是为什么呢?直接指向public是可以的
  • 2017-11-27 17:21:47 回复
白俊遥博客

isu5:没有看到css 文件放在什么地方

2017-07-19 17:20:03 回复

白俊遥博客

Serene:对于中间件/策略类/gate/ACL/can这几个的用法和关系,我有点搞混了,你能帮忙解释一下吗

2017-07-19 17:16:51 回复

白俊遥博客 白俊遥博客
  • 云淡风晴 回复 Serene:这个三言两语还真说不清;先自己试着理解;我过后抽出时间了详细写文章;
  • 2017-07-24 23:01:38 回复
白俊遥博客
  • Serene 回复 云淡风晴:恩恩,写了半个月的laravel,渐渐了解了。
  • 2017-07-24 23:17:58 回复
白俊遥博客

Serene:白大,能不能上传个带依赖包的laravel_bjyblog?

2017-07-18 18:06:33 回复

白俊遥博客 白俊遥博客
  • 云淡风晴 回复 Serene:laravel-bjyblog还有好多的问题在处理;发了意义不大;
  • 2017-07-24 23:05:48 回复
白俊遥博客
  • new soul 回复 Serene:ggfdgfdg
  • 2017-08-20 09:11:41 回复
白俊遥博客

Serene:laravel_bjyblog这个项目,composer install后,php artisan migrate报错:PHP Fatal error:  Uncaught UnexpectedValueException: The stream or file "/data/wwwroot/default/laravel-bjyblog/storage/logs/laravel.log" could not be opened: failed to open stream: Permission denied in /data/wwwroot/default/laravel-bjyblog/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php:107Stack trace:#0 /data/wwwroot/default/laravel-bjyblog/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php(37): Monolog\Handler\StreamHandler->write(Array)#1 /data/wwwroot/default/laravel-bjyblog/vendor/monolog/monolog/src/Monolog/Logger.php(337): Monolog\Handler\AbstractProcessingHandler->handle(Array)等等

2017-07-18 18:04:28 回复

白俊遥博客 白俊遥博客
  • 云淡风晴 回复 Serene:没有权限;
  • 2017-07-24 23:10:40 回复
白俊遥博客 白俊遥博客
  • 云淡风晴 回复 Serene:修改配置项数据库链接;
  • 2017-07-24 23:15:21 回复
白俊遥博客

gongchixin:不知道为什么 使用laravel 开发了半个月了  始终没有感觉得优雅 ,反而十分的繁琐,我不是在指路由(这个功能很好) 而是(比如 request responses collection ORM) 各种繁琐 各种重复的东西 ,虽然理解存在即合理,但是能否举例说明到底 laravel到底优秀在哪里?是否对开发效率有很大的提升?还是 对大型项目的设计会比较好?还是面向对象设计会比较方便?

2017-07-18 12:05:57 回复

白俊遥博客 白俊遥博客
  • 云淡风晴 回复 gongchixin:laravel 就是面向对象; 优雅在超低的耦合度; 对新技术的运用; 规范合理的构架等等;
  • 2017-07-24 23:13:40 回复
白俊遥博客

吴伟祥:白师傅,加油!一直关注你!

2017-07-17 23:22:32 回复

白俊遥博客

Beisha:php中的“面向对象”来源于java,而java又源自于C。之所以有php,主要是其大道至简的本质。而php版本7.1的开发者之一,鸟哥也声称他并不喜欢增加更多的“语法糖”。有些偏离其当初的方向。不过laravel 真的优雅~

2017-07-17 10:07:33 回复

白俊遥博客
  • 爱便流通于世 回复 Beisha:666
  • 2017-07-17 10:12:55 回复
白俊遥博客

Beisha:YII更偏向于面向对象。laravel 的有些语法糖,“优雅”过头了。

2017-07-17 10:00:53 回复

白俊遥博客
  • 爱便流通于世 回复 Beisha:不是啊 laravel 就是面向对象 只不过他封装好了 理解容器 里面的 trait 都是很好的 许多的 packagist包 composer配置一下就可以用 还有 migrate 等等 很多的东西都要去深入了解的  马上 laravel 5.5 LTS版 就要出来了,嘿嘿!
  • 2017-07-17 10:08:47 回复
白俊遥博客
  • 爱便流通于世 回复 爱便流通于世:就是要 优雅 
  • 2017-07-17 10:09:13 回复
白俊遥博客

爱便流通于世:目录结构很不错!!!

2017-07-17 08:45:08 回复