2011-05-05 10 views
11

Estoy desarrollando una pequeña aplicación web. No hay ninguna funcionalidad avanzada, solo consultas básicas de una base de datos.Muchas plataformas, el mismo código base, la mejor estrategia?

El sitio web en sí mismo permite el inicio de sesión a través de los medios habituales y Facebook Connect, luego tiene algunas funciones CRUD.

Voy a crear una aplicación de Facebook "nativa" para él, así como una aplicación de iPhone y una aplicación de Android.

Mi pregunta es, ¿cuál es la mejor manera de mantener la base de código?

He hecho esto antes, cuando creé una API básica que me permitía agregar, editar y eliminar registros de bases de datos, y luego utilicé HTTP POSTs para la API en todas las plataformas. Esto hizo que fuera extremadamente fácil mantener la base de código, corregir errores, hacer actualizaciones, etc., ya que solo tenía que actualizar un lugar. Las aplicaciones individuales en sí mismas solo tenían algunas modificaciones y luego algunas solicitudes CURRICULARES. Aunque esto funcionó muy bien para las aplicaciones móviles (iPhone y Android), hizo innecesarias solicitudes de http en el sitio web y la aplicación de Facebook.

¿Cuál es la mejor manera de abordar esta situación? ¿Debo crear 2 sitios web (Facebook y un sitio web normal) y una API? Esto haría que sea más difícil de mantener, pero mucho más estable y más rápido. ¿Solo una API, que lo haría fácil de mantener?

La base de código es PHP en CodeIgniter con MySQL como base de datos.

+0

No entiendo completamente lo que está preguntando. Dijiste que hiciste la misma web (o similar) anteriormente y que era muy simple mantenerla, ¿por qué preguntar de nuevo? ¿Por qué no utilizas el mismo enfoque otra vez? – shadyyx

+0

Mencioné que era fácil de mantener, pero creó muchas solicitudes http innecesarias. Como cualquiera le diría, esta es una forma muy retrógrada de pasar datos cuando está consultando la misma máquina. Es como enviar una carta a su vecino de al lado en lugar de entregarla usted mismo. – Mike

+0

Acabo de construir un sitio web con API simple (algo similar a XML-RPC) y una aplicación de Android. El sitio web tiene su propio frontend y backend (administración), API se encuentra junto a él solo con fines comunicativos (para comunicarse con aplicaciones de Android y iPhone).Y no veo nada malo en este enfoque ... Solo una desventaja: cuando se cambia la base de datos (por alguna razón), tengo que actualizar la parte de PHP frontend + backend que opera sobre ella, la API y la aplicación de Android. Pero no mantendrá la mitad de esto de todos modos ... – shadyyx

Respuesta

4

Creo que deberías crear una API con clases php, y luego tener una API HTTP alrededor de ella.

API de la clase PHP:

<?php // myproducts.class.php 

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

Y entonces su API HTTP:

<?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); 

Con esto, se puede escribir fácilmente una clase obj-c para hablar con la API HTTP . Podría ser algo como:

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]); 

Obviamente usted quiere encontrar una API Obj-C para la codificación/decodificación JSON. Estoy usando TouchJSON

0

He creado algunos proyectos como el que describes. La misma plataforma, codeigniter y MySQL, que hace poca diferencia en este caso. Una cosa que he encontrado útil hasta ahora es que cuando su sitio web se ve desde el facebook iframe, el agente de usuario golpear a su sitio es

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

para que pueda detectarlo.

A veces puede salirse con la suya simplemente cambiando el archivo CSS basado en el agente de usuario, si no necesita autenticación. Si necesita autenticación, simplemente escriba un controlador por separado, o use el js SDK. Si esto no es suficiente, o si su sitio es más complejo, tenga vistas separadas para Facebook y el sitio web normal, y cambie de acuerdo con el agente de usuario. No puedo ayudarte con la API, pero imagino que utilizarás los mismos modelos para la API que para el sitio web, un controlador por separado es obligatorio.

+0

¿Entonces sugeriría la misma base de código para todo, con diferentes controladores para la API y una plantilla diferente para Facebook? Tiene sentido, supongo, podría tener que buscar una mejor separación de archivos dentro de CodeIgniter. Sé que puedes dividir las carpetas en:/login/controllers | models | views/en lugar de/controllers | models | views/login /, que pueden ser útiles – Mike

+0

Bueno, en pocas palabras sí. He estado haciendo solo programación de Facebook durante el año pasado, así que mi mente fue inmediatamente allí. Lo que generalmente me sucede es que termino con un archivo modelo grande, y desechables, cortos como posibles controladores y vistas. Además, si planea mantener esto durante más de un año, separe las partes de Facebook tanto como sea posible, ya que cambian con frecuencia. Buena suerte – DannyKK

0

Con un poco de previsión, puede obtener una API por muy poco esfuerzo adicional, especialmente si tanto ella como su sitio web se basan en los principios de REST. Por ejemplo, si tiene un método de "agregar" en un controlador, esto hará casi exactamente lo mismo para el sitio web y la API. Si configura un árbol de datos (con matrices u objetos) para pasar a la vista, puede devolver la representación codificada JSON de este árbol si la solicitud se realiza a través de la API.

En cuanto a la aplicación de Facebook, dependiendo de cuánto tenga en común con el sitio web principal, podría construir ambos sitios en la misma instalación codeigniter con alguna enrutamiento y/o magia de reescritura de URL, permitiéndole compartir cualquier modelo, controlador, o vistas similares si está utilizando una biblioteca de plantillas extensible.

1

Hemos estado usando Kohana desde enero. Nos mudamos de Codeigniter, y es bastante encantador. El sistema de archivos en cascada facilita la organización de su código.

Un ejemplo del uso multiplataforma es Android. Hemos llevado la mayor parte de la lógica a php, luego la incorporamos a Android WebView, con algunos ayudantes para la conectividad y la velocidad, y se muestra como una aplicación nativa.

Con Kohana, solo crea una vista JSON para las llamadas API. Puede verificar la solicitud para ver si es AJAX para decidir si usar una vista JSON u otra vista.

Para decidir entre el navegador o la aplicación móvil, establecemos una cadena de agente de usuario única para nuestra aplicación móvil, luego la probamos para php-side. Además, tenemos una jerarquía de vistas que nos permite tener algunos archivos de diseño diferentes. Hay uno para solicitudes móviles, uno para la aplicación web, otro para un determinado tipo de usuario, etc.

En general, Kohana es más flexible que Codeigniter, y una excelente base para crear aplicaciones web y API.

El inconveniente de Kohana es que la documentación es bastante pobre. Sin embargo, una vez que empiece a usarlo, lo entenderá rápidamente. La base de código es limpia y fácil de leer.

Lo siento si he hablado mucho de Kohana, pero, si desea utilizar php y tener la flexibilidad que parece desear, este es el lugar para comenzar, en mi humilde opinión.

+0

Él ya mencionó que está usando CI- Recomendaría no saltar en cualquier momento, aunque cambié de CI a Kohana por razones de flexibilidad. La documentación de Kohana ha mejorado mucho en los últimos meses, y eso es cada vez menos una crítica bien fundada contra Kohana. –

1

Tomaría un enfoque N-Tier. Trate las aplicaciones "móviles" (iOS y Facebook) como el nivel más alto. Pasan la mayor parte de su tiempo visualizando datos y obteniendo información del usuario. A través de una buena dosis de AJAX, trabajan con la aplicación PHP, que sirve como el "Controlador" manejando la lógica de negocios y lidiando con la persistencia & de concurrencia. Sí, hay muchos datos volando, pero no se optimizan prematuramente. A medida que desarrolla su aplicación, piense en dónde puede almacenar los datos en caché, y cuando encuentre solicitudes excesivas, optimícela en versiones posteriores. Desafortunadamente, en realidad no existe un administrador de relación de entidad que cruce el límite de Javascript/PHP, por lo que es roll-you-own por un tiempo.

Cuestiones relacionadas