Я только начал изучать структуру Laravel, и у меня возникла проблема с маршрутизацией.
Единственный маршрут, который работает, - это домашний маршрут по умолчанию, который прилагается к Laravel из коробки.
Я использую WAMP в Windows, и он использует PHP 5.4.3 и Apache 2.2.22, а также включен mod_rewrite и удалил 'index.php' из конфигурационного файла application.php, чтобы оставить пустую строку.
Я создал новый контроллер под названием User:
class User_Controller extends Base_Controller {
public $restful = true;
public function get_index()
{
return View::make('user.index');
}
}
Я создал файл представления в приложении /views/user/called index.php с некоторым базовым кодом HTML, а в routes.php я добавил следующее:
Route::get('/', function () {
return View::make('home.index');
});
Route::get('user', function () {
return View::make('user.index');
});
Первый маршрут отлично работает при посещении корня (http://localhost/mysite/public
) в моем веб-браузере, но когда я пытаюсь перейти на свой второй маршрут с http://localhost/mysite/public/user
я получаю 404 Не найдена ошибка. Почему это происходит?
Вы пытались добавить это в свой файл маршрутов вместо Route::get('user', "user@index")
?
Кусок текста перед @
, user
в этом случае направит страницу на пользовательский контроллер, а фрагмент текста после @
, index
направит script на user
функция public function get_index()
.
Я вижу, что вы используете $restful
, и в этом случае вы можете установить Route
в Route::any('user', 'user@index')
. Это будет обрабатывать как POST
, так и GET
вместо того, чтобы записывать их оба отдельно.
В моей установке Ubuntu LAMP я решил эту проблему со следующими 2 изменениями.
sudo a2enmod rewrite
.AllowOverride All
Затем перезапустите сервер Apache: service apache2 restart
С помощью WAMP нажмите значок wamp → apache- > apache modules- > прокрутите и проверьте rewrite_module Перезапустить LoadModule rewrite_module
Обратите внимание: серверное приложение автоматически запускается для вас после включения "rewrite_module"
Вы пытались проверить,
http://localhost/mysite/public/index.php/user
работал? Если это так, убедитесь, что все папки вашего пути не имеют заглавных букв. У меня была такая же ситуация, и мне помогли конвертировать письма в нижний регистр.
Вы можете попытаться переместить root/public/.htaccess
в root/.htaccess
, и он должен работать
У меня была проблема с EasyPHP. Установлено, что я должен был указать AllowOverride All
в моем блоке <Directory>
в httpd.conf
. Без этого Apache иногда игнорирует ваш .htaccess
.
Моя закончилась тем, что выглядела так...
<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>
Маршруты
Используйте их для определения определенных маршрутов, которые не управляются контроллерами.
Контроллеры
Используйте их, если хотите использовать традиционную архитектуру MVC
Решение вашей проблемы
Вы не регистрируете контроллеры в качестве маршрутов, если не хотите использовать определенный маршрут "named" для действия контроллера.
Вместо того, чтобы создавать маршрут для действий ваших контроллеров, просто зарегистрируйте свой контроллер:
Route::controller('user');
Теперь ваш контроллер зарегистрирован, вы можете перейти к http://localhost/mysite/public/user
, и ваш get_index
будет запущен.
Вы также можете зарегистрировать все контроллеры за один раз:
Route::controller(Controller::detect());
Хорошо, поэтому, немного потрепав голову над этой проблемой чуть больше дня... Я встал и сделал то, что я ДОЛЖЕН вчера сделать, и ЗАБЫЛ, что происходит!
Что Laravel TRYING делает здесь, вставляет файл index.php
прямо перед дорожкой, указанным как Маршрут. Например, если вы указали Route::get('/account/create', ...,
и выполните свое приложение из say localhost/laravel/authenticate/public/account/create
в своем браузере, тогда laravel хочет выполнить localhost/authenticate/public/index.php/account/create
, но для этого.... Apache должен видеть эти запросы через /wamp/www/laravel/laravel/authentication/public
(ваш путь может несколько меняться, в зависимости от того, где ваше приложение laravel фактически установлено, но конечный public
- это место, где должна выполняться замена) должно быть применено "RewriteRule".
К счастью, laravel предоставляет правильное правило Rewrite в удобном .htaccess
файле прямо в папке приложения public
. ПРОБЛЕМА, код в этом файле .htaccess не будет работать с тем, как WAMP настроен из коробки. Причиной этого SEEMS является проблема, предложенная muvera в верхней части этого потока - код rewrite_module должен быть загружен Apache до того, как материал RewriteRule
будет работать. Черт возьми, это имеет смысл.
Часть, которая НЕ имеет смысла: просто stopping
и restarting
Службы Apache не подберут изменения, необходимые для WAMP, чтобы делать правильные вещи с помощью RewriteRule - я знаю, я пробовал это много раз!
Что работает: внесите изменения, предложенные muvera (см. top of thread), чтобы загрузить правильные модули. Затем, reset весь ваш сеанс Windows, таким образом, полностью удалив Apache из памяти. Перезапустите (перезагрузите) WAMP и VOILA! исправление работает, применяется правильный RewriteRule, yada, yada; Я живу долго и счастливо.
Хорошая новость из всего этого: теперь я знаю больше о файлах .htaccess
, RewriteRule
и httpd.conf
. Существует хороший (эффективный) аргумент для перемещения логики из вашего приложения public
.htaccess
файла и вставка его в раздел Directory ...
вашего httpd.conf в папке "bin" Apache BTW (особенно если у вас есть доступ к этой папке).
Не забудьте "RewriteBase
" в вашем public/.htaccess
:
Например:
Options +FollowSymLinks
RewriteEngine On
RewriteBase /your/folder/public
Поместите ваш код в верхней части файла маршрута, он будет выполнять ваш контроллер
Если вы используете Vagrant через Homestead, возможно, произошла ошибка при монтировании общей папки. Похоже, что Vagrant берет ваши файлы из этой папки и выгружает файлы, которые на самом деле находятся на хост-машине при загрузке, поэтому, если произошла ошибка, вы, по сути, пытаетесь получить доступ к вашей установке Laravel с того момента, когда вы впервые ее сделали (что Вот почему вы получаете только "дом" - это было сгенерировано во время установки).
Вы можете легко проверить это, зайдя в ваш vm и проверив файл route/web.php, чтобы увидеть, действительно ли это ваш файл. Если это не так, выйдите и выполните vagrant halt
, vagrant up
и ищите ошибки при загрузке.
простые команды с автоматической загрузкой зависимостей
composer dump-autoload
и все еще получаю, что ваши важные файлы отсутствуют, идите сюда, чтобы увидеть всю процедуру
https://codingexpertise.blogspot.com/2018/11/laravel-new.html
Я думаю, что вы удалили файл .htaccess по умолчанию в общей папке laravel. загрузите файл, он должен исправить вашу проблему.
Основная проблема, с которой работает маршрут, - это модуль mod_rewrite.so в macos, linux не включен в файле httpad.conf конфигурации apache, поэтому может работать .htaccess. я решил это, раскомментируя строку:
Удалите # из строки httpdf.conf сверху. Тогда это сработает. наслаждайтесь!
Просто запустите в своем терминале.
composer dump-autoload
вы должны использовать Laravel 5 команду
class User_Controller extends Controller {
public $restful = true;
public function get_index(){
return View('user.index');
}
}
и в routes.php
Route::get('/', function()
{
return view('home.index');
});
Route::get('user', function()
{
return view('user.index');
});
Изменения команды Laravel 5 для просмотра и контроллера см. в документации, в которой у меня была такая же ошибка перед
Route::get('/', function()
{
return View::make('home.index');
});
Route::get('user', function()
{
return View::make('user.index');
});
измените значение выше на
Route::get('user', function()
{
return View::make('user.index');
});
Route::get('/', function()
{
return View::make('home.index');
});
Вы должны использовать '/' (home/default) в конце ваших маршрутов
Попробуйте включить короткие php-теги в php.ini. WAMP их обычно отключает, и laravel нуждается в них.
.htaccess
?