Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Спасибо, но ошибку я нашел. Не знаю по какой причине но работал не правильно Exim. Закомментировав все в конфиге Exim, все стало работать.
Практически аналогичная проблема. Мне ни кто не помог. Дошло до того что пришлось купить vps. Теперь на этом vps куча других необъяснимых проблем.
https://laravel.ru/forum/viewtopic.php?id=1501
Решением этой проблемы для меня было: приобретение vps. И я понял, что это какое то ограничение хостинга. Но какое именно - загадка.
Порты открыты? На домен прикручена запись для почты?
Порты открыты с outlook проверил работу и все работает.
С передача писем с laravel не работает. как будто ничего не происходит.
Не работает передача писем по smtp. Данные почтового сервера ввел верно. Проверил с помощью потового клиента outlook.
Код метода контроллера ответственного за передачу письма:
(Данные почтовых ящиков в примерах фейковые)
public function index()
{
$data = 'hi@mail.ru';
return Mail::send('emails.feedback', ['title' => 'Титул'], function($message) use ($data)
{
$message->from('webmaster@host.ru');
$message->to($data)->subject('Welcome!');
});
}
Содержимое .env файла:
MAIL_DRIVER=smtp
MAIL_HOST=mail.host.ru
MAIL_PORT=25
MAIL_USERNAME=webmaster@host.ru
MAIL_PASSWORD=Mypass
MAIL_ENCRYPTION=null
Содиржимое config/Mail.php:
<?php
return [
'driver' => env('MAIL_DRIVER', 'smtp'),
'host' => env('MAIL_HOST', 'mail.host.ru'),
'port' => env('MAIL_PORT', 465),
'from' => ['address' => 'webmaster@host.ru', 'name' => 'webmaster@host.ru'],
'encryption' => env('MAIL_ENCRYPTION', 'tls'),
'username' => env('webmaster@host.ru'),
'password' => env('Mypass'),
'sendmail' => '/usr/sbin/sendmail -bs',
];
Ошибок в логах не выдает, на экран ошибок не выводит.
Но ни одного письма мне еще не пришло ни на один из введенных почтовых ящиков.
Прошу помощи, что это такое? P.S Перенес сайт на laravel на vps.
web мидельварю можно и не убирать, а исключить роуты которым не нужна защита
Вот в документации https://laravel.com/docs/5.2/routing#csrf-protection чуть ниже раздел "Excluding URIs From CSRF Protection"
Я знаю зачем он нужен. И все как есть на данный момент так и должно быть. И исключение web middleware из проекта это не решение проблемы и ошибки
Еще вылетает такая ошибка при попытке отправить электронное письмо на почту:
getmypid() has been disabled for security reasons
Я не совсем понял вообще причину этой ошибки.
В общем это у меня хостинг косячный или так будет везде на всех хостингах?
P.S хостинг платный.
В login.blade условие на вывод ошибок допишите . if($errors)
Теперь получаем такую ошибку:
Session store not set on request. (View: /var/www/корень/data/www/мой_домен.ru/resources/views/auth/login.blade.php)
Залезаю я значит в kernel.php и вижу следующее:
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],
А именно вот на эту строку:
\Illuminate\Session\Middleware\StartSession::class,
Обновил Laravel до версии: Laravel Framework version 5.2.29
Все осталось так же как и было.
Из следующей строки в kernel.php и имеющейся ошибке я понимаю что middleware web не могли встроить в роутер по умолчанию.:
\Illuminate\Session\Middleware\StartSession::class,
Следственно ошибка остается и можно вернуться к первоначальному роутеру.
Попробуйте убрать web middleware, начиная вроде как раз с версии 5.2.25 он автоматически подсоединяется ко всем routes. Видимо на локахосте у вас более старая версия, поэтому там все работает.
Убрал. Теперь ошибка:
Undefined variable: errors (View: /var/www/корень/data/www/мой_домен.ru/resources/views/auth/login.blade.php)
Я так понимаю вывод ошибок у меня теперь не работает, так как убрал middleware web. В связи с чем появилась новая ошибка.
Нет это не вариант решения проблемы. К тому же я ни где не видел информацию где в этой версии laravel что то меняли с middlewarwe web.
Нет, на локалке у меня именно та же версия.
Ошибка актуальная. И до сих пор я не пойму причину.
мало данных.
какая версия фреймворка? И нужно видеть роуты.
Зачем роуты? Не пойму.
На локалке работает все нормально под разными ОС. И все окей.
На хостинге такая вот лабуда.
Но тем не менее вот роуты.
<?php
/*
|--------------------------------------------------------------------------
| Routes File
|--------------------------------------------------------------------------
|
| Here is where you will register all of the routes in an application.
| It's a breeze. Simply tell Laravel the URIs it should respond to
| and give it the controller to call when that URI is requested.
|
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| This route group applies the "web" middleware group to every route
| it contains. The "web" middleware group is defined in your HTTP
| kernel and includes session state, CSRF protection, and more.
|
*/
/** Интернет магазин **/
Route::group(['middleware' => 'web'], function () {
Route::auth(); // Авторизация на сайте
Route::get('/', 'HomeController@index'); // Главна страница
Route::get('/preview/{id}', 'HomeController@preview'); // Подробный просмотр товара
Route::post('/star', 'HomeController@setStar'); // Звездный рейтинг
Route::match(array('POST'), '/preview/{id?}', ['uses' => 'HomeController@add_comment']); // Добавление комментария
Route::match(array('GET', 'POST'), '/account', ['middleware' => 'auth', 'uses' => 'UserController@index']); // Личный кабинет
Route::match(array('GET', 'POST'), '/feedback', ['uses' => 'HomeController@Feedback']); // Обратная связь
});
/** Панель администрирования **/
Route::group(['middleware' => ['web', 'auth', 'acl']], function () {
Route::get('/admin', ['uses' => 'AdminController@viewStats']); // Полный список товаров
/* Управление товарами */
Route::get('/admin/items', ['uses' => 'AdminController@viewItems']); // Полный список товаров
Route::match(array('GET', 'POST'), '/admin/new_item', ['uses' => 'AdminController@setItems']); // Рагистрация нового товара
Route::match(array('GET', 'POST'), '/admin/item/{id}', ['uses' => 'AdminController@viewItem']); // Подробный просмотр товара и модификация
Route::get('/admin/delete_item/{id}', ['uses' => 'AdminController@deleteItem']); // Удаление товара по его идентификатору
/* Управление категориями */
Route::get('/admin/categories', ['uses' => 'AdminController@viewCategories']); // Список категорий
Route::match(array('GET', 'POST'), '/admin/add_category', ['uses' => 'AdminController@setCategory']); // Регистрация новой категории
Route::match(array('GET', 'POST'), '/admin/category/{id}', ['uses' => 'AdminController@viewCategory']); // Подробный просмотр категории и модификация
/* Управление типом валют */
Route::get('/admin/currencies', ['uses' => 'AdminController@viewCurrencies']); // Список валют
Route::match(array('GET', 'POST'), '/admin/add_currency', ['uses' => 'AdminController@setCurrency']); // Регистрация новой валюты
Route::match(array('GET', 'POST'), '/admin/currency/{id}', ['uses' => 'AdminController@viewCurrency']); // Подробный просмотр категории и модификация
/* Управление комментариями */
Route::get('/admin/commentaries', ['uses' => 'AdminController@viewCommentaries']); // Список комментариев
Route::get('/admin/comment/{id}/{data_id}', 'AdminController@viewComment'); // Модерация комментария
Route::match(array('POST'), '/admin/comment/{id?}/{data_id?}', ['uses' => 'AdminController@saveComment']); // Сохранение отмодерированного комментария
});
Версия laravel: Laravel Framework version 5.2.25
Написал сайт. Нужно было протестировать его работу и проверить работу с почтой.
На хостинг залил, дизаин прогрузился. Пытаюсь авторизоваться и вылетает ошибка:
TokenMismatchException in VerifyCsrfToken.php line 67:
Пытался прописать всякое разное:
{!! csrf_field() !!}
<input type="hidden" name="_token" value="<?php echo csrf_token() ?>">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
Ничего не работает. Проблемы те же. Права на папки везде 777 временно для проверки.
Почему сайт не видит токен? Или у laravel защитная реакция против хостингов такая?
Fixlix пишет:LeXXXX35 пишет:Код роута покажи, и как твой мидл прописан в kernel?
Вот код роута.
Так работает:Route::group(['middleware' => 'web'], function () { Route::get('/admin/items', ['uses' => 'AdminController@viewItems', 'middleware' => 'acl', 'middleware' => 'auth']); // Полный список товаров Route::match(array('GET', 'POST'), '/admin/new_item', ['uses' => 'AdminController@setItems', 'middleware' => 'acl', 'middleware' => 'auth']); // Рагистрация нового товара Route::match(array('GET', 'POST'), '/admin/item/{id}', ['uses' => 'AdminController@viewItem', 'middleware' => 'acl', 'middleware' => 'auth']); // Подробный просмотр товара и модификация Route::get('/admin/categories', ['uses' => 'AdminController@viewCategories', 'middleware' => 'acl', 'middleware' => 'auth']); // Список категорий Route::get('/admin/currencies', ['uses' => 'AdminController@viewCurrencies', 'middleware' => 'acl', 'middleware' => 'auth']); // Список валют Route::match(array('GET', 'POST'), '/admin/add_category', ['uses' => 'AdminController@setCategory', 'middleware' => 'acl', 'middleware' => 'auth']); // Регистрация новой категории Route::match(array('GET', 'POST'), '/admin/add_currency', ['uses' => 'AdminController@setCurrency', 'middleware' => 'acl', 'middleware' => 'auth']); // Регистрация новой валюты });
Так не работает:
Route::group(['middleware' => 'web', 'middleware' => 'acl', 'middleware' => 'auth'], function () { Route::get('/admin/items', ['uses' => 'AdminController@viewItems']); // Полный список товаров Route::match(array('GET', 'POST'), '/admin/new_item', ['uses' => 'AdminController@setItems']); // Рагистрация нового товара Route::match(array('GET', 'POST'), '/admin/item/{id}', ['uses' => 'AdminController@viewItem']); // Подробный просмотр товара и модификация Route::get('/admin/categories', ['uses' => 'AdminController@viewCategories']); // Список категорий Route::get('/admin/currencies', ['uses' => 'AdminController@viewCurrencies'); // Список валют Route::match(array('GET', 'POST'), '/admin/add_category', ['uses' => 'AdminController@setCategory'); // Регистрация новой категории Route::match(array('GET', 'POST'), '/admin/add_currency', ['uses' => 'AdminController@setCurrency'); // Регистрация новой валюты });
Route::get('/', ['middleware' => ['first', 'second'], function () {
//
}]);
Спасибо. Как раз сам пару дней назад догадался.
Реализовал следующим образом:
Route::group(['middleware' => ['web', 'auth', 'acl']], function () {
//
}
Код роута покажи, и как твой мидл прописан в kernel?
Вот код роута.
Так работает:
Route::group(['middleware' => 'web'], function () {
Route::get('/admin/items', ['uses' => 'AdminController@viewItems', 'middleware' => 'acl', 'middleware' => 'auth']); // Полный список товаров
Route::match(array('GET', 'POST'), '/admin/new_item', ['uses' => 'AdminController@setItems', 'middleware' => 'acl', 'middleware' => 'auth']); // Рагистрация нового товара
Route::match(array('GET', 'POST'), '/admin/item/{id}', ['uses' => 'AdminController@viewItem', 'middleware' => 'acl', 'middleware' => 'auth']); // Подробный просмотр товара и модификация
Route::get('/admin/categories', ['uses' => 'AdminController@viewCategories', 'middleware' => 'acl', 'middleware' => 'auth']); // Список категорий
Route::get('/admin/currencies', ['uses' => 'AdminController@viewCurrencies', 'middleware' => 'acl', 'middleware' => 'auth']); // Список валют
Route::match(array('GET', 'POST'), '/admin/add_category', ['uses' => 'AdminController@setCategory', 'middleware' => 'acl', 'middleware' => 'auth']); // Регистрация новой категории
Route::match(array('GET', 'POST'), '/admin/add_currency', ['uses' => 'AdminController@setCurrency', 'middleware' => 'acl', 'middleware' => 'auth']); // Регистрация новой валюты
});
Так не работает:
Route::group(['middleware' => 'web', 'middleware' => 'acl', 'middleware' => 'auth'], function () {
Route::get('/admin/items', ['uses' => 'AdminController@viewItems']); // Полный список товаров
Route::match(array('GET', 'POST'), '/admin/new_item', ['uses' => 'AdminController@setItems']); // Рагистрация нового товара
Route::match(array('GET', 'POST'), '/admin/item/{id}', ['uses' => 'AdminController@viewItem']); // Подробный просмотр товара и модификация
Route::get('/admin/categories', ['uses' => 'AdminController@viewCategories']); // Список категорий
Route::get('/admin/currencies', ['uses' => 'AdminController@viewCurrencies'); // Список валют
Route::match(array('GET', 'POST'), '/admin/add_category', ['uses' => 'AdminController@setCategory'); // Регистрация новой категории
Route::match(array('GET', 'POST'), '/admin/add_currency', ['uses' => 'AdminController@setCurrency'); // Регистрация новой валюты
});
Код роута покажи, и как твой мидл прописан в kernel?
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'acl' => \App\Http\Middleware\AccessControlList::class,
];
Вот собственно та строчка:
'acl' => \App\Http\Middleware\AccessControlList::class,
Может Ваш middleware срабатывает раньше, чем middleware сессий?
Так в том то и дело что нет.
Разве что он вызывается в Route::group.
Интересно что если вызывать его в каждом маршруте отдельно то все работает. Но если дать группе, то он выдаёт такую лабуду как я описал выше.
Хотелось бы выделить его группе, а не дублировать и прописывать на каждый маршрут.
Как то глупо что на группу не работает.
duster пишет:}%Вообще должно работать, но можно сделать и явным образом:
%%(php)
protected $auth;public function __construct(Guard $auth)
{
$this->auth = $auth;
}public function handle()
{
if ($this->auth->check() && $this->auth->user()->stat == 1) {}
}
%%Аналогично. Не работает.
var_dump($this->auth->user()) Показывает null.
var_dump($this->auth->user()->stat) показывает:Trying to get property of non-object
Если выполнять проверку var_dump'ом, в контроллере все работает нормально, но в middleware отказывается напрочь.
}%Вообще должно работать, но можно сделать и явным образом:
%%(php)
protected $auth;public function __construct(Guard $auth)
{
$this->auth = $auth;
}public function handle()
{
if ($this->auth->check() && $this->auth->user()->stat == 1) {}
}
%%
Аналогично. Не работает.
var_dump($this->auth->user()) Показывает null.
var_dump($this->auth->user()->stat) показывает:
Trying to get property of non-object
Всем привет.
Столкнулся с проблемой. Пытаюсь с помощью Middleware сделать разграничение доступа.
public function handle($request, Closure $next)
{
//todo написать ACL. По какой то причине не работает Auth::user()
if(Auth::user()->stat == 1) {
return $next($request);
} else {
return redirect('/');
}
}
Я так понимаю не работает Auth::user().
Через var_dump он вообще NULL возвращает. Вопрос. Почему, когда я авторизован и все должно работать.
Ошибка:
Trying to get property of non-object
Оно и логично, если Auth::user() = Null, то ->stat не существует вообще.
stat это поле в таблице БД.
Подскажите, что я делаю не так и почему Auth::user() не существует, когда должен. И как реализовать мою задумку?
Решил перенести сайт на другой ПК и поймал такую ошибку.
Fatal error: Class 'PHPExcel_Shared_Font' not found
Вопрос, что это? И от куда это, если на прошлой машине все работает без проблем и ничего не менялось?
composer update и php artisan показывают аналогичную ошибку
Fixlix пишет:Мне нужен for а не foreach.
И ваш пример с for идентичен тому что я написал выше.
Соответственно это не работает и ошибки я указал.
По прежнему нуждаюсь в помощи.Не идентичен - у Вас там странная кавычка была какая-то.
А потом у Вас ошибка изменилась и она Вам все объясняет:
htmlentities() expects parameter 1 to be string, object given (View: /var/www/shop.com/resources/views/home.blade.php)$dats[$i] - это объект, а не строка, поэтому нельзя просто так взять и "вывести" в шаблоне его
Если Вам надо вывести конкретный property объекта - укажите его {{ $dats[$i]->name }}
Можете конвертировать объект в строку любым из доступных способов, к примеру в JSON: {{ json_encode($dats[$i]) }}Но нельзя просто "напечатать" объект
Это то что я хотел. Спасибо!
Я просто до этого var_dump'ом пытался смотреть и он выдавало ошибку все равно. По этому я проблему не мог понять.
Вот рабочий вариант на помощь тем кто столкнется с этой глупой проблемой.
@for($i = 0; $i < count($dats); $i++)
{{ $dats[$i]->title }}<br />
@endfor
}%%%(php)
@for($i = 0; $i < count($dats); $i++)
{{ $dats[$i] }}
@endfor
%%или
%%(php)
@foreach($dats as $one)
{{ $one }}
@endforeach
%%
Мне нужен for а не foreach.
И ваш пример с for идентичен тому что я написал выше.
Соответственно это не работает и ошибки я указал.
По прежнему нуждаюсь в помощи.
Какие я только варианты не пробовал, проблема остается прежней.
@for($i = 0, $size = count($dats); $i < $size; $i++)
{{ $dats[$i] }}
@endfor
<?php for($i = 0; $i < count($dats); $i++) : ?>
<?php echo $dats[$i]; ?>
<?php endfor; ?>
Ковычки уберите
@for($i = 0; $i < count($dats); $i++) {{ $dats[$i] }} @endfor
Было бы все так просто. Теперь получаем другую ошибку.
htmlentities() expects parameter 1 to be string, object given (View: /var/www/shop.com/resources/views/home.blade.php)
Всем привет. Столкнулся с глупой проблемой.
Нужно перебрать массив с помощью цикла for.
Не нужно говорить "Используй foreach он молодец". Мне нужно перебрать массив именно с помощью for.
Я пробовал так:
@for($i = 0; $i < count($dats); $i++)
{{ $dats['$i'] }}
@endfor
Но увы получил ошибку следующего вида:
Undefined index: $i (View: /var/www/shop.com/resources/views/home.blade.php)
Самое интересное, что если запросить элемент массива, все выводит нормально.
{{ $dats['0'] }}
Объясните может ли blade вообще с этим справиться?
а вообще, я логики немного не пойму, раз у вас нет в форме урла, для отправки, значит без аякса вы не отправите форму (разве что на ту-же страницу). Т.е. если вы не планируете отправлять форму без аякса (хотя можно предусмотреть), тогда уберите submit с формы, а поставьте type="button", и отлавливайте по нему. Плюс, я не вижу, что вы передаёте поле comment через аякс, т.е нужно передать ещё
data: $("#form_id").serialize(),
Вот тут мне было сложно понять вас. И того что я прочитал я понял и написал вот это:
<form class="form-horizontal" method="POST" id="form_id" enctype = "multipart/form-data">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div id="heretext"></div>
<div class="your-review">
<div>
<span><label>Комментарий<span class="red">*</span></label></span>
<span><textarea type="text" name="comment" class="form-control" rows="6" placeholder="Текст комментария"></textarea></span>
</div>
<div>
<span><button type="button" name="button" class="btn btn-danger">Отправить</button></span>
</div>
<script type="text/javascript">
$('body').on('button', '#form_id', function(e) {
$.ajax({
type: "POST",
data: $("#form_id").serialize(),
url: "<?php echo URL::action("HomeController@add_comment")?>",
cache: false,
dataType: "json",
headers: {
'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
},
beforeSend: function(){
$('#heretext').removeClass(error);
// выводим инфу, что идёт обработка
},
success: function(data){
if (data.success) {
$('#heretext').html(data.success).fadeOut(2000);
} else {
$('#heretext').addClass('error').html(data.error).fadeOut(2000);
}
},
error: function() {
// выводим инфу о ошибки
}
});
return false; // вырубaeм стaндaртную oтпрaвку фoрмы
});
</script>
</div>
</form>
Вы меня если что сильно не пинайте. Я на js не писал ранее. Только php.
Если выполнять тот код который опубликован в данном сообщении - ничего не происходит. И оно понятно. Тут явный косяк с type="button".
ответ то пришёл, значит проблема в js .. т.е. у вас submit не остановился.
1) попробуйте убрать e.preventDefault(); и в конце? после аякса прописатьreturn false; // вырубaeм стaндaртную oтпрaвку фoрмы
Если все правильно понял, то вот код который получился сейчас:
<script type="text/javascript">
$('body').on('submit', '#form_id', function(e) {
$.ajax({
type: "POST",
url: "<?php echo URL::action("HomeController@add_comment")?>",
cache: false,
dataType: "json",
headers: {
'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
},
beforeSend: function(){
$('#heretext').removeClass(error);
// выводим инфу, что идёт обработка
},
success: function(data){
if (data.success) {
$('#heretext').html(data.success).fadeOut(2000);
} else {
$('#heretext').addClass('error').html(data.error).fadeOut(2000);
}
},
error: function() {
// выводим инфу о ошибки
}
});
return false; // вырубaeм стaндaртную oтпрaвку фoрмы
});
</script>
Ошибка и проблема аналогичная. Все как на прошлом скриншоте.