Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF] Baseurl
Forum PHP.pl > Forum > PHP > Frameworki
kasztan165
Witam,

Chciałem się dowiedzieć jak ustawić w tworzonej aplikacji na ZF baseurla. W tej chwili mój baseurl jest taki:
Cytat
/zf-test

a chciałbym aby był to pełny adres, czyli:
Cytat

Czy jest możliwość ustawienia tego za pomocą helpera, czy innym rozwiązaniem jest utworzenie stałej??

Pozdrawiam.
singles
Kawałek kodu z Zend_View_Helper_BaseUrl:
  1. public function setBaseUrl($base)
  2. {
  3. $this->_baseUrl = rtrim($base, '/\\');
  4. return $this;
  5. }
  6.  
  7. /**
  8.   * Get BaseUrl
  9.   *
  10.   * @return string
  11.   */
  12. public function getBaseUrl()
  13. {
  14. if ($this->_baseUrl === null) {
  15. /** @see Zend_Controller_Front */
  16. require_once 'Zend/Controller/Front.php';
  17. $baseUrl = Zend_Controller_Front::getInstance()->getBaseUrl();
  18.  
  19. // Remove scriptname, eg. index.php from baseUrl
  20. $baseUrl = $this->_removeScriptName($baseUrl);
  21.  
  22. $this->setBaseUrl($baseUrl);
  23. }
  24.  
  25. return $this->_baseUrl;
  26. }


Pierwsza metoda wskazuje na to, że można to ustawić dla helpera. Kod drugiej metody wskazuje na to, że domyślnie baseUrl pobierany jest z instancji FrontControllera. Jak podejrzysz kod, to zobaczysz że można go [baseUrl] też tam ustawić.

PS. Pozwolę sobie zapytać - dlaczego chcesz chcesz, aby baseUrl zwracał Ci localhost? Jak przeniesiesz aplikację na innego hosta, to będziesz musiał zmieniać baseUrl (czy tam w bootstrapie czy w konfiguracji).

kasztan165
Problem jest taki, że czy to jest dobre rozwiązanie czy nie w tej aplikacji wymagany jest pełny adres. Gdy próbuję ustawić baseurla w bootstrapie w poniższy sposób nie uruchamiają się poszczególne podstrony.

  1. protected function _initRoutesAndControllers() {
  2. $frontController = Zend_Controller_Front::getInstance();
  3. $frontController->setBaseUrl('http://localhost/zf-test');
  4. }

Co robię źle?
singles
Obadałem problem. Robisz dobrze, ale u mnie jak zrobię tak samo jak Ty to Zend szaleje (przez nazwę hosta na początku), ACL się wysypuje, bo Request źle zwraca nazwę kontrolera i akcji itd.

Sposób jaki wymyśliłem, aby to obejść - napisałem własny router (kto wie, może mi się kiedyś przyda), który pomaga Zendowi w ogarnięciu co jest czym w linku:
  1. class My_Router extends Zend_Controller_Router_Rewrite
  2. {
  3. public function route(Zend_Controller_Request_Abstract $request)
  4. {
  5. parent::route($request);
  6.  
  7. $host = (isset($_SERVER['HTTPS']) ? 'https://' : 'http://') . $_SERVER['SERVER_NAME'];
  8. $baseUrlParts = explode('/', str_replace($host, '', $request->getBaseUrl()));
  9. $pathParts = explode('/', $_SERVER['REQUEST_URI']);
  10.  
  11. $controllerAndAction = array_merge(array_diff($pathParts, $baseUrlParts));
  12.  
  13. if (!isset($controllerAndAction[0])) {
  14. $controllerAndAction[0] = $this->getRoute('default')->getDefault('controller');
  15. }
  16. if (!isset($controllerAndAction[1])) {
  17. $controllerAndAction[1] = $this->getRoute('default')->getDefault('action');
  18. }
  19. $request->setControllerName($controllerAndAction[0]);
  20. $request->setActionName($controllerAndAction[1]);
  21. }
  22. }


A w Bootstrapie mam coś takiego:
  1. protected function _initBaseUrlAndRoutes()
  2. {
  3. /**
  4.   * @var Zend_Controller_Front
  5.   */
  6. $front = $this->bootstrap('frontcontroller')->getResource('frontcontroller');
  7. $front->setBaseUrl('http://localhost/projekt/public/'); //albo "mojhost/zf/"
  8. $front->setRouter(new My_Router());
  9. }


U mnie działa - helper baseUrl zwraca pełną ścieżkę, a i na ACLu się nie wysypuje.

Teoretycznie powinno się dać zrobić to także za pomocą mod_rewrite - ustawić RewriteBase, ale nie znam się na tyle na mod_rewrite, żeby się wypowiadać.
Pilsener
Nie trzeba nawet robić rewrite'a, wystarczy założyć domenę na localhoście i ZF przestanie się burzyć.
singles
Cytat(Pilsener @ 26.01.2011, 10:23:05 ) *
Nie trzeba nawet robić rewrite'a, wystarczy założyć domenę na localhoście i ZF przestanie się burzyć.

Szczerze mówiąc, nie bardzo rozumiem co masz na myśli pisząc "domenę na localhoście" - chyba masz na myśli vhosta.

A jeśli masz na myśli vhosta, to właśnie sprawdziłem (http://mojvhost/projekty/zf), i po mojej stronie to też nie rozwiązuje problemu.

Jeśli nie masz na myśli vhosta, to z chęcią dowiem się, jak rozwiązać ten problem inaczej, bo szczerze mówiąc moje rozwiązanie też do końca mi się nie podoba.
kasztan165
Więc jednak chyba najprostszym rozwiązaniem będzie ustalenie stałej w bootstrapie.
melkorm
a dlaczego pakujesz domenę do baseUrl'a? Baseurl jest wykorzystywany do mapowania Twojej aplikacji w podfolderach, czyli:

Kod
; przykłądowe Wartości w pliku application.ini dla określonych pathów do strony
; ja trzymam index.php w public, nie wiem jak Ty
; http://localhost/cokolwiek/public/
resources.frontController.baseUrl = "/cokolwiek/public/"
; http://doemna.pl/
resources.frontController.baseUrl = ""
; itp


a sam używam takiego czegoś (w bootstrapie):
  1. protected function _initBaseurl()
  2. {
  3. $baseurl = trim(dirname($_SERVER['SCRIPT_NAME']),'/');
  4. $this->bootstrap('FrontController');
  5. $r = $this->getResource('FrontController');
  6. if( $baseurl )
  7. {
  8. $r->setBaseUrl( '/' . $baseurl . '/' );
  9. }
  10. else
  11. {
  12. $r->setBaseUrl('');
  13. }
  14. }


Chociaż jakoś liczyć na 100% na to nie można, najlepiej ustawiać w Bootstrapie, ale w 99% działa :]
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.