Właściwe podejście do budowy SAAS w Laravel 4

Ok, więc około rok temu napisałem aplikację internetową, która pomaga organizować spotkania dla moich ojców firmy. Teraz "nie mógłby robić interesów bez niego". Zdecydowałem, że chcę zbudować z niego model subskrypcji SAAS i udostępnić go publicznie.

Jest obecnie zbudowany na codeigniter i php, które nie sądzę, aby pasowały do wersji SAAS. Planuję go od nowa w laravel 4 i używać stripe jako bramki płatności.

Moim zmartwieniem jest to, jak najlepiej poradzić sobie z struktura bazy danych / aplikacji dla więcej niż jednego klienta. Obecnie służy tylko jednej firmie i jest bardzo Nie-abstrakcyjny i jest specyficzny dla potrzeb moich ojców firm. Muszę być w stanie obsłużyć różne dane w zależności od tego, co robi firma, która z nich korzysta.

Zajrzałem do multi-tenancy, ale nie jestem pewien, czy to jest odpowiednie do tego. Myślę, że podejście w stylu "gmail" byłoby lepsze. Jednej aplikacji / domeny, że po zalogowaniu użytkownik zobaczy swój spersonalizowany pulpit nawigacyjny i tylko ich dane.

Zanim utknę z kodowaniem, muszę wymyślić, jak najlepiej obsłużyć wiele "kont" w jednej bazie danych. Nie chcę tworzyć tabeli dla każdego użytkownika, ani bazy danych dla każdego użytkownika.

Moje pytanie brzmi, czy ktoś może wskazać mi właściwy kierunek, jak najlepiej obsługiwać abonament miesięczny w Laravel? To nie tyle kod, który się smagam, a to, co dokładnie musiałbym zbudować, aby poradzić sobie z ładowaniem klienta każdego miesiąc i odmawianie im dostępu, jeśli rozliczenie nie powiodło się itp.

Thanks

Author: Laurence, 2013-08-17

2 answers

Czeka cię dużo czytania i mnóstwo pracy!

Po pierwsze, na razie całkowicie zignorujmy aspekt rozliczeniowy - w końcu ta część aplikacji jest naprawdę dość trywialna. Wybierz stronę z 37signals Przerobienie (strona 93 i 94) i uruchom produkt z 30-dniowym bezpłatnym okresem próbnym, zanim zaczniesz go wdrażać (powinieneś wiedzieć, jak go wdrożyć do tego czasu).

Po drugie, dlaczego uważasz, że "gmail" nie używa multi-tenancy, struktura URI nie mówi nic o podstawowej strukturze bazy danych. Jestem całkiem pewien, że nie klonują schematu bazy danych dla każdego z ich klientów. Dlatego pewnie odpowiedziałeś na swoje pytanie-chcesz wdrożyć multi-tenancy .

Będziesz chciał wyodrębnić swoją bazę danych (i architekturę aplikacji) i szczerze mówiąc, nie ma lepszego zasobu, który pomoże Ci w tym, niż książka Taylora Otwella (twórcy Laravela) Laravel: Od Ucznia Do Rzemieślnika. Jego książka nie jest dla początkujących, a zanim skończysz ją czytać, prawdopodobnie powinieneś być w stanie odpowiedzieć sobie na to pytanie.

Nie będziesz tworzyć tabeli ani bazy danych dla każdego użytkownika, nie będziesz nawet tworzyć jednej dla każdej organizacji. Zamiast tego będziesz tworzyć abstrakcyjną strukturę bazy danych w kodzie, który wyciągnie dane użytkowników z bazy danych.

Pomyśl o sprawdzeniu uprawnienia dostępu do organizacji jako innej warstwy uwierzytelniania użytkownika. Na każde żądanie będziesz sprawdzać, czy ten użytkownik może uzyskać dostęp do konkretnej organizacji. Prawdopodobnie sprawdzisz również, czy organizacja jest nadal aktywna (czy wygasła, ponieważ nie zapłaciła?) stanie się to ponownie na każde żądanie i prawdopodobnie z filtrem wewnątrz laravel.

To naprawdę prowadzi do kolejnego bardzo ważnego czynnika rozwoju aplikacji SaaS.

Nie wiem o tobie, ale jestem paranoikiem, i nie mógłbym dobrze spać w nocy, gdybym nie był pewien, że Numer użytkownika 4506 nie mógłby zobaczyć danych organizacji, do której nie należy. Jedynym naprawdę dobrym sposobem, aby to zapewnić, są testy jednostkowe, które sugerowałbym się nauczyć, jeśli jeszcze tego nie zrobiłeś.

Najlepszym sposobem na zrobienie tego w Laravel 4 jest przeczytanie książki Jeffreya Waya Laravel Testing Decoded. Ta książka jest niezwykle zaawansowana, ale nadal łatwa do zrozumienia, jeśli masz dobra znajomość podstaw.

Wreszcie, najważniejszą rzeczą jest zaangażowanie się w społeczność - najprostszym sposobem, który sugeruję, jest bieganie na biegu jałowym # Laravel kanał IRC (freenode). Zadaj kilka pytań, może odpowiedzieć na kilka pytań, każdy na kanale jest bardzo miły i reaguje.

Na pewno czeka Cię przygoda, nie bój się zadawać pytań i popełniać błędów. Powodzenia.

 37
Author: tplaner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-18 16:06:10

Jako ogólny przegląd, chciałbym mieć tabelę klientów i tabelę subskrypcji. Wszelkie inne dane, które wymagają przechowywania, takie jak kontakty lub spotkania, można powiązać za pomocą kluczy obcych z tabelą klientów.

W laravel, można użyć ORM, aby uzyskać aktualnie zalogowanego klienta, a następnie poprzez związek, pobrać terminy i kontakty należące do nich.

Jest kilka przydatnych narzędzi dla laravel w cartalyst.com, w tym sentry i sentry-social for user auth, i integrowanie kont użytkowników z facebook/google / twitter, itp.

Stripe pozwoli Ci skonfigurować płatności cykliczne i powiadomi Cię za pomocą haków internetowych za każdym razem, gdy jest próba płatności. możesz je zalogować w tabeli płatności i powiązać z użytkownikiem/klientem. możesz tego użyć, aby śledzić, kto zapłacił i jak ostatnio.

Pamiętaj również, że możesz nie chcieć anulować konta natychmiast po nieudanej płatności.

Stripe będzie się cofał, a to być może najlepszą odpowiedzią jest spóźnienie się o dwa lub trzy dni lub otrzymanie powiadomienia o nieprawidłowej karcie, aby skontaktować się z klientem i poprosić go o aktualizację danych płatności.

Może to być również okazja, aby sprawdzić, kiedy ostatnio się zalogowali. Jeśli było to ponad miesiąc temu, możesz przypisać im darmowy miesiąc i przypomnieć im, ile Twoja aplikacja może dla nich zrobić. W ten sposób możesz sprawić, że ludzie będą nadal używać (i płacić) za coś, o czym zapomnieli zapisali się.

 3
Author: MCannon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-17 22:08:15