插件开发中是否应该注册路由

问题的产生

我在写一个 Laravel 的插件,想注册一个路由,然后将插件中的控制器注册进去。但问题是,控制器中要用到的一个变量,我不想写死在插件里,我希望能在在使用插件时自定义这个变量的初始化逻辑,我考虑的方案是:

  1. 在配置文件中初始化,插件中使用 config 辅助函数获取变量,但配置文件中无法写复杂的逻辑,配置文件中使用闭包则会让配置缓存失效;
  2. 不进行路由注册,而是将路由拷贝到项目路径,使用中间件初始化这个变量,但框架貌似没有直接获取路由文件路径的方法,我觉得使用 app_path 辅助函数拼上相对路径的方式很容易弄错;
  3. 复制插件中的控制器到项目路径,这样做的缺点是,一旦用户更改了控制器的命名空间,插件中的路由配置将失效;
  4. 在配置文件中使用数组方式写入静态调用的 callable 类型配置,用于初始化变量,插件中的控制器使用 is_callable 进行判断,我觉得这是比较可行的方案,但感觉不太优雅。

大家平时怎么做?还请不吝赐教。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案

好像我有过这类的情况,大约是好像用下面这种方式,献丑了

<?php
// ----------------插件命名如下--------------
namespace Demo;

// 插件依赖接口
use Demo\Manage;

// 插件控制器
class ManageController extends Controller
{
    public function run(Manage $manage)
    {
        // 使用插件
        return $manage->run();
    }
}

// 依赖接口
interface Manage
{
    public function run();
}

// -----------------重点:在项目层去实现接口------------------
namespace App\Manage;

use Demo\Manage;

class ManageHandle implements Manage
{
    public function run()
    {
        return 'run';
    }
}

// ------------------在 config/Demo.php 配置实现接口的类---------------
'manageClass' = App\Manage\ManageHandle::class

// ------------------在插件的服务注册者中绑定接口到实现---------------------
public function register()
{
    // 接口绑定到实现
    $this->app->bind(
        'Demo\Manage',
        config('demo.manageClass')
    );
}

大约这是我的思路,可以参考一下

4年前 评论
畅畅 (作者) 4年前
sanders (楼主) 4年前
讨论数量: 1

好像我有过这类的情况,大约是好像用下面这种方式,献丑了

<?php
// ----------------插件命名如下--------------
namespace Demo;

// 插件依赖接口
use Demo\Manage;

// 插件控制器
class ManageController extends Controller
{
    public function run(Manage $manage)
    {
        // 使用插件
        return $manage->run();
    }
}

// 依赖接口
interface Manage
{
    public function run();
}

// -----------------重点:在项目层去实现接口------------------
namespace App\Manage;

use Demo\Manage;

class ManageHandle implements Manage
{
    public function run()
    {
        return 'run';
    }
}

// ------------------在 config/Demo.php 配置实现接口的类---------------
'manageClass' = App\Manage\ManageHandle::class

// ------------------在插件的服务注册者中绑定接口到实现---------------------
public function register()
{
    // 接口绑定到实现
    $this->app->bind(
        'Demo\Manage',
        config('demo.manageClass')
    );
}

大约这是我的思路,可以参考一下

4年前 评论
畅畅 (作者) 4年前
sanders (楼主) 4年前

好像我有过这类的情况,大约是好像用下面这种方式,献丑了

<?php
// ----------------插件命名如下--------------
namespace Demo;

// 插件依赖接口
use Demo\Manage;

// 插件控制器
class ManageController extends Controller
{
    public function run(Manage $manage)
    {
        // 使用插件
        return $manage->run();
    }
}

// 依赖接口
interface Manage
{
    public function run();
}

// -----------------重点:在项目层去实现接口------------------
namespace App\Manage;

use Demo\Manage;

class ManageHandle implements Manage
{
    public function run()
    {
        return 'run';
    }
}

// ------------------在 config/Demo.php 配置实现接口的类---------------
'manageClass' = App\Manage\ManageHandle::class

// ------------------在插件的服务注册者中绑定接口到实现---------------------
public function register()
{
    // 接口绑定到实现
    $this->app->bind(
        'Demo\Manage',
        config('demo.manageClass')
    );
}

大约这是我的思路,可以参考一下

4年前 评论
畅畅 (作者) 4年前
sanders (楼主) 4年前

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