Je viens juste de commencer à apprendre le framework Laravel et je rencontre un problème de routage.
Le seul itinéraire qui fonctionne est l’itinéraire par défaut associé à Laravel.
J'utilise WAMP sous Windows et il utilise PHP 5.4.3, Apache 2.2.22, et mod_rewrite est également activé. J'ai également supprimé le 'index.php' du fichier de configuration application.php. une chaîne vide.
J'ai créé un nouveau contrôleur appelé User :
class User_Controller extends Base_Controller {
public $restful = true;
public function get_index()
{
return View::make('user.index');
}
}
J'ai créé un fichier view dans application/views/user/appelé index.php avec du code HTML de base, et dans routes.php, j'ai ajouté le texte suivant:
Route::get('/', function () {
return View::make('home.index');
});
Route::get('user', function () {
return View::make('user.index');
});
Le premier itinéraire fonctionne correctement lorsque je visite la racine (http://localhost/mysite/public
) de mon navigateur Web, mais lorsque j'essaie d'accéder à mon second itinéraire avec http://localhost/mysite/public/user
, l'erreur 404 Not Found est détectée. Pourquoi cela arriverait-il?
Avez-vous essayé d'ajouter ceci à votre fichier de routes à la place de Route::get('user', "user@index")
?
Le morceau de texte précédant le @
, user
dans ce cas, dirigera la page vers le contrôleur utilisateur et le morceau de texte situé après le @
, index
, dirigera le script vers la user
fonction public function get_index()
.
Je vois que vous utilisez $restful
, auquel cas vous pouvez définir votre Route
sur Route::any('user', 'user@index')
. Ceci gérera à la fois POST
et GET
, au lieu de les écrire séparément.
Sur mon installation Ubuntu LAMP, j'ai résolu ce problème avec les 2 modifications suivantes.
Sudo a2enmod rewrite
.AllowOverride All
Puis redémarrez le serveur Apache: service Apache2 restart
À l'aide de WAMP, cliquez sur l'icône wamp -> Apache-> Apache modules-> faites défiler et vérifiez rewrite_module Redémarrez un LoadModule rewrite_module.
Remarque, l'application serveur redémarre automatiquement pour vous une fois que vous avez activé "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 ne comportent pas de lettres majuscules. J'ai eu la même situation et la conversion des lettres en minuscules a aidé.
J'avais le même problème avec EasyPHP. J'ai constaté que je devais spécifierAllowOverride All
dans mon bloc <Directory>
dans httpd.conf
. Sans cela, Apache ignore parfois votre .htaccess
.
Le mien a fini par ressembler à ça ...
<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
Routes
Utilisez-les pour définir des itinéraires spécifiques qui ne sont pas gérés par les contrôleurs.
Contrôleurs
Utilisez-les lorsque vous souhaitez utiliser une architecture MVC traditionnelle
Solution à votre problème
Vous n'enregistrez pas de contrôleurs en tant que routes, sauf si vous souhaitez une route "nommée" spécifique pour une action de contrôleur.
Plutôt que de créer un itinéraire pour vos actions de contrôleurs, enregistrez simplement votre contrôleur:
Route::controller('user');
Maintenant que votre contrôleur est enregistré, vous pouvez accéder à http://localhost/mysite/public/user
et votre get_index
sera exécuté.
Vous pouvez également enregistrer tous les contrôleurs en une fois:
Route::controller(Controller::detect());
N'oubliez pas la "RewriteBase
" dans votre public/.htaccess
:
Par exemple :
Options +FollowSymLinks
RewriteEngine On
RewriteBase /your/folder/public
OK, donc après avoir passé tout mon temps à me préoccuper de 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 commencé à regarder ce qui se passait!
Ce que Laravel ESSAIE de faire ici, c’est d’insérer le fichier index.php
juste devant le chemin indiqué en tant que Route. SO par exemple, si vous avez spécifié un Route::get('/account/create', ...,
et exécuté votre application à partir de say localhost/laravel/authenticate/public/account/create
sur votre navigateur, alors Laravel souhaite exécuter localhost/authenticate/public/index.php/account/create
, mais pour ce faire .... Apache doit voir que les requêtes via /wamp/www/laravel/laravel/authentication/public
(votre chemin peut varier quelque peu, en fonction du lieu où votre application laravel est réellement installée, mais la dernière variable (public
correspond au lieu 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
très pratique, directement dans le dossier public
de votre application. Le PROBLÈME est que le code dans ce fichier '.htaccess' ne fonctionnera pas avec la façon dont WAMP est configuré par défaut. La raison pour laquelle SEEMS semble être le problème suggéré par muvera en haut de ce fil de discussion - le code rewrite_module doit être chargé par Apache avant que le contenu de RewriteRule
ne fonctionne. Zut ça a du sens.
La partie qui N'EST PAS logique: simplement stopping
et restarting
Les services Apache ne prendront pas en compte les modifications nécessaires pour que WAMP fasse le bon choix avec votre RewriteRule - Je sais, j'ai essayé plusieurs fois!
Ce qui fonctionne: effectuez les modifications suggérées par muvera (voir en haut du fil de discussion) pour charger les bons modules. Ensuite, réinitialisez toute votre session Windows, libérant ainsi complètement Apache de la mémoire. Redémarrez (rechargez) WAMP et VOILA! le correctif fonctionne, le RewriteRule correct est appliqué, yada, yada; Je vis heureux pour toujours.
La bonne nouvelle de tout cela est que j'en sais BEAUCOUP plus à propos des fichiers .htaccess
, RewriteRule
et httpd.conf
. Il existe un bon argument (performances) pour déplacer la logique du fichier public
.htaccess
de votre application et pour la placer dans une section Directory ...
de votre httpd.conf dans votre dossier BTW de dossier Apache 'bin' (surtout si vous avez accès à ce dossier).
Si vous utilisez Vagrant via Homestead, il est possible qu'une erreur soit survenue lors du montage du dossier partagé. Il semblerait que Vagrant prenne vos fichiers de ce dossier et remplace les fichiers qui se trouvent réellement sur la machine hôte au démarrage. Ainsi, en cas d’erreur, vous essayez essentiellement d’accéder à votre installation de Laravel depuis le premier C’est la raison pour laquelle vous n’obtenez que le mot "maison" - généré lors de l’installation).
Vous pouvez facilement vérifier cela en indiquant dans votre machine virtuelle et en vérifiant le fichier routes/web.php pour voir s'il s'agit bien de votre fichier. Si ce n'est pas le cas, quittez et vagrant halt
, vagrant up
et recherchez les erreurs au démarrage.
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 routes.php
Route::get('/', function()
{
return view('home.index');
});
Route::get('user', function()
{
return view('user.index');
});
Laravel 5 changements de commande pour la vue et le contrôleur voir la documentation que j'avais déjà la même erreur avant
Il suffit de courir dans votre terminal.
composer dump-autoload
Le principal problème de la route ne fonctionne pas car il y a un module mod_rewrite.so dans macos, linux n'est pas activé dans le fichier httpd.conf de la configuration Apache.
Supprimez le # de la ligne ci-dessus httpdf.conf. Alors ça va marcher. prendre plaisir!
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 à
Route::get('user', function()
{
return View::make('user.index');
});
Route::get('/', function()
{
return View::make('home.index');
});
Vous devez utiliser '/' (home/default) à la fin de vos itinéraires
Je pense que vous avez supprimé le fichier .htaccess par défaut dans le dossier public de Laravel. télécharger le fichier, cela devrait résoudre votre problème.
les commandes simples à chargement automatique des dépendances
composer dump-autoload
et toujours obtenir que vos quelques fichiers importants manquent alors allez ici pour voir la procédure entière
https://codingexpertise.blogspot.com/2018/11/laravel-new.html