laravel 学习中对模块、验证类、模型的疑惑
验证类问题
php artisan make:request ArticleRequest
创建的目录是app\Http\Requests\ArticleRequestPost
<?php
namespace App\Http\Requests;
class ArticleRequestPost extends FormRequest{
public function rules(){
return [
'title'=>'required'
]
}
}
我使用了Dcat admin,composer 安装后在生成了app\Admin\Controllers的目录
如果我在 app\Admin\Controllers 的控制器的方法中调用 app\Http\Requests\ArticleRequestPost 是否合乎开发规范呢?
模块问题
使用dcat admin,composer安装后,放置在app目录下,那多个模块都可以放置在app下吗?
// 这样的目录是被允许呢?
app
--Admin [dcat admin 模块]
----Controllers
--Forum [论坛模块]
----Controllers
--Mall [商城模块]
----Controllers
--Http [默认存在的 Http]
----Controllers
Http目录
Http 目录包含了控制器、中间件以及表单请求等,几乎所有通过 Web 进入应用的请求的逻辑都在这里进行
以上是摘抄官方文档的
如果是api项目前后端分离,多个模块的,目录应该是什么样子的呢?
模型问题
按照laravel开发规范文档中的说明,所有的模型都应该放在app\Models下
那是否可以多级呢?
如:数据表中的用户相关的表
member_authoirze,member_address,member_integral
商品相关的表
goods,good_unit,good_category,good_spec,
// 以下目录是否被允许呢? 命令空间 App\Models\Member
app
--Models
----Member
------MemberAuthorize.php
------MemberAddress.php
----Goods
------Goods.php
------GoodUnit.php
------GoodCategory.php
一般业务逻辑放在模型里面是否合适呢,还是放置在service或者logic层?
如:我要获取一个商家的商品,在app\Models\Goods.php 中声明
public function getUpList(){}
public function getListById(){}
这个方法写在model里面个人觉得很不友好,
我要保存一个商品的时候,要实例化模型,然后赋值,然后保存
$goods=new Goods();
$goods->title=request()->input('title');
$goods->intro=request()->input('intro');
$goods->save();
上述代码实例化,拥有了基础属性信息,诸如 title、intro、thumb等,
但同时也拥有了很多业务层面封装的方法,如getUpList(),getListById(),getListByCategoryId()
然后会越来越臃肿,基础的属性和大量的业务逻辑混合在一起
有必要抽离出来呢?还是就一股脑的写在model里面?抽离的话是定义service还是logic层呢?
service、logic目录如何创建呢?
诸如:
// 新建service、logic目录是否被允许呢?
app
--Http
--Models
--Servcie
--Logic
学习laravel的过程中的一点点疑问,学习的同时也看到 Laravel 项目开发规范 所以让自己学习的过程中能够规范编码
最后:在laravel开发的项目中,希望学习、了解更多规范的,合理的目录结构,是什么样子的呢?
1. 验证类问题
你说的调用是将
ArticleRequestPost
实例化然后调用方法吗? 不符合规范,不符合单一职责,如果你已经创建了验证类,应该使用依赖注入
的方式传参,分层管理,既确保了控制器接收到的参数是正确的又避免臃肿,每个模块应该负责自己的功能。2. 模块
这样建立文件夹管理每个模块是没问题的
3. HTTP 目录问题
前后端分离的项目同样都是放在 HTTP 文件夹,目录常规是这样的
4. 模型问题
如果一个表有多个从表,可以像你这样建立独立文件夹,这样方便管理,更直观,这是没问题的。
业务逻辑一般是放到
App\Services
命名空间内,数据自定义读写可以在可以在模型中处理,也可以在App\Repository
。之所以分离
Services
或Repository
在面对多个前端接口的时候,业务逻辑可以一劳永逸,我们只需要在控制器中调用他们即可。