Laravel routes ne fonctionne pas?
Je viens de commencer à apprendre le framework Laravel et j'ai un problème avec le routage.
La seule route qui fonctionne est la route d'accueil par défaut qui est attachée à Laravel hors de la boîte.
J'utilise WAMP sous Windows et il utilise PHP 5.4.3, et Apache 2.2.22, et j'ai aussi mod_rewrite activé ,et j'ai supprimé l'index.php' partir de l'application.fichier de configuration php pour laisser une chaîne vide.
J'ai créé un nouveau contrôleur appelé Utilisateur:
class User_Controller extends Base_Controller {
public $restful = true;
public function get_index()
{
return View::make('user.index');
}
}
J'ai créé un fichier de vue dans application / views / user / appelé index.php avec du code html de base, et dans les routes.php j'ai ajouté ce qui suit:
Route::get('/', function()
{
return View::make('home.index');
});
Route::get('user', function()
{
return View::make('user.index');
});
La première route à fonctionne bien lors de la visite de la racine (http://localhost/mysite/public
) dans mon navigateur web, mais quand j'essaie d'aller à mon deuxième route avec http://localhost/mysite/public/user
j'obtiens une erreur 404 not Found. Pourquoi en serait-il passe?
15 réponses
Avez-vous essayé d'ajouter ceci à votre fichier routes à la place Route::get('user', "user@index")
?
Le morceau de texte avant le @
, user
dans ce cas, dirigera la page vers le contrôleur utilisateur et le morceau de texte après le @
, index
, va diriger le script vers la fonction user
public function get_index()
.
Je vois que vous utilisez $restful
, auquel cas vous pouvez définir votre Route
sur Route::any('user', 'user@index')
. Cela va gérer à la fois POST
et GET
, au lieu de les écrire tous les deux séparément.
Sur mon installation Ubuntu LAMP, j'ai résolu ce problème avec les modifications 2 suivantes.
- activez mod_rewrite sur le serveur apache:
sudo a2enmod rewrite
. - Modifier /etc/apache2/apache2.conf , en changeant la directive "AllowOverride" pour le répertoire / var / www (qui est ma racine principale du document):
AllowOverride All
Redémarrez ensuite le serveur Apache: service apache2 restart
En utilisant WAMP, cliquez sur l'icône wamp - > apache - > modules apache - >faites défiler et vérifiez rewrite_module Le redémarrage d'un LoadModule rewrite_module
Remarque, l'application serveur redémarre automatiquement pour vous une fois que vous activez "rewrite_module"
Avez-vous essayé de vérifier si
http://localhost/mysite/public/index.php/user
Travaillait? Si c'est le cas, assurez-vous que tous les dossiers de votre chemin n'ont pas de lettres majuscules. J'ai eu la même situation et la conversion des lettres en minuscules aidé.
J'avais le même problème en utilisant EasyPHP. Trouvé que j'avais à préciser AllowOverride All
dans mon <Directory>
bloc httpd.conf
. Sans cela, Apache ignore parfois votre .htaccess
.
Le mien a fini par ressembler à ceci...
<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>
, Vous pouvez essayer de déplacer root/public/.htaccess
à root/.htaccess
et cela devrait fonctionner
Itinéraires
Utilisez-les pour définir des routes spécifiques qui ne sont pas gérées par les contrôleurs.
Les Contrôleurs de
Utilisez-les Lorsque vous souhaitez utiliser l'architecture MVC traditionnelle
La Solution à votre problème
Vous n'enregistrez pas les contrôleurs en tant que routes sauf si vous voulez une route 'nommée' spécifique pour une action de contrôleur.
Plutôt que de créer une route pour les actions de vos contrôleurs, enregistrez simplement votre contrôleur:
Route::controller('user');
Maintenant votre le contrôleur est enregistré, vous pouvez naviguer vers http://localhost/mysite/public/user
et votre get_index
sera exécuté.
Vous pouvez également enregistrer tous les contrôleurs en une seule fois:
Route::controller(Controller::detect());
N'oubliez pas le "RewriteBase
" dans votre public/.htaccess
:
Par exemple :
Options +FollowSymLinks
RewriteEngine On
RewriteBase /your/folder/public
OK, donc après avoir dénigré ma tête sur ce problème pendant un peu plus d'une journée... Je me suis levé et j'ai fait ce que j'aurais dû faire hier, et J'ai débogué ce qui se passait!
Ce que Laravel essaie de faire ici, c'est d'insérer le fichier index.php
juste en face du chemin donné en tant que Route. AINSI, par exemple, si vous avez spécifié un Route::get('/account/create', ...,
et exécuter votre application de localhost/laravel/authenticate/public/account/create
sur votre navigateur, puis laravel souhaite exécuter localhost/authenticate/public/index.php/account/create
, mais à le faire.... Apache doit voir que les requêtes via /wamp/www/laravel/laravel/authentication/public
(votre chemin peut variez quelque peu, selon l'endroit où votre application laravel est réellement installée, mais le public
final est l'endroit où la substitution doit avoir lieu) doit avoir un 'RewriteRule' appliqué.
Heureusement, laravel fournit la règle de réécriture correcte dans un fichier .htaccess
pratique dans le dossier public
de votre application. Le problème est, le code dans ce '.le fichier htaccess ne fonctionnera pas avec la façon dont WAMP est configuré hors de la boîte. La raison de cela semble être le problème suggéré par muvera en haut de ce thread - le code rewrite_module doit être chargé par Apache avant que les éléments RewriteRule
ne fonctionnent. Zut cela a du sens.
La partie qui N'a pas de sens: simplement stopping
et restarting
les services Apache ne récupéreront pas les modifications nécessaires pour que WAMP fasse la bonne chose avec votre RewriteRule - je sais, j'ai essayé cela plusieurs fois!
Qu'est-ce qui fonctionne: effectuez les modifications suggérées par muvera (voir en haut du thread) pour charger les modules corrects. Ensuite, réinitialisez toute votre session Windows, ainsi, le dumping Apache hors de la mémoire tout à fait. Redémarrez (rechargez) WAMP, et le tour est joué! le correctif fonctionne, la RewriteRule correcte est appliquée, yada, yada; je vis heureux pour toujours.
Les bonnes nouvelles de tout ça: j'en sais BEAUCOUP plus sur .htaccess
, RewriteRule
, et httpd.conf
fichiers maintenant. Il existe un bon argument (performance) pour déplacer la logique de votre application public
.htaccess
fichier, et le mettre dans une section Directory ...
de votre httpd.conf dans votre dossier Apache 'bin' BTW (surtout si vous avez accès à cela dossier).
Essayez d'activer les balises PHP courtes dans votre php.ini. WAMP les a généralement et laravel en a besoin.
Route::get('/', function()
{
return View::make('home.index');
});
Route::get('user', function()
{
return View::make('user.index');
});
Changer ci-dessus pour
Route::get('user', function()
{
return View::make('user.index');
});
Route::get('/', function()
{
return View::make('home.index');
});
Vous devez utiliser '/'(home/par défaut) à la fin de vos itinéraires
Vous devez utiliser Laravel 5 la commande
class User_Controller extends Controller {
public $restful = true;
public function get_index(){
return View('user.index');
}
}
Et dans les itinéraires.php
Route::get('/', function()
{
return view('home.index');
});
Route::get('user', function()
{
return view('user.index');
});
Laravel 5 changements de commande pour view et controller voir la documentation que j'avais la même erreur avant
Exécutez simplement dans votre terminal.
composer dump-autoload
Le principal problème de la route ne fonctionne pas est qu'il y a mod_rewrite.so module sous macos, linux non activé dans httpd.fichier conf de configuration apache, donc peut .htaccess au travail. j'ai résolu cela en décommentant la ligne:
LoadModule rewrite_module libexec/apache2/mod_rewrite.donc
Supprimer le # de la ligne ci-dessus httpdf.conf. Ensuite, cela fonctionnera. Amusez-vous bien!
Je pense que vous avez supprimé default .fichier htaccess dans le dossier public laravel. télécharger le fichier, il devrait résoudre votre problème.