Jestem świadomy kwestii jak to , gdzie ludzie mają tendencję, aby omówić ogólną koncepcję Symfony 2 wiązki.
Chodzi o to, że w konkretnej aplikacji, takiej jak na przykład aplikacja podobna do Twittera, czy wszystko naprawdę powinno znajdować się w pakiecie ogólnym, jak mówią oficjalne dokumenty ?
Powód, dla którego o to pytam, jest taki, że generalnie, gdy tworzymy aplikacje, nie chcemy zbytnio wiązać naszego kodu z jakimś szkieletem kleju z pełnym stosem.
Jeśli opracuję aplikację opartą na Symfony 2 i w pewnym momencie zdecyduję, że Symfony 2 nie jest najlepszym wyborem, aby kontynuować rozwój , czy będzie to dla mnie problem?
Ogólne pytanie brzmi: dlaczego wszystko jest w pakiecie dobrą rzeczą?
EDYCJA 1
Prawie rok odkąd zadałem to pytanie, napisałem artykuł, aby podzielić się swoją wiedzą na ten temat.
źródło
Odpowiedzi:
Napisałem dokładniejszy i zaktualizowany post na blogu na ten temat: http://elnur.pro/symfony-without-bundles/
Nie, nie wszystko musi być w pakiecie. Możesz mieć taką strukturę:
src/Vendor/Model
- dla modeli,src/Vendor/Controller
- dla kontrolerów,src/Vendor/Service
- dla usług,src/Vendor/Bundle
- dla pakietów, takich jaksrc/Vendor/Bundle/AppBundle
,W ten sposób umieściłbyś
AppBundle
tylko te rzeczy, które są naprawdę specyficzne dla Symfony2. Jeśli zdecydujesz się później przełączyć na inny framework, pozbywamy sięBundle
przestrzeni nazw i zastępujemy ją wybranymi elementami frameworka.Pamiętaj, że sugeruję tutaj kod specyficzny dla aplikacji . W przypadku pakietów wielokrotnego użytku nadal sugeruję stosowanie najlepszych praktyk .
Utrzymywanie podmiotów poza pakietami
Aby jednostki pozostały
src/Vendor/Model
poza jakimkolwiek pakietem, zmieniłemdoctrine
sekcję wconfig.yml
zdo
Nazwy podmiotów - aby uzyskać dostęp z repozytoriów Doctrine - zaczynają się
Model
na przykład w tym przypadkuModel:User
.Za pomocą przestrzeni nazw można grupować powiązane jednostki, na przykład
src/Vendor/User/Group.php
. W tym przypadku nazwa jednostki toModel:User\Group
.Trzymanie kontrolerów poza pakietami
Najpierw musisz powiedzieć JMSDiExtraBundle, aby przeskanował
src
folder w poszukiwaniu usług, dodając to doconfig.yml
:Następnie definiujesz kontrolery jako usługi i umieszczasz je w
Controller
przestrzeni nazw:Zauważ, że używam mojego ElnurAbstractControllerBundle, aby uprościć definiowanie kontrolerów jako usług.
Ostatnią rzeczą jest, aby powiedzieć Symfony, aby szukała szablonów bez pakietów. Robię to, zastępując usługę odgadywania szablonów, ale ponieważ podejście jest inne w Symfony 2.0 i 2.1, udostępniam wersje dla obu z nich.
Przesłonięcie zgadywacza szablonów Symfony 2.1+
Stworzyłem pakiet, który robi to za Ciebie.
Przesłanianie nasłuchiwania szablonu Symfony 2.0
Najpierw zdefiniuj klasę:
A następnie powiedz Symfony, aby go użył, dodając to do
config.yml
:Korzystanie z szablonów bez pakietów
Teraz możesz używać szablonów z pakietów. Przechowuj je w
app/Resources/views
folderze. Na przykład szablony tych dwóch akcji z powyższego przykładowego kontrolera znajdują się w:app/Resources/views/User/add.html.twig
app/Resources/views/User/profile.html.twig
Odnosząc się do szablonu, po prostu pomiń część pakietu:
źródło
generate:doctrine:crud
na przykład oczekuje, że jednostka (= model w przypadku elnur) będzie w pakiecie, aby działać.Oczywiście możesz oddzielić swoją aplikację. Po prostu opracuj go jako bibliotekę i zintegruj z
vendor/
folderem symfony (używającdeps
albo lubcomposer.json
, zależnie od tego, czy używasz Symfony2.0 lub Symfony2.1). Potrzebujesz jednak co najmniej jednego pakietu, który działa jak „frontend” twojej biblioteki, w którym Symfony2 znajduje kontroler (i tak dalej).źródło
symfony-2.0
założę, że używasz bieżącej wersji 2.0. W takim przypadku stwórz repozytorium git, gdziekolwiek chcesz i umieść w nim wszystko, co chcesz rozwijać niezależnie od symfony. W swoim projekcie symfony zaktualizuj swójdeps
plik, jak wspomniano tutaj symfony.com/doc/current/cookbook/workflow/... Następnie po prostu utwórz jeden (lub więcej) pakiet aplikacji (php app/console generate:bundle
) dla rzeczy specyficznych dla symfony.Zwykła dystrybucja symfony może działać bez dodatkowego pakietu (aplikacji), w zależności od tego, ile funkcjonalności chcesz użyć z frameworku pełnego stosu.
Na przykład kontrolery mogą być dowolne na żądanie, które można umieścić w dowolnym miejscu w strukturze projektu, gdy tylko zostaną automatycznie załadowane.
W pliku definicji routingu możesz użyć:
Może to być dowolny zwykły stary obiekt php, powiązany tylko z ramą przez fakt, że musi zwrócić a
Symfony\Component\HttpFoundation\Response
obiekt.Twoje szablony gałązek (lub inne) można ustawić w podobny sposób
app/Resources/views/template.html.twig
i można je renderować za pomocą::template.html.twig
logicznej nazwy.Wszystkie usługi DI można zdefiniować w app / config / config.yml (lub zaimportować z
app/config/services.yml
na przykład , a wszystkie klasy usług mogą być również zwykłymi starymi obiektami php. W ogóle nie związanymi z frameworkiem.Wszystko to jest domyślnie dostarczane przez framework pełnego stosu symfony.
Problemy będziesz miał wtedy, gdy będziesz chciał użyć plików do tłumaczenia (takich jak xliff), ponieważ są one wykrywane tylko za pomocą pakietów .
Rozkład światła symfony ma na celu rozwiązanie tego rodzaju problemów poprzez odkrycie wszystkiego, co zwykle można odkryć tylko za pomocą pakietów.
źródło
Możesz użyć KnpRadBundle , który próbuje uprościć strukturę projektu.
Innym podejściem jest użycie
src/Company/Bundle/FrontendBundle
na przykład dla pakietów isrc/Company/Stuff/Class.php
klas, które są niezależne od symfony i które mogą być ponownie użyte poza frameworkiemźródło
Bundle
idzie bezpośrednio na publiczne udostępnianie. Kiedy piszę jakąś aplikację, nie chcę udostępniać mojego kodu, z wyjątkiem tych części, które celowo zbudowałem jako moduły sterowane przez społeczność. Czy się mylę?Ponieważ minęło już 5 lat, oto kilka artykułów o pakietach Symfony.
TLDR:
TLDR:
źródło
Środowisko Symfony jest bardzo dobre do szybkiego uruchomienia testu koncepcji, a cały kod można wprowadzić w domyślnej aplikacji pakietu w src /
W tym pakiecie możesz uporządkować swój kod według swoich potrzeb.
Po tym, jeśli chcesz użyć innej technologii do opracowania swojego POC, możesz łatwo to przetłumaczyć, ponieważ nie tworzysz całego kodu w koncepcji pakietu.
Mimo całej koncepcji nie ekstremistycznie tego. Pakiet jest dobry, ale pakuj wszystko, a codzienność nie jest dobra.
Być może możesz użyć Silex (Symfony micro framework) do opracowania Proof of Concept w celu zmniejszenia wpływu pakietu innych firm.
źródło