2009-02-14 11 views
39

Por favor, comparta sus patrones de diseño/diseño de aplicaciones favoritos para usar en PHP conmigo. Algunas cosas que me gustaría saber:¿Qué patrones de diseño/diseño de aplicaciones PHP usa?

  • Cómo carpetas están diseñados
  • La forma de utilizar oritentation objeto en sus aplicaciones PHP
  • ¿Tiene una forma estándar de tratar con un mantenimiento, paginación, o cualquier otras tareas comunes?
  • ¿Cómo se evita el uso de código repetitivo? ¿Cuál es su enfoque para bibliotecas/compartir códigos comunes, etc.?
  • ¿De qué manera puede hacer que su código sea más elegante?

No tiene que responder a todas estas preguntas, responder algunas o algunas de ellas será útil.

La razón por la que estoy preguntando esto, es porque estoy muy cansado de escribir código feo repetitivo en PHP y quiero hacer un pequeño marco para mis proyectos independientes que facilitará la programación y me permitirá centrarme en el tareas desafiantes/comerciales en lugar de validación de formularios, paginación y otras actividades mundanas que constituyen el 80% de la programación en PHP

¡Todas las opiniones se agradecieron!

+0

Si está ponderando todas las opiniones por igual, ¿por qué la recompensa? Seguramente no hay nadie, buena respuesta para esto. – Rob

+0

Sí, ¿qué estás buscando? Siento que entiendo tu pregunta como se dice ahora, pero si publicas una recompensa, entonces me lleva a creer que quieres más. – ryeguy

+0

Solo estoy buscando discusiones interesantes. Escogeré la respuesta mejor descrita al final –

Respuesta

69

Puede que me votó en contra de esto, pero si usted realmente desea escribir su propio marco, digo ir por ella, porque aprenderá mucho de la experiencia. Los otros marcos mencionados aquí son geniales y probados y no tomaría una mala decisión al usarlos, pero es su elección.

Antes de comenzar a escribir su marco, mire los otros marcos (en su sintaxis, estructura de directorios, esquema de nombres, patrones de diseño, etc.) y trate de descubrir por qué hicieron lo que hicieron y qué, si acaso, haría de manera diferente. Pruebe algunos tutoriales y juegue con su código, haga algunas aplicaciones de muestra. Si, después de hacer eso, no le gusta usarlos, siga adelante y comience a planificar su marco, manteniendo lo que funcionó y mejorando lo que no funcionó.

Si se decide a rodar su propia, aquí hay algunas cosas que recomendaría por mi propia experiencia:

  • hacer de la seguridad su prioridad - Si que escriba una capa de acceso de datos, el uso parámetros enlazados. Si escribe una clase de formulario , protéjase contra CSRF y XSS. Capture sus excepciones y maneje sus errores . Asegúrese de que su entorno PHP sea seguro. No intente con con su propio algoritmo de cifrado . Si no se concentra en seguridad, no vale la pena escribir su propio marco.
  • Comenta tu código - Necesitarás comentarios para ayudarte a recordar cómo funciona el código después de un tiempo. I suelen encontrar que los comentarios de docblock son más que suficientes. Más allá de eso, comenta por qué hiciste algo, no qué hiciste. Si necesita explicar qué, es posible que desee refactorizar.
  • clases individuales de responsabilidad y Métodos - La mayor parte de sus clases y métodos debe hacer una cosa y sólo una cosa . Tenga especialmente cuidado con esto con la base de datos - Su clase de paginación no debe confiar en su objeto de acceso a datos, ni debe casi cualquier otra clase (bajo nivel).
  • Test Unit - Si cada uno de sus métodos hace una sola cosa, debería ser mucho más fácil para ponerlos a prueba y lo hará resultado en un mejor código.Primero escriba la prueba , luego el código para pasar la prueba . Esto también le dará mayor libertad para refactorizar más adelante sin rompiendo algo.
  • Clases abstractas similares - Si tiene más de una clase que hace cosas similares, crear una clase padre que utiliza las similitudes entre las clases y extenderlo.
  • Delegado y modularizar - Si eres escribir un sistema de validación (y más probable es que probablemente lo haría), no incluye cada validador como un método de alguna clase de validación súper . Sepárelos en clases individuales de y llámelos si es necesario. Este se puede aplicar en muchas áreas: filtros , idiomas, algoritmos, validadores , y así sucesivamente.
  • Proteger y privatizar - En la mayoría de los casos , es mejor utilizar métodos getter y setter en lugar de permitir acceso directo a las variables de clase.
  • API consistente - Si tiene un render() de un empate() que hacer las mismas cosas en diferentes clases método y, escoger uno e ir con ella en todas las clases. Mantenga el orden de los parámetros iguales para los métodos que usan los mismos parámetros. Una API consistente es una API más fácil.
  • Recuerde carga automática - Los nombres de clase pueden conseguir un poco torpe y largo, pero la forma en que los nombres de Zend clases y organiza los directorios haga a autoloading mucho más fácil. Actualización: a partir de PHP 5.3, debe comenzar a usar espacios de nombres.
  • Nunca haga eco o imprima nada - Dé como valor de retorno y deje que el usuario decida si debe repetirse. Un lote de de veces utilizará el valor de retorno como parámetro para otro método.
  • no tratan de resolver en el mundo Problemas - a resolver su propia primera. Si no necesita una función en este momento, como una clase para localizar los números o las fechas o la moneda, no la escriba. Espere hasta que lo necesite.
  • No optimizar previamente - Construya unas pocas aplicaciones simples con su estructura antes de ajustarla. De lo contrario, puede pasar mucho tiempo en nada productivo.
  • Usar el Control de Fuente - Si pasas incontables horas creando una obra maestra , no se arriesgue conseguir perdido.
+0

No estoy de acuerdo con la parte de responsabilidad única, suena bien en teoría pero hacer que la clase de paginación haga las consultas para encontrar el total de filas, etc. usar la clase db es mucho mejor que volver a escribir el código thixs cada vez. Aparte de esa gran respuesta –

+0

Gracias. :) La razón por la que mencioné ese ejemplo específico es porque entonces le permite paginar más que solo información de la base de datos, de modo que si sus datos se almacenan en cualquier tipo de matriz o incluso en un archivo XML, puede usar la clase de paginación. – VirtuosiMedia

+0

Un ejemplo sería si quisiera paginar un canal RSS. Por supuesto, parte de esto también dependerá de cómo funcione su capa de acceso a datos. Para mí, no solo paso una consulta completamente escrita a mi DAL, entonces manejar el db en la clase de paginación no funcionaría para mi implementación personal. – VirtuosiMedia

8

casi me siento como un disco rayado, pero yo recomendaría que usted echa un vistazo a algunos de los marcos comunes por dos razones:

  1. Incluso si no decide usar uno, algunos de ellos son muy bien escrito y muy bien diseñado. Me gusta especialmente Zend Framework pero volveré a eso en un segundo.
  2. Pregúntese por qué está reinventando la rueda. ¿Realmente sientes que entiendes los mismos problemas de diseño que todos los demás enfrentan mucho mejor que la comunidad detrás (inserta el marco de elección aquí) para justificar escribir algo desde cero? Hablando como alguien que originalmente miró varios marcos y decidió que eran demasiado grandes, presentaba demasiada curva de aprendizaje o demasiada sobrecarga y así desarrolló la mía, puedo decirte que escribir la tuya desde cero es un gran dolor si simplemente puede usar uno existente que se puede extender fácilmente.

Hablando de usar un marco que se puede extender fácilmente, he tenido experiencias muy positivas con Zend Framework. Es una estructura cohesiva y, sin embargo, débilmente acoplada, hace que sea posible extender rápida y fácilmente cualquier componente existente y todo el marco está diseñado alrededor de la idea de que tendrá que escribir sus propias clases de ayuda y complemento para agregar a su funcionalidad general.

He encontrado que Zend Framework es tan completamente flexible que estoy ejecutando un único sitio web como parte de Zend Framework MVC y parte de mi antiguo framework de crappy e incluso código Crappier más antiguo que aún no he rescrito. De hecho, debido a que durante nuestra reescritura encontramos una página que funcionaba inaceptablemente lenta usando el viejo marco, he cambiado la página única para que se ejecute bajo la arquitectura de Zend Framework.

Para responder a algunas de sus preguntas, le recomiendo que consulte Patrones de arquitectura de aplicaciones empresariales de Martin Fowler. Proporciona una gran cantidad de información valiosa sobre cómo resolver una serie de estos problemas comunes, como la forma de crear una capa de interacción de base de datos en su aplicación. Fowler también cubre temas como MVC y Front Page Controller.

2

he explicado la mayor parte de mi metodología PHP here.

pero hoy en día, solo uso Django donde puedo.

2

Empecé con el motor de plantillas smarty cuando me cansé de mezclar código y html. Después de hackear por un tiempo, me di cuenta de que escribir mi propio marco es simplemente duplicar el trabajo.

He hecho algunos proyectos con Joomla, que es realmente un CMS pero les da a los clientes mucho control sobre el contenido.

Al final me he decidido por utilizar un marco real para mis proyectos. Estoy usando symfony, que está inspirado en Rails y está muy bien documentado, pero he escuchado que cakePHP y ZendFramework también son muy buenos.

13

Tengo que estar de acuerdo con los carteles de arriba. Si no está utilizando un marco cuando programa en PHP, realmente está programando con las manos atadas a la espalda. Yo personalmente recomiendo CodeIgniter. Es el marco más rápido, es muy fácil de aprender y tiene una comunidad muy activa. Todas sus preguntas serán contestadas por el marco:

* How your folders are designed 

CodeIgniter (o cualquier marco para el caso) se separa de su lógica en vistas, modelos y controladores, cada uno con su propia carpeta.

* Do you have a standard way of dealing with CRUD, pagination, or any other common tasks? 

CI tiene una biblioteca de paginación, y tiene bibliotecas 3 ª parte como DataMapper para envolver sus llamadas CRUD de una manera orientada a objetos (ORM).

* What are ways in which you can make your code more elegant? 

La separación del modelo, ver y hacer controlador de código muy elegante.

(2 Las preguntas que no respondió están más o menos implícito cuando se utiliza el marco)

2

Yo uso Zend Framework, que definen en buena medida el diseño de la carpeta y (paradigma MVC) POO. Para tareas comunes, como por ejemplo paginación, utilizo Zend_Paginator (mis clases de modelos implementan Zend_Paginator_Adapter_Interface), para la validación uso las clases Zend_Validate, etc. Gracias a eso me puedo concentrar completamente en la lógica comercial en lugar de reinventar la rueda.

9

Imagino que muchos desarrolladores de php han seguido una ruta similar a la mía: pequeños scripts -> procedural/inline-code -> posiblemente un vistazo a la creación de plantillas -> OOP -> luego un framework. Creo que puede ser bastante común que un desarrollador PHP haya "crecido" con PHP, aprendiendo patrones de diseño que coincidan con las características disponibles con la versión actual.

MVC es el patrón de diseño más utilizado en las estructuras populares que se utilizan actualmente. CakePHP es mi marco de referencia, aunque Symphony y Zend son muy populares también, vale la pena probar algunos y pronto se hará evidente con qué se siente más cómodo.

Para la mayoría de los proyectos (donde el desarrollo rápido y el código portátil son las prioridades) uso Cake, sin embargo, para aplicaciones livianas (una desarrollé recientemente fue Good Baad) que desea ejecutar rápido (en hardware de baja especificación) y No necesito el volumen/peso agregado por la funcionalidad de uno de los marcos grandes. Recomiendo leer el artículo de Rasmus Lerdorf en su No Framework PHP MVC framework.

Básicamente si buscas un verdadero lenguaje orientado a objetos que fomente el código hermoso y las mejores prácticas de diseño, PHP siempre va a perderse con los gustos de Ruby Python y C#. Pero, PHP tiene sus puntos fuertes, p. no es necesario un lenguaje de plantillas (es uno), PHP puede ejecutarse de manera muy rápida y económica y no necesita el peso de un marco grande para todas las aplicaciones.

Me gustaría adoptar un patrón de diseño que tome la capacidad de administración de un patrón de diseño como MVC y combínelo con las fortalezas de PHP.

+1

¿Has probado Codeigniter? –

+0

Sí, pero no lo tomé - aunque me gusta la huella pequeña que no adelgacé, fue lo suficientemente lejos. Me gustan las convenciones y restricciones de Cake and Symphony, y para un desarrollo rápido, estas son perfectas. Para aplicaciones livianas, creo que puedes ir más ligero que CI: se encuentra en tierra de nadie para mí. – Rudenoise

2

Usando Zend Framework y Doctrine, mi estructura de carpetas por lo general se parece a esto:

root 
    app 
    config   (db config, routing config, misc config) 
    doctrine  (fixtures, migrations, generated stuff, etc) 
    lib 
    logs 
    models   (doctrine models) 
    modules  (zend mvc modules) 
    bootstrap.php 
    docs    (db diagrams, specs, coding standards, various docs) 
    pub    (web root) 
    tests 
    tools   (console tools, i.e. doctrine-cli) 
    vendor   (zend and doctrine libraries, preferably as svn-externals) 
1

He estado metiéndome por ahí escribiendo mis cosas por un tiempo ahora y cada vez que nunca puedo llegar a terminar completamente porque me quedo atascado en algo.

Y luego viene la parte en la que me doy cuenta de si estoy haciendo algo bien.

Y como tal, he renunciado a escribir mi propio camino con un favorito del público: Zend.

Miré a los demás, pero parece que Zend lleva un tiempo y ellos saben lo que hacen.

MVC es también la forma en que estoy avanzando con todo lo que escribo ahora.

Cuestiones relacionadas