Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Yii
Code

Construyendo Tu Startup: Administrando Múltiples Dominios

by
Difficulty:IntermediateLength:MediumLanguages:
This post is part of a series called Building Your Startup With PHP.
Building Your Startup: Error Logging
Building Your Startup: Designing a RESTful API

Spanish (Español) translation by Rafael Chavarría (you can also view the original English article)

Final product image
What You'll Be Creating

Este tutorial es parte de la serie Construyendo Tu Startup Con PHP en Envato Tuts+. En esta serie, te estoy guiando a través de lanzar una strartup desde concepto a realidad usando mi app Planificador de Reuniones como un ejemplo de la vida real. Cada paso a lo largo del camino, liberaré el código de Planificador de Reuniones como ejemplos de código abierto de los que puedes aprender. También abordaré temas relacionados con startups de negocios según surjan.

Lanzando Un Segundo Dominio Web

Expandir el conocimiento y uso de Planificador de Reuniones es mi más grande reto ahora mismo. Sin mucha entrada, es difícil mejorar el producto, y sin un rápido crecimiento, es difícil atraer inversionistas.

Tuve preocupaciones de que la marca Planificador de Reuniones pudiera llevar a que la gente no entendiera la utilidad social de la app, tal como planear reuniones amistosas, citas y fiestas.

Obviamente, el elegir nombres está limitado por disponibilidad de dominio y/o el presupuesto que tienes que invertir en comprar alternativas. Planificador de Reuniones pareció lo mejor en ese entonces.

Recientemente, noté que SimplePlanner.io estaba disponible, así que lo que registré y comencé a integrar el dominio junto con el servicio existente de Planificador de Reuniones.

Hay un par de aproximaciones diferentes para agregar dominios a una aplicación basada en Yii2. En el tutorial de hot, cubriré la más simple, administrar dominios en la misma base de código.

Si no has probado Planificador de Reuniones aún, ve y programa tu primera reunión en Simple Planner. Participo en la sección de comentarios de abajo, ¡así que déjame saber qué piensas! También puedes contactarme en Twitter @reifman. Estoy especialmente interesado si quieres sugerir nuevas características o temas para futuros tutoriales.

Como recordatorio, todo el código para Planificador de Reuniones y Simple Planner está escrito en el framework Yii2 para PHP. Si quisieras aprender más sobre Yii2, revisa nuestra serie paralela Programando Con Yii2.

Antes de que comience, me gustaría tocar un aspecto del reto de construir una startup.

Un Vistazo a la Vida Startup

He estado trabajando es este episodio a lo largo del fin de semana, una "ventaja" de #StartupLife. Quería compartir un par de cosas divertidas sobre esto.

Primero, #StartupLife frecuentemente significa no tener el tiempo para terminar de armar Muebles de IKEA, solo el cajón más grande.

Building Your Startup Multiple Domains - Photo of my IKEA dresser with one drawer built and others not built

Segundo, también significa trabajar en cafeterías y lugares divertidos... Five Point Roasters en Portland, Oregon resulta tener una máquina de burbujas cercana (o la gente sopla burbujas ahí):

Ahora, de vuelta al tema del tutorial de hoy...

Implementando Múltiples Dominios en Yii

La plantilla avanzada Yii2 te permite administrar un número de sitios en un árbol de código. Usé este árbol front-end para construir Planificador de Reuniones y su árbol back-end para construir un paquete administrativo de herramientas para el servicio. Hoy, sin embargo, me concentraré en lanzar otro dominio encima del árbol front-end existente---y todas las complejidades grandes y pequeñas que van junto con esto.

En un episodio futuro, cubriré construir sitios en un tercer o cuarto árbol, por ejemplo, una API REST o una startup relacionada a Planificador de Reuniones (sí, hay una idea emocionante en puerta).

Supuse que sería bastante simple (valga la redundancia) lanzar Simple Planner, pero terminó tomando unos cuántos días de trabajo.

El trabajo simple fue básicamente configuración de servidor y algún manejo de código con el árbol Yii. Sin embargo, ya que Planificador de Reuniones es un servicio que usa intensivamente email (invitaciones de reunión, confirmaciones, anuncios, actualizaciones, etc.), fue importante enviar estos emails con el dominio con el cuál fueron creadas las reuniones, ya sea SimplePlanner.io o MeetingPlanner.io.

También quise que hubiera alguna diferenciación visual entre los dos sitios.

Comencemos, y revelaré gradualmente algunas de las complejidades que encontré.

Configuración Basada en la Dirección de Dominio

Cuando la gente llega a nuestro sitio mediante peticiones de navegador, necesitamos una manera central en Yii para instruir a todo el código excluido qué servicio debería ser mostrado: ¿Planificador de Reuniones o Simple Planner?

En /frontend/config/main.php, hay una configuración bootstrap nombrada de manera desafortunada (porque se empalma con Bootstrap) que ejecutará código al inicio de la invocación del framework:

En adición a llamar al registro de arriba, creé un componente para que sea llamado nombrado SiteHelper:

Así que SiteHelper tiene todo el código para personalizar el servicio basado en el sitio que esté ejecutando. Por ejemplo:

Esas funciones cambian variables, URLs y cadenas basadas en el servicio requerido. Estas son llamadas por la función SiteHelper::init():

Las funciones de arriba también anulan ajustes cuando se llaman de sitios de desarrollo localhost:8888.

Planificador de Reuniones es SITE_MP, Simple Planner es SITE_SP, y SITE_FD es mi secreto (por ahora).

Apariencia Única de Página de Inicio

Por ahora, decidí variar rápidamente la apariencia de Simple Planner (SP) y Planificador de Reuniones (MP) usando las dos barras de navegación por defecto de Bootstrap 3.0.

Notarás arriba que MP usa Yii::$app->params['site']['navbar'] = 'navbar-default'; y SP usa 'navbar-inverse';.

En /frontend/views/layouts/home.php y main.php, están aplicados de esta manera:

Esto crea los dos esquemas de color diferentes de barra de navegación:

Building Your Startup Multiple Domains - Side by side looks at Simple Planner vs Meeting Planner home page

¿Pero qué sobre las imágenes de portada? Licencié dos alegres imágenes sociales para SP y dos imágenes profesionales más seras para MP.

Las imágenes son rotadas de manera aleatoria dependiendo del servicio activo, con nombres de archivo de imagen terminando numéricamente como 0, 1, 2, o 3, ej. /img/home/home-#.jpg.

Aquí está el código de diseño de home.php que aplica esto a la imagen elegida:

Si refrescas las páginas de inicio para SimplePlanner.io o MeetingPlanner.io, verás oscilar las imágenes.

Actualizando Texto, Imágenes y Enlaces

Las variables desde SiteHelper arriba ayudan a personalizar etiquetas textuales a lo largo del sitio. Y en el futuro, puedo hacer esto más extensivo:

Mientras que MP llama a las cosas Reuniones, podría cambiar SP globalmente para usar la frase más social Encuentros:

Configurando Servicios

Planificador de Reuniones usa muchos servicios diferentes para entregar programación. Iniciar estos tomó la mayoría del tiempo.

Analíticas y Consola de Búsqueda de Google

Google hace un poco difícil usar múltiples dominios con Analíticas, así que los dividí en diferentes cuentas. El SiteHelper configura el código GA:

Después, estos son establecidos en las vistas de diseño Home.php y Main.php:

También hay un ajuste de dominio para la Consola de Búsqueda de Google que configuré en mi registrar (mostrado más abajo):

Building Your Startup Multiple Domains - Google Search Console Verification TXT Record

Inicio de Sesión OAuth

Y, ya que agregué inicio de sesión social vía OAuth para Facebook, Google, y LinkedIn, tuve que decirle a todos estos servicios sobre el dominio SimplePlanner.io. Google y LinkedIn son los más confusos porque toda y cada una variación de argumento de consulta debe ser registrada con esos genios:

Aquí está Google:

Building Your Startup Multiple Domains - Google Developer Credential URLs

Aquí está el simple LinkedIn:

Building Your Startup Multiple Domains - LinkedIn OAuth Configuration URLs

Pero Facebook es el más simple y menos exigente (solo mantén las fotos amamantando al mínimo):

Building Your Startup Multiple Domains - Facebook Developers Configuration URL

Mailgun Email

Ya que uso Mailgun para entregar emails, creé una cuenta de dominio para Simple Planner con ellos:

Building Your Startup Multiple Domains - Domain Configuration Requirements from Mailgun

Esto requirió cambios cuidadosos en mi registrar de dominio:

Building Your Startup Multiple Domains - Domain Registrar DNS Settings for Mailgun

SSL

Uso Let's Encrypt para el https (SSL) con Planificador de Reuniones y su servicio de back-end administrativo. Establecer estos fue muy fácil para mí. Pero agregar SimplePlanner.io no funcionó, y por último tuve que crear archivos de configuración Apache (.conf) por separado para SP y personalizar los archivos yo mismo.

Aquí está el archivo http sp.conf que redirige a https:

Los redireccionamientos no estaban funcionando con dos nombres de servidor y dos aliases de servidor. Aquí está el archivo sp-ssl,conf:

Aquí está como creé al final los certificados SSL con Let's Encrypt:

Let's Encrypt es genial, pero aún son jóvenes, y mientras sus scripts continúen robustenciendose, aún hay problemas ocasionalmente como este.

Diferenciación de Email de Fondo

El reto más grande para mi en lanzar Simple Planner fue procesar emails de fondo para que pudieran venir del servicio apropiado, ej. MP o SP, y y todos sus enlaces también.

Ya que mantuve la base de datos unificada para SP y MP, también dejé que se hiciera el procesamiento de fondo en el dominio de MP. Así que tuve que extender la base de datos para que la tabla de Usuario y Reunión guardaran una columna site_id para indicar cuál servicio creó cada entrada.

Aquí está la migración de base de datos Yii:

Usé el método beforeSave() en el modelo Reunión para siempre configurar un site_id basado en el servicio actual---podrías recordar que creé este método para siempre generar un identificador seguro único para cada reunión:

Creé uno similar para el modelo Usuario:

A lo largo del servicio uso el método MiscHelpers::buildCommand() para construir enlaces seguros que no requieren que los usuarios inicien sesión cada vez que responden a un email.

Pensé que sería fácil personalizar este comando en un lugar para enlazar al dominio de sitio apropiado. Sin embargo, eso requeriría que este método frecuentemente usado consultara la tabla de Reunión para el site_id repetidamente. Por ejemplo, el buildCommand() es llamado un número de veces para cada participante para cada reunión.

Por cuestiones de rendimiento, decidí cambiar todas las llamadas a esta función para incluir el site_id. Por ejemplo, todas estas llamadas tuvieron que se enmendadas como se muestra abajo:

l modelo Reunión siempre cargó antes de estas llamadas, así que acceder al site_id es más rápido desde aquí.

¿Qué Sigue?

Building Your Startup Multiple Domains - SimplePlannerio Home Page with Social Image

Mientras que todas las configuraciones y pequeños cambios de variable de este sitio se volvieron un poco molestos para construir después de un tiempo, muestra algunas características muy interesantes del Framework Yii. Si no lo has hecho aún, por favor prueba programar en el nuevo sitio, Simple Planner.

Comparte Planificador de Reuniones con tus socios de negocios y Simple Planner con tus amigos y familiares.

¿Tienes tus propias pensamiento? ¿Ideas? ¿Retroalimentación? Siempre puedes contactarme en Twitter @reifman directamente. Espera los siguientes tutoriales aquí en la serie Construyendo Tu Startup Con PHP.

También me estoy acercando a lanzar el experimento con WeFunder basado en la implementación de las nuevas reglas de crowdfunding de SEC. Puedes seguir nuestro perfil ahí si quieres. También escribiré más sobre esto en un tutorial futuro.

Enlaces Relacionados

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.