2014-04-28 15 views
6

Zaczynam swój pierwszy projekt od yo + grunt + angular.js.
Mam usługę, która musi odczytać niektóre dane z mojego serwera; Zbudowałem go za pomocą usługi kątowej $ http. Zbudowałem również usługę WWW RESTful (zaimplementowaną w PHP, ale może to być Java, C, Perl, ..., to nie ma znaczenia), która udostępnia interfejs API w celu pobrania danych.
Serwer, z którego służy mój serwer ng-app, jest obecnie (i prawdopodobnie zawsze będzie) taki sam, z którego jest uruchamiana usługa sieciowa PHP (przez Apache).Grunt serve + PHP?

Zastanawiam się, czy jest to akceptowalna architektura ... kończę na dwóch różnych serwerach (pomruk i apache) na tym samym serwerze ... Więcej, zawsze muszę dodać "Access-Control-Allow-Origin" : 127.0.0.1" do wyjścia z moich usług PHP ... :-(

Czy to możliwe, aby służyć PHP z grunt, na przykład

UPDATE: mówię o fazie rozwoju ... Oczywiście przy produkcji nie chciałbym używać ...
Aby lepiej wyjaśnić, chciałbym użyć względnych adresów URL w $ http() ... Z tym samym kodem zarówno na etapie rozwoju, jak i produkcji Etapy etapów ...
Jeśli podczas produkcji mogę oczekiwać, że to zadziała, ponieważ będę miał tylko jeden serwer dla wdrożonej Angular app i usługi PHP, która ma interpretować PHP w rozwoju, gdy aplikacja Angular jest obsługiwana przez Grunt? Cholera? Jeśli tak, w jaki sposób?

UDPATE 2, i ewentualnego ROZWIĄZANIE: Po przemyśleniu trochę w tej kwestii (a także czytanie this artykuł), a nie otrzymania satysfakcjonujących odpowiedzi tutaj, postanowiłem będę używał tego podejścia:

  • Rozwój
    • Użyj serwera "podobnego do produkcji" (Apache, lighttpd, ...), aby wyświetlać prawdziwe strony PHP.
      Użyj bezwzględnych adresów URL z $ http lub $ request, aby uzyskać dostęp do tego serwera (różni się od Grunt, który obsługuje strony angular.js). Adresy URL będą łatwo konfigurowalne, wymagając jedynie minimalnej ilości pracy (i możliwych błędów), aby przejść do produkcji.
    • W skryptach PHP, przed wygenerowaniem (JSON) wyjścia, zawsze wyprowadź odpowiedni nagłówek "Access-Control-Allow-Origin"; wartość dyrektywy będzie również łatwo konfigurowalna.

  • Wytwarzanie
    • rozmieszczanie angularjs aplikacji w tym samym serwerze, na którym PHP rozłożonym.
    • Zmień adresy URL i uczyń je względnymi, ponieważ teraz mają one to samo źródło ze skryptami po stronie klienta.
    • Zmień nagłówek "Access-Control-Allow-Origin", aby zezwalać tylko na lokalne żądania (lub w ogóle usunąć nagłówek ...).

Byłbym bardzo zadowolony, jeśli ktoś chciałby, aby skomentować to rozwiązanie, aby go zakwestionować lub zaproponować lepsze te ...

+0

Tak u może służyć PHP z pomrukiem ale twój lepiej wyłączyć za pomocą Apache zamiast wbudowanego serwera livereload/zegarka. Nadal możesz uruchomić serwer pomruczeń, aby automatycznie odświeżyć stronę podczas zapisywania. Pozwoli to zaoszczędzić czas wdrożenia i pozwoli na użycie modrewrite i takie. – shaunhusain

+1

Nie używałbym czegoś, co służy przede wszystkim do ułatwienia rozwoju, aby służyło do produkcji aplikacji. –

+0

Mówię o etapie rozwoju ... Oczywiście przy produkcji nie użyłbym ... Ale zastanawiam się, czy - na przykład - w $ http() mogę użyć względnego adresu URL ... Hope I wyjaśniłem sobie ... – MarcoS

Odpowiedz

0

nieotrzymania zadowalającej odpowiedzi, po przemyśleniu trochę o problemie ja, zapewniają dalej moje wnioski:

  • Rozwoju
    • Użyj serwera „produkcja-like” (Apache , lighttpd, ...) do obsługi prawdziwych stron PHP.
      Użyj bezwzględnych adresów URL z $ http lub $ request, aby uzyskać dostęp do tego serwera (różni się od Grunt, który obsługuje strony angular.js). Adresy URL będą łatwo konfigurowalne, wymagając jedynie minimalnej ilości pracy (i możliwych błędów), aby przejść do produkcji.
    • W skryptach PHP, przed wygenerowaniem (JSON) wyjścia, zawsze wyprowadź odpowiedni nagłówek "Access-Control-Allow-Origin"; wartość dyrektywy będzie również łatwo konfigurowalna.

  • Wytwarzanie
    • rozmieszczanie angularjs aplikacji w tym samym serwerze, na którym PHP rozłożonym.
    • Zmień adresy URL i uczyń je względnymi, ponieważ teraz mają one to samo źródło ze skryptami po stronie klienta.
    • Zmień nagłówek "Access-Control-Allow-Origin", aby zezwalać tylko na lokalne żądania (lub w ogóle usunąć nagłówek ...).
+0

Hej, dzięki za udostępnienie. Mam ten sam problem. Czy to rozwiązanie działa, gdy wysyłasz żądanie z nagłówkiem "Content-Type: application/json"? –

+0

Tak, oczywiście ... Jedyną rzeczą, o której powinieneś pamiętać jest to, że * publikujesz * dane JSON, musisz mieć pewność, że twój nagłówek zawiera "Content-Type": "application/x-www-form-urlencoded" .. – MarcoS

1

Nasze rozwiązanie problemu polegało na utworzeniu płaskich plików z przykładowymi danymi w folderze aplikacji i wykorzystaniu względnych adresów URL za pomocą $ resource i $ http, a następnie wdrożenie naszego kodu jako aplikacji na tym samym poziomie podkatalogów .../fx/api/fundusz na przykład.

Dzięki temu pomruk może obsłużyć coś statycznego, aby zobaczyć, jak będzie wyglądał projekt aplikacji Angular, zapewniając jednocześnie pełne doświadczenie. Następnie mamy serwer deweloperski, który jest aktualizowany po zatwierdzeniu kodu (przy użyciu Jenkinsa), że możemy sprawdzić rzeczywistą funkcjonalność i uruchomić nasz pakiet testowy.

Podejście to jest trochę niezgrabne, ale pozwala nam uzyskać korzyści z podejścia gruntowego i nadal mieć serwer testujący. Mamy również nasze kompilacje używające wersji minified, dzięki czemu możemy przetestować, że powiększenie nie złamie aplikacji.

Jedyny problem z tym podejściem polega na tym, że wbudowany serwer WWW z pomrukiem nie może obsłużyć postów, więc jakiekolwiek wywołanie postu nie powiedzie się.

+0

Rozumiem ... To rozwiązanie nie w pełni zaspokaja moje potrzeby, lepiej byłoby mieć zinterpretowaną i wykonaną prawdziwą stronę php (aby przetestować również kod php ... :-) – MarcoS

+0

Wykonujemy te testy na nasz serwer dev z konfiguracją pasującą do produkcji. –

+0

Rozumiem, że jest to możliwe rozwiązanie, ale chciałbym czegoś bardziej "wytrzymałego" ... Mam na myśli, że zgodność między wyjściem php a plikami płaskimi jest bardzo słabym punktem, punktem awarii ... – MarcoS

1

Wygląda na to staramy się robić to samo, co ja. (rozwiązanie tylko dla lokalnego rozwoju)

Używam yo kątowego, aby rozpocząć projekt kątowy, ale chcę połączyć się z usługą php, aby dostarczyć trochę treści.

Użyłem grunt-connect-proxy do przekazania mojej prośby o dodanie do apache. Działa to dobrze, z wyjątkiem faktu, że $ _POST pozostaje puste podczas wysyłania danych formularza, np. $http.post('/api',{"foo":"bar"}). Napisałem o tym problem, ale nadal pozostaje on nierozwiązany i nie mogę wymyślić, jak wykonać tę pracę. W każdym razie, drugim rozwiązaniem jest zachowanie wszystkiego w tym samym folderze/domenie.

To była moja historia

Właściwie historia miała ogon. Wreszcie zorientowali się, co było przyczyną problemu, see this post

+0

Dzięki, zawsze miło jest widzieć, że ktoś inny napotyka na te same problemy ... :-) Sam też próbowałem "grunt-connect-proxy", IIRC, ale przeczytałem o numerze $ _POST, więc wpadłem to też ... Objąłem twoje drugie rozwiązanie. Jak rozwiązałeś CORS? Generuję wyjściowe 'Access-Control-Allow-Origin: http: // mygruntserverdomainandport' na każdej stronie php, podczas fazy rozwoju ... Chociaż, czuję, że to jest sub-optymalne (bardzo sub :-) rozwiązanie ... :-( – MarcoS

+0

Uaktualniłem swoją odpowiedź Nie miałem problemu z cors! – Richard

+0

Dzięki za podzielenie się swoim rozwiązaniem, ale czy masz na myśli, że nie masz problemów z CORS, gdy "przechowujesz wszystko w tym samym folderze/domenie"? używasz do serwowania kanciastego, czy tego samego apache? W pierwszym przypadku powinno być bardzo dziwne, ponieważ są to różne serwery, a więc różne domeny ... – MarcoS