yaf icon indicating copy to clipboard operation
yaf copied to clipboard

开启名称空间后,无法实例化控制器

Open lxepoo opened this issue 9 years ago • 7 comments

先说下我的环境: 1.win7 2.php5.4 3.yaf2.3.5 stable

我的配置: yaf.use_namespace = 1 配置里就开启了一个名称空间选项

我遇到的问题; 1.我分了2个module,index和system 2.我访问system/category/index可以访问(基于上面的配置),并且能够正常输出。

下面是症状: 我为CategoryController.php加入了名称空间

namespace application\modules\system\controllers;

然后开始报错了,报错提示是这样的: exception 'Yaf\Exception\LoadFailed' with message 'Could not find class CategoryController in controller script D:\wwwroot\yafchina/application\modules\System\controllers\Category.php' in D:\wwwroot\yafchina\public\index.php:15 Stack trace: #0 D:\wwwroot\yafchina\public\index.php(15): Yaf\Application->run() #1 {main}

文件是存在的,并且没有问题。只是加了一个名称空间,一行代码。

所以,我的猜测是,YAF扩展路由跳转到控制器,并且开始实例化的时候出错了,因为YAF仅仅是load了文件,而没有导入名称空间,所以即使导入了文件也没办法找到这个类?

这个问题感觉有点怪异啊,是否代表着,只要是yaf的控制器就无法为其添加名称空间设置呢?

lxepoo avatar Oct 10 '15 06:10 lxepoo

你可以看看这个issue,问题在于controller、model等是Yaf内建的模块不需要你在指定namespace了。

idevz avatar Oct 10 '15 09:10 idevz

@idevz 感谢,你说的我在问题里已经猜到了。但是问题在于如何解决,我的开发方式引用的一些库确实会重名,这个问题不好解决。按照你给的链接,基本判断这个问题无解。-_-!

lxepoo avatar Oct 10 '15 09:10 lxepoo

为什么会重名?按照你这个例子你有个System的module,假设这个module里面有个test的controller,里面有个add的action,那你的访问应该/?m=system&c=test&a=add,如果你的Index module里面也有个test的controller,里面有个add的action那就用/?c=test&a=add,如何会重名?不太理解

idevz avatar Oct 10 '15 09:10 idevz

你忽略了第三方库,如果引用第三方的ORM、模板引擎就会遇到这情况,比如BaseModel就一定重名,无法继承。

lxepoo avatar Oct 10 '15 09:10 lxepoo

能具体举个例子吗?我也用了很多第三方库,ORM、模板引擎没遇到这种问题,第三方的应该都放到library目录下吧,怎么又跟model扯上了?模板引擎肯定会需要实现一个适配器吧,适配器里面加载第三方的库,如果第三方的库加载方式与yaf不一样,就给他实现一个autoloader,然后spl_autoload_register注册进去就行了

idevz avatar Oct 10 '15 09:10 idevz

不管重名不重名,我还是希望能在控制器用上命名空间,这样便于做单元测试,当然也可以避免楼上的重名问题。

overtrue avatar Jan 04 '16 09:01 overtrue

@overtrue 我也同意,我目前碰到的困惑也是由于单元测试中由于没有命名空间,所以重复加载Controller导致无法自动化测试,唯一的方式只能更改类名。

lancerhe avatar Jan 31 '16 05:01 lancerhe