动态路由 不是实例的问题

我有个需求就是模块化组件化开发,所以有些东西是动态的;
那么我就应该要有个动态路由吧?

Route 路由文件里是这么写的;

Route::match(['get', 'post'], '/{controller}/{action}/{params?}', function ($controller, $action, $params=null) {
    $namespace = 'App\Http\Controllers\Modules\\'.ucfirst($controller).'\\Front\\';
    $className = $namespace . ucfirst($controller . 'Controller');
    $tempObj = new $className();
    return call_user_func(array($tempObj, $action), $params);
});

那么问题来了。当我访问了,方法竟然不能注入了;
比如

public function index(Request $request)
{
    ...
}

在方法注入,就会报错:

Argument 1 passed to App\Http\Controllers\Modules\Front\IndexController::index() must be an instance of Illuminate\Http\Request, null given, called in E:\www\TestWeb\routes\web.php on line 187

我觉得是我动态路由写法姿势不对导致的,可是也不知道咋办;

顺便问一下,你们如果有一个比较常用的查询,会不会吧查询方法写到指定的模型里去?
比如posts,我很多地方都用到文章数据,你们会不会把获取数据写到posts模型里面去,直接调?
还是你们会分离一个服务层来做?

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

之前有个项目做过和你这个看起来有点类似的东西。

namespace App\Controllers;

use App\Controllers\Operate\Test1Controller;
use App\Controllers\Operate\Test2Controller;

class OperateController {

    //引入xxx模块
    use Test1Controller;

    //引入xxx模块
    use Test2Controller;

}
Route::any("/Operate/{action}", function ( $action, Request $request) {
    $JsonParams = $request->all();
    $operateInterface = \App\Controllers\OperateController::class;

    if (method_exists($operateInterface, $action)) {
        $ret = $operateInterface::$action($JsonParams);
    } else {
        $ret = [false, "methodNotExists"];
    }

    return Response::json($ret);

})->middleware("xxxxxx");

个人会比较习惯写一些静态方法在模型里面,方便使用

4年前 评论
yema

会分离一层服务层,但是不会放在模型里,模型一般写关联关系、访问器、获取器这种跟模型相关的。逻辑处理单独封装一层,介于控制器和模型之间。
然后你自己实例化控制器当然不能依赖注入了,应该要走容器才可以依赖注入。你可以查看手册的服务容器或者自己去写反射类。不过挺麻烦的。

4年前 评论

首先,,,你手动 new 控制器,控制器的构造方法就不能自动注入,,,要这样 app()->make()

其次,你手动 call_user_func 来调用控制器方法,,,那方法也不能自动注入,,,要这样 app()->call()

最后,我都没试过,你要自己尝试下,,,

4年前 评论
hackxiaoya (楼主) 4年前

我的:

file

结果:

file

4年前 评论

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