关于laravel开发业务规划问题?

1.业务逻辑代码 新增Service好喃还是直接写到控制器或者模型里面喃?

2.开发中经常定义一些公共方法,方便控制层,模型层,业务层调用的这些,应该放哪儿喃?

3.自定义的配置信息应该放哪儿喃?3.自定义的配置信息应该放哪儿喃?

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案
  1. Service 就在 app 目录下新建 Services 文件夹存放即可,由控制器来实现业务代码,和模型无关。这里控制器只需要把 Service 实例化,并且传入参数即可
    举例:

    // UserController
    public $service;
    public function construct(){
     $this->service = new UserService();
    }
    public function store(Request $request){
       $this->service->create($request->validData())  // 这里调用 UserService 的 create 方法
    }
  2. 你所说的通用方法是 指控制器有控制器的通用方法模型有模型的通用方法 ?如果是这样的话,就应该写在基础控制器中,方便所有同类型的类来调用
    举例:

     name App\Http\Controllers
    
     class UserController extends Controller
     {
     ...
     }
    
     namespace App\Http\Controllers;  // 所有控制器继承这个基础控制器,在基础控制器中写通用方法
     use Illuminate\Routing\Controller as BaseController;
     class Controller extends BaseController
     {
         use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
         public function get()
         {
             ...
         }
     }

如果是全局通用方法的话,就写在 helper 助手文件,通常都会封装在 app/helpers.php,然后让 composer 自动加载该文件

举例:

//    app/helpers.php
<?php
// 这里我封装了一个 is_url 方法
if (!function_exists('is_url')) { 
    /**
     * @param $str
     * @return bool
     */
    function is_url($str)
    {
        return filter_var($str,FILTER_VALIDATE_URL) == true;
    }
}

然后打开根目录的 composer.json 文件,让 composer 自动加载这个 helpers.php

"autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        },
        "files": [
            "app/helpers.php" // 添加这一行
        ]
    },

执行

composer dump-autoload

然后就可以在项目的任意地方调用 is_url() 方法了。


class UserController extends Controller
{
    public function checkAvatar($url)
    {
            return is_url($url);
    }
}

这是两种通用方法的添加方式,还有一种封装,就是 HandlerHander 是比 helper 助手函数更为复杂的处理函数,其设计思路也是全局通用。

helper 就像工具箱,需要钳子扳手,自己去拿来用,而 Handler 更像家用电器,比如 洗衣机洗碗机扫地机器人,它是作为一个 功能 存在的,我们需要它来为我们完成一些工作。

Handler 的封装是在 App/Handlers 路径,和 Controllers 一样。

举例:

<?php
namespace App/Handlers;
// 这里封装一个 图片上传的 handler
class ImageUploader
{
    public function save()
    {
    ...
    }
}

调用:

$uploader = new ImageUploader();
$uploader->save($request->file);

很简单,不赘述了。

  1. 自定义配置信息放在 config 文件夹,文件格式就参考其他同目录下的配置文件即可
    举例:
    // 新建文件 config/test.php
    <?
    return [
     'url' => env('APP_URL', null),
     'site' => [
             'name' => env('APP_NAME', null)
     ]
    ];
    调用
    config('test.url');
    config('test.site.name');
3年前 评论
讨论数量: 4
Variable

1、业务逻辑代码建议写在Service,这也是符合框架架构。 2、公共方法可以放在自己创建的公共类文件中。比如在app目录下创建Helper文件夹,在里面创建Helper文件专门放置公共方法。 3、laravel框架的配置信息统一放在根目录config文件夹。 建议多阅读laravel手册。

3年前 评论
Variable

1、业务逻辑代码建议写在Service,这也是符合框架架构。 2、公共方法可以放在自己创建的公共类文件中。比如在app目录下创建Helper文件夹,在里面创建Helper文件专门放置公共方法。 3、laravel框架的配置信息统一放在根目录config文件夹。 建议多阅读laravel手册。

3年前 评论
  1. Service 就在 app 目录下新建 Services 文件夹存放即可,由控制器来实现业务代码,和模型无关。这里控制器只需要把 Service 实例化,并且传入参数即可
    举例:

    // UserController
    public $service;
    public function construct(){
     $this->service = new UserService();
    }
    public function store(Request $request){
       $this->service->create($request->validData())  // 这里调用 UserService 的 create 方法
    }
  2. 你所说的通用方法是 指控制器有控制器的通用方法模型有模型的通用方法 ?如果是这样的话,就应该写在基础控制器中,方便所有同类型的类来调用
    举例:

     name App\Http\Controllers
    
     class UserController extends Controller
     {
     ...
     }
    
     namespace App\Http\Controllers;  // 所有控制器继承这个基础控制器,在基础控制器中写通用方法
     use Illuminate\Routing\Controller as BaseController;
     class Controller extends BaseController
     {
         use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
         public function get()
         {
             ...
         }
     }

如果是全局通用方法的话,就写在 helper 助手文件,通常都会封装在 app/helpers.php,然后让 composer 自动加载该文件

举例:

//    app/helpers.php
<?php
// 这里我封装了一个 is_url 方法
if (!function_exists('is_url')) { 
    /**
     * @param $str
     * @return bool
     */
    function is_url($str)
    {
        return filter_var($str,FILTER_VALIDATE_URL) == true;
    }
}

然后打开根目录的 composer.json 文件,让 composer 自动加载这个 helpers.php

"autoload": {
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        },
        "files": [
            "app/helpers.php" // 添加这一行
        ]
    },

执行

composer dump-autoload

然后就可以在项目的任意地方调用 is_url() 方法了。


class UserController extends Controller
{
    public function checkAvatar($url)
    {
            return is_url($url);
    }
}

这是两种通用方法的添加方式,还有一种封装,就是 HandlerHander 是比 helper 助手函数更为复杂的处理函数,其设计思路也是全局通用。

helper 就像工具箱,需要钳子扳手,自己去拿来用,而 Handler 更像家用电器,比如 洗衣机洗碗机扫地机器人,它是作为一个 功能 存在的,我们需要它来为我们完成一些工作。

Handler 的封装是在 App/Handlers 路径,和 Controllers 一样。

举例:

<?php
namespace App/Handlers;
// 这里封装一个 图片上传的 handler
class ImageUploader
{
    public function save()
    {
    ...
    }
}

调用:

$uploader = new ImageUploader();
$uploader->save($request->file);

很简单,不赘述了。

  1. 自定义配置信息放在 config 文件夹,文件格式就参考其他同目录下的配置文件即可
    举例:
    // 新建文件 config/test.php
    <?
    return [
     'url' => env('APP_URL', null),
     'site' => [
             'name' => env('APP_NAME', null)
     ]
    ];
    调用
    config('test.url');
    config('test.site.name');
3年前 评论

laravel已经封装的很好了,即使全写在控制器也没几行代码(我全在控制器里完成)。 :joy:

3年前 评论
chowjiawei

1楼2楼都回答好了 都是标准的答案

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!