ThinkSNS采PHP+MySQL技术平台,社交核心+多应用+多插件机制。 下面我们将为大家介绍开源社交系统ThinkSNS基础的技术要点:
开源社交系统ThinkSNS中,应用都有一个配置文件,目前应用目录是apps/<app name> 所以,配置文件就是:“apps/<app name>/manage.json”,下面有演示代码:
我们可以看到这是比较新的应用配置,老的应用中只需要配置“resource”项即可,配置这项后,静态资源会缓存到“storage/app/<app name>”下,如果你配置了开发者模式,每次访问都会移动到这里,所以,storage/app目录是公开的暴露目录。
实现上述所说就不得不提新的应用安装类,命名空间是TS\Helper\AppInstall -对新的应用机制做了一些列处理(目前是静态资源缓存),应用的运行器也是位于该命名空间下,“TS\Helper\Controller”这个及时运行器,只需要传入App Name,Controller Name, Action Name,运行器会通过Composer中查找到应用注册的命名空间,来运行需要的控制器代码。
说到这里,不得不提一点重要的技术加入,就是Composer包管理工具。Composer可以说是所有语言的包管理工具中最好的工具,其提供了第三方包的规范集成,升级,卸载,还有符合PSR-0和PSR-4规范的AutoLoader工具。这使得TS中不在需要冗余的自定义自动加载来查找我们需要的类文件和库文件了,使用Composer就可以直接注册。我们用个最简单的例子来说明:
据了解TS开发团队正在开发的全新Web Application应用,其中的重要代码存在于apps/<app na,e>/src目录下,那么,TS是如何能找到类自定义的目录位置的呢?说到这里,就得知道应用规定的命名空间,应用对命名空间没有任何要求,唯一有要求的就是控制器,Controller的看命名空间规定为“App\<app Name>”,这么规定是方便通过URL参数找到应用的控制器,当然,这个也只是暂时的,以后TS的开发中不在有任何命名空间等技术上的要求,你只需要调用路由器注册控制器,而不再是TS主动查找控制器了,使用的所有东西都需要提前注册,这符合先进的技术要求。
言归正传,开源社交系统ThinkSNS怎么找到 Controller的呢?
其实TS做的事情很简单,构造一个“App\<app name>\<controller name>”的类,然后实例化这个类即可,而这个类是应用开发的时候通过Composer注册到了自动加载中的。这个应用准寻的规范是PSR-4,所以,我们可以把代码放在任何目录,而不只是src目录,这个目录对于TS程序来说是未知的,而Composer却知道,所以TS只需要“询问”Composer就可以得到。
此项新技术的引入,不但减少了繁重的开发工作,而且使得TS代码更加简单,因为我们不在关心和TS本身代码无关的事情,我们只需要专注自己代码部分的开发即可。所以TS的代码包,除开第三方库,从去年的24MB减少到了现在的21MB,为什么还是这么大?因为TS在使用新的技术的同时,要考虑到旧的模块的运行需求,现在无能为力把旧的模块都重新开发一次,因为没有这个必要。我们总不能说,生了一个孩子,孩子长丑了就塞回去重新生的吧!
开源社交系统ThinkSNS改变的重点在ORM的加入,那么新的数据model怎么使用呢?来个基础的继承代码:
没错,加上注释也就20行,那和之前的模型继承有什么区别?一个区别在于传递参数的改变,ORM支持在MySQL,SqlLite,SQL server等数据库中自由切换。另一个区别在于定义的关键词的改变,一但定义了模型,就可以对表经常操作了,是不是很简单。上表中,查询一条feed_id是1的数据,很简单,Feed::find(1)。OK,我们已经查询完成了。当然,返回的是一个object,而不是纯数据的Array。
如果你想把它变成你要的数组,比如$feed就是上面的查询返回的数据,那么只需要 $feed->toArray()就可以做到。如果我们能知道表的字段,我们就可以直接把查询出来的数据当成对象成员的形式读取,比如$feed->feed_id或者$feed->cTime,也可以直接把这个对象传递给foreach来对属性进行遍历,由此看出,新的ORM对数据处理我们无需像以前那样对数组操作,但是我们可以对遍历等在以前的基础上不变。
当然,具体的更多用处,可以查询Laravel框架官方文档,再举一个ORM中关系的例子。
public function phone()
{
return $this->hasOne(‘Phone‘);
}
在上面的方法中定义一个这样的方法,我们一对一的关联了Phone这个模型,$data = Feed::find(1)->phone 我们就可以得到phone主键feed_id和feed表相同的值的表对象。是不是很方便?
最后再来说一点controller上面的事情把,在TS中封装了一个叫做“TS\Base\NoneController”的基类,在你的控制器下,定义一个叫做“App\<app name>\Controller\None”的控制器类,继承这个NoneController对象,那么,你应用下访问到了不存在的controller的时候就会重定向到这个controller。所以,你可以用这个东西拓展出很多意想不到的方法。