Я новичок в Laravel.
Я настроил сервер Fedora 23 через Oracle VirtualBox, установил composer и создал проект Laravel 5.3 в виде html-папки (для удобства, поскольку он доступен только по IP-адресу виртуальной машины). Я также отключил его брандмауэр, так как это только для тестирования / обучения.
Я дал разрешения на доступ к папке хранения 755, и я получил страницу приветствия в браузере, просто набрав http: // «IP».
Я создал представление index.blade.php, с тем же кодом, что и welcome.blade.php, но изменив слово Laravel на «Something». Теперь приходит проблема.
Я создал контроллер HomeController.php, чтобы я мог получить маршрут php artisan: кеш без ошибок, поскольку, если я вернул представление в файле routs / web.php, он выдал ошибку:
[myuser@webserver]$ php artisan route:cache
Route cache cleared!
[LogicException]
Unable to prepare route [/] for serialization. Uses Closure.
Итак, мои файлы выглядят так:
маршруты / web.php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| This file is where you may define all of the routes that are handled
| by your application. Just tell Laravel the URIs it should respond
| to using a Closure or controller method. Build something great!
|
*/
/*
Route::get('/', function () {
return view('welcome');
});
Route::get('home', function () {
return view('index');
});
*/
Route::get('/', 'HomeController@getWelcomePage');
Route::get('home', 'HomeController@homepage');
приложение / Http / Контроллеры / HomeController.php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
class HomeController extends Controller
{
public function homepage(){
return view('index');
}
public function getWelcomePage(){
return view('welcome');
}
}
общественности / .htaccess
<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
Options -MultiViews
</IfModule>
RewriteEngine On
# Redirect Trailing Slashes If Not A Folder...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]
# Handle Front Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
# Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>
/etc/httpd/conf/httpd.conf (я удалил строки комментариев в примере здесь для целей длины)
ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin root@localhost
<Directory />
AllowOverride none
Require all denied
</Directory>
DocumentRoot "/var/www/html/public"
<Directory "/var/www">
AllowOverride none
# Allow open access:
Require all granted
</Directory>
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
<Files ".ht*">
Require all denied
</Files>
ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"</IfModule>
<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
<IfModule mime_module>
TypesConfig /etc/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset UTF-8
<IfModule mime_magic_module>
MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on
IncludeOptional conf.d/*.conf
После всего этого я могу увидеть страницу приветствия, набрав http: // «IP», но если я наберу http: // «IP» / home, я получу только пустую страницу. Браузер сообщает мне, что страница вернулась с Внутренней ошибкой сервера 500, однако в хранилище / logs / laravel.log ничего не отображается (последний журнал был ошибкой из-за маршрута php artisan: кеш не может быть выполнен из-за представления возвращается в файле web.php)
[2017-01-19 13:00:49] local.ERROR: exception 'LogicException' with message 'Unable to prepare
route [/] for serialization. Uses Closure.'
in /var/www/html/vendor/laravel/framework/src/Illuminate/Routing/Route.php:995
Самым странным для меня является то, что если я прокомментирую ВСЕ записи в файле маршрута, я получу исключение для маршрута не найдено для http: // «IP» / home, но если я просто наберу http: // «IP», я все равно получить приветственный клинок
Я считаю, что моя проблема очень проста, но после нескольких часов поиска и проб / ошибок я все еще не могу решить эту проблему.
Любая помощь / предложения приветствуются.
РЕДАКТИРОВАТЬ: Моя проблема не в ошибке закрытия, я создал методы контроллера для маршрутов. Моя проблема в том, что сервер выдает только приветственный блейд, все остальные выдают мне 500 Internal Server Error
Наконец то понял!
После прочтения комментариев https://woohuiren.me/blog/installing-laravel-5-on-fedora/, пользователь, который, очевидно, имел ту же проблему, что и я, сказал следующее:
Кажется, с помощью этой команды решите пустую страницу (код ошибки 500)
$ cd laravel_project
$ php кэш ремесленника: очистить
$ chmod -R 777 хранилище
$ composer dump-autoload
Я установил SElinux для разрешения, должно быть хорошо, верно?
Я получил страницу, показывающую без проблем.
Оказывается, вы не можете использовать любое кэширование маршрутов с Laravel 5, если у вас есть какие-либо маршруты в качестве замыканий (потому что это не будет кэшировать функцию). Закрытие, как:
Route::get('/', function() {
return view('welcome');
});
Либо прекратите кэшировать ваши маршруты, либо удалите все эти замыкания. Больше информации в этот вопрос GitHub.
Похоже на ошибку, ваш журнал не тот, который вызывает ошибку 500. Если вы удалите этот журнал и попытаетесь перейти к этому маршруту, вы не увидите никаких ошибок. В последний раз, когда я сталкивался с этим, мои каталоги хранилища не были созданы и / или права доступа к ним не были правильными. Убедитесь, что ваш каталог хранения доступен для записи веб-сервером (я обычно устанавливаю значение 775) и все каталоги существуют. Создайте их, если они этого не делают:
storage/
|
|-- app/
| |-- public/
|
|-- framework/
| |-- cache/
| |-- sessions/
| |-- views/
|
|-- logs/