动态路由 不是实例的问题
我有个需求就是模块化组件化开发,所以有些东西是动态的;
那么我就应该要有个动态路由吧?
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模型里面去,直接调?
还是你们会分离一个服务层来做?
之前有个项目做过和你这个看起来有点类似的东西。
个人会比较习惯写一些静态方法在模型里面,方便使用
会分离一层服务层,但是不会放在模型里,模型一般写关联关系、访问器、获取器这种跟模型相关的。逻辑处理单独封装一层,介于控制器和模型之间。
然后你自己实例化控制器当然不能依赖注入了,应该要走容器才可以依赖注入。你可以查看手册的服务容器或者自己去写反射类。不过挺麻烦的。
首先,,,你手动
new
控制器,控制器的构造方法就不能自动注入,,,要这样app()->make()
其次,你手动
call_user_func
来调用控制器方法,,,那方法也不能自动注入,,,要这样app()->call()
最后,我都没试过,你要自己尝试下,,,
我的:
结果: