很多平台,相同的核心代码库,最佳策略?

时间:2011-05-05 10:07:04

标签: php mysql facebook api codeigniter

我正在开发一个小型网络应用程序。没有任何高级功能,只有数据库的基本查询。

网站本身允许通过常规手段和Facebook Connect登录,然后它具有一些CRUD功能。

我将为它创建一个'原生'Facebook应用程序,以及一个iPhone应用程序和一个Android应用程序。

我的问题是,维护代码库的最佳方法是什么?

我之前已经创建了一个基本API,允许我添加,编辑和删除数据库记录,然后我在所有平台上使用HTTP POST到API。这使得维护代码库,修复错误,进行更新等非常容易,因为我只需要更新一个地方。各个应用程序本身只有一些皮肤,然后是一些cURL请求。虽然这对于移动应用程序(iPhone和Android)非常有用,但它确实在网站和Facebook应用程序上发出了不必要的http请求。

解决这种情况的最佳方法是什么?我应该创建2个网站(Facebook和普通网站)和API吗?这将使维护更加困难,但更加稳定和快速。只是一个API,这将使其易于维护?

代码库是CodeIgniter中的PHP,MySQL是数据库。

5 个答案:

答案 0 :(得分:4)

我认为您应该使用php类创建一个API,然后使用HTTP API。

PHP class API:

<?php // myproducts.class.php

class MyProducts
{
  static function addProduct($name, $price)
  {
    // add the product
  }
}

然后是您的HTTP API:

<?php // api/products.php

// read HTTP POST and decode it as json
$postParams = json_decode(file_get_contents('php://input'));
if (!$postParams)
  throw new exception("Could not decode POST data, invalid JSON.");

// run the desired action
$classMethod = $postParams['action'];
$arguments = $postParams['arguments'];
$result = call_user_func_array(array('MyProducts', $classMethod), $arguments);

// print result as JSON
print json_encode($result);

通过这种方式,您可以轻松编写一个obj-c类来与HTTP API进行通信。它可能看起来像:

NSData *postData = [@"{\"action\": \"addProduct\", \"arguments\": [\"Foo\", 42.00]}" dataUsingEncoding:NSUTF8StringEncoding];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:API_URL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:postData];
NSHTTPURLResponse *urlResponse = nil;
NSError *error = nil;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&error];

NSLog(@"response: %@", [[[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding] autorelease]);

显然,你会想找到一个用于编码/解码JSON的Obj-C API。我正在使用TouchJSON

答案 1 :(得分:1)

我们自1月以来一直在使用Kohana。我们从Codeigniter搬了,很可爱。级联文件系统可以轻松组织代码。

多平台使用的一个例子是Android。我们已将大部分逻辑推入php,然后我们将其转换为Android WebView,并提供一些连接和速度帮助,并显示为本机应用程序。

使用Kohana,只需为API调用创建一个JSON视图。您可以检查请求以查看是否使用AJAX来决定是使用JSON还是其他视图。

要在浏览器或移动应用之间做出决定,我们会设置一个我们的移动应用独有的用户代理字符串,然后在php端测试它。此外,我们有一个视图层次结构,让我们有几个不同的布局文件。有一个用于移动请求,一个用于Web应用程序,一个用于特定类型的用户等。

总的来说,Kohana比Codeigniter更灵活,是构建Web应用程序和API的绝佳基础。

Kohana的缺点是文档相当差。但是,一旦开始使用它,您将很快理解它。代码库干净且易于阅读。

很抱歉,如果我继续关注Kohana,但是,如果你想使用php并且具有你似乎渴望的灵活性,那么这就是开始的地方,恕我直言。

答案 2 :(得分:1)

我会采取N级方法。将“移动”(iOS和Facebook)应用视为最高级别的层。他们大部分时间都在显示数据并从用户那里获得输入。通过健康的AJAX,他们与PHP应用程序一起工作,该应用程序充当处理业务逻辑和处理持久性的“控制器”。并发性。是的,有很多数据飞来飞去,但没有过早优化。在开发应用程序时,请考虑可以缓存数据的位置,并在发现过多请求时,在以后的版本中进行优化。不幸的是,实际上没有跨越Javascript / PHP边界的实体关系管理器,因此它可以让你自己滚动一段时间。

答案 3 :(得分:0)

我创建了一些类似你描述的项目。相同的平台,codeigniter和MySQL,在这种情况下几乎没有什么区别。 到目前为止,我发现有用的一件事是,当您从facebook iframe查看您的网站时,用户代理就会访问您的网站

'facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)'

所以你可以检测到它。

如果您不需要身份验证,有时您可以根据用户代理更改css文件。如果您需要身份验证,只需为其编写一个单独的控制器,或使用js SDK。如果这还不够,或者您的网站更复杂,请为Facebook和普通网站分别查看,并根据用户代理进行切换。 无法帮助您使用API​​,但我想您将使用与网站相同的API模型,单独的控制器是必须的。

答案 4 :(得分:0)

通过一点预见,你可以获得一个API,只需要很少的额外工作,特别是如果它和你的网站都是围绕REST原则构建的。例如,如果您在控制器中有一个“添加”方法,这对网站和API几乎完全相同。如果您设置一个数据树(带有数组或对象)以传递给视图,那么如果通过API发出请求,您只需返回此树的JSON编码表示。

对于Facebook应用程序,根据它与主网站的共同点,您可以在相同的codeigniter安装上构建两个站点,并使用一些路由和/或URL重写魔术,让您共享任何常见的模型,控制器或如果您使用的是可扩展的模板库,则类似的视图。