Właśnie zacząłem uczyć się frameworka Laravel i mam problem z routingiem.
Jedyną działającą trasą jest domyślna trasa domowa dołączona do Laravel po wyjęciu z pudełka.
Używam WAMP w systemie Windows i używam PHP 5.4.3 i Apache 2.2.22, a także mam włączoną mod_rewrite i usunąłem „index.php” z pliku konfiguracyjnego application.php, aby zostawić pusty ciąg.
Utworzyłem nowy kontroler o nazwie User :
class User_Controller extends Base_Controller {
public $restful = true;
public function get_index()
{
return View::make('user.index');
}
}
Utworzyłem plik widoku w application / views / user / o nazwie index.php z podstawowym kodem HTML, a w route.php dodałem:
Route::get('/', function () {
return View::make('home.index');
});
Route::get('user', function () {
return View::make('user.index');
});
Pierwsza trasa działa dobrze podczas odwiedzania root ( http://localhost/mysite/public
) w mojej przeglądarce internetowej, ale kiedy próbuję przejść do mojej drugiej trasy http://localhost/mysite/public/user
, pojawia się błąd 404 Not Found. Dlaczego tak się dzieje?
Odpowiedzi:
Czy zamiast tego próbowałeś dodać to do pliku tras
Route::get('user', "user@index")
?Fragment tekstu przed
@
,user
w tym przypadku, przekieruje stronę do kontrolera użytkownika, a fragment tekstu po@
,index
będzie kierować skrypt douser
funkcjipublic function get_index()
.Widzę, że używasz
$restful
, w takim przypadku możesz ustawićRoute
naRoute::any('user', 'user@index')
. Spowoduje to obsługę obuPOST
iGET
, zamiast zapisywać je oddzielnie.źródło
W mojej instalacji Ubuntu LAMP rozwiązałem ten problem z następującymi 2 zmianami.
sudo a2enmod rewrite
.AllowOverride All
Następnie zrestartuj serwer Apache:
service apache2 restart
źródło
Używając WAMP, kliknij ikonę wampa -> apache-> apache modules-> przewiń i zaznacz rewrite_module Uruchom ponownie LoadModule rewrite_module
Uwaga, aplikacja serwera automatycznie uruchamia się ponownie po włączeniu funkcji „rewrite_module”
źródło
sudo a2enmod rewrite
po tym restarciesudo service apache2 restart
Czy próbowałeś sprawdzić, czy
http://localhost/mysite/public/index.php/user
pracował? Jeśli tak, upewnij się, że wszystkie foldery w Twojej ścieżce nie zawierają wielkich liter. Miałem taką samą sytuację i zamiana liter na małe pomogła.
źródło
api/branches
zadziałało, ale Linux musiałem zmienić ten adres URL na przykład: Czy jestindex.php/api/branches
jakiś sposób, aby rozwiązać ten problem, aby mieć te same adresy URL?http://localhost/mysite/user
Miałem ten sam problem podczas korzystania z EasyPHP. Okazało się, że musiałem określić
AllowOverride All
w moim<Directory>
bloku whttpd.conf
. Bez tego Apache czasami ignoruje twój.htaccess
.Mój wyglądał tak ...
<Directory "D:/Dev"> Options FollowSymLinks Indexes #### NEXT IS THE CRUCIAL LINE #### AllowOverride All Order deny,allow Allow from 127.0.0.1 Deny from all Require all granted </Directory>
źródło
Można spróbować przenieść
root/public/.htaccess
sięroot/.htaccess
i powinno działaćźródło
Trasy
Użyj ich do zdefiniowania określonych tras, które nie są zarządzane przez kontrolery.
Kontrolery
Użyj ich, jeśli chcesz korzystać z tradycyjnej architektury MVC
Rozwiązanie Twojego problemu
Nie rejestrujesz kontrolerów jako tras, chyba że chcesz mieć określoną „nazwaną” trasę dla akcji kontrolera.
Zamiast tworzyć trasę dla akcji kontrolerów, po prostu zarejestruj swój kontroler:
Route::controller('user');
Teraz twój kontroler jest zarejestrowany, możesz przejść do
http://localhost/mysite/public/user
i twójget_index
będzie uruchomiony.Możesz także zarejestrować wszystkie kontrolery za jednym razem:
źródło
Nie zapomnij o znaku „
RewriteBase
” wpublic/.htaccess
:Na przykład :
Options +FollowSymLinks RewriteEngine On RewriteBase /your/folder/public
źródło
OK, więc po tym jak waliłem głowę w ten problem przez nieco ponad dzień ... Wstałem i zrobiłem to, co POWINIENEM zrobić wczoraj i ROZBUDOWAŁEM co się dzieje!
To, co Laravel stara się tutaj zrobić, to wstawienie pliku
index.php
bezpośrednio przed ścieżką podaną jako Route. Na przykład, jeśli podałeśRoute::get('/account/create', ...,
i uruchomisz aplikację z powiedzmylocalhost/laravel/authenticate/public/account/create
w przeglądarce, wtedy laravel chce wykonaćlocalhost/authenticate/public/index.php/account/create
, ale aby to zrobić .... Apache musi przejrzeć te żądania/wamp/www/laravel/laravel/authentication/public
(Twoja ścieżka może się nieco różnić, w zależności od tego, gdzie laravel jest faktycznie zainstalowana, ale końcowy plikpublic
musi nastąpić zamiana) musi mieć zastosowaną regułę „RewriteRule”.Na szczęście laravel dostarcza poprawną regułę przepisywania w poręcznym
.htaccess
pliku w folderze aplikacjipublic
. Problem polega na tym, że kod w tym pliku „.htaccess” nie będzie działał w sposób, w jaki WAMP jest skonfigurowany po wyjęciu z pudełka. Powodem tego SEEMS jest problem zasugerowany przez muverę na początku tego wątku - kod rewrite_module musi zostać załadowany przez Apache, zanimRewriteRule
wszystko zadziała. Heck to ma sens.Część, która NIE MA sensu: po prostu,
stopping
arestarting
usługi Apache nie przyjmą zmian niezbędnych do tego, aby WAMP działał poprawnie z regułą RewriteRule - wiem, próbowałem tego wiele razy!Co DZIAŁA: wprowadź zmiany sugerowane przez muverę (patrz początek wątku), aby załadować właściwe moduły. Następnie zresetuj całą sesję systemu Windows, całkowicie usuwając Apache z pamięci. Zrestartuj (przeładuj) WAMP i VOILA! poprawka działa, stosowana jest poprawna Reguła RewriteRule, yada, yada; Żyję długo i szczęśliwie.
Dobrą wiadomością z tym wszystkim: Znam wiele więcej na temat
.htaccess
,RewriteRule
ihttpd.conf
pliki teraz. Istnieje dobry (wydajnościowy) argument przemawiający za przeniesieniem logiki zpublic
.htaccess
pliku aplikacji i umieszczeniem jej wDirectory ...
sekcji twojego httpd.conf w folderze „bin” Apache BTW (szczególnie jeśli masz dostęp do tego folderu).źródło
Spróbuj włączyć krótkie tagi php w swoim php.ini. WAMP zwykle je wyłącza i Laravel ich potrzebuje.
źródło
Route::get('/', function() { return View::make('home.index'); }); Route::get('user', function() { return View::make('user.index'); });
zmień powyżej na
Route::get('user', function() { return View::make('user.index'); }); Route::get('/', function() { return View::make('home.index'); });
Na końcu tras musisz użyć znaku „/” (home / default)
źródło
musisz używać polecenia Laravel 5
class User_Controller extends Controller { public $restful = true; public function get_index(){ return View('user.index'); } }
oraz w route.php
Route::get('/', function() { return view('home.index'); }); Route::get('user', function() { return view('user.index'); });
Zmiany poleceń Laravel 5 dla widoku i kontrolera znajdują się w dokumentacji, w której miałem wcześniej ten sam błąd
źródło
Po prostu uruchom swój terminal.
źródło
Myślę, że usunąłeś domyślny plik .htaccess w publicznym folderze laravel. prześlij plik, który powinien rozwiązać twój problem.
źródło
proste polecenia z automatycznym ładowaniem zależności
i nadal widzę, że brakuje niektórych ważnych plików, więc przejdź tutaj, aby zobaczyć całą procedurę
https://codingexpertise.blogspot.com/2018/11/laravel-new.html
źródło
Jeśli używasz Vagrant przez Homestead, możliwe, że wystąpił błąd podczas montowania udostępnionego folderu. Wygląda na to, że Vagrant pobiera twoje pliki z tego folderu i zamienia pliki, które faktycznie znajdują się na komputerze hosta podczas rozruchu, więc jeśli wystąpił błąd, zasadniczo próbujesz uzyskać dostęp do instalacji Laravel od momentu jej pierwszego wykonania (co dlatego otrzymujesz tylko „dom” - który został wygenerowany podczas instalacji).
Możesz to łatwo sprawdzić przez ssh do swojej maszyny wirtualnej i sprawdzając plik route / web.php, aby zobaczyć, czy to faktycznie jest Twój plik. Jeśli tak nie jest, wyjść na zewnątrz i
vagrant halt
,vagrant up
i szukać błędów na starcie.źródło
index.html
.htaccess
sudo service apache2 restart
najprawdopodobniej jest to spowodowane problemami z pamięcią podręczną
źródło
Głównym problemem niedziałającej trasy jest moduł mod_rewrite.so w macosie, Linux nie jest włączony w pliku httpd.conf konfiguracji apache, więc może .htaccess do pracy. rozwiązałem ten problem, odkomentowując wiersz:
# LoadModule rewrite_module libexec/apache2/mod_rewrite.so
Usuń
#
z powyższej liniihttpdf.conf
. Wtedy zadziała.cieszyć się!
źródło