Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Решение, во всяком случае, одно из решений: кинуть специфический эксепшн:
throw new HttpResponseException(
Response::view('errors.inactive_user')
);
Там проблема не столько в Laravel, видимо, сколько в сторонних пакетах. Например, один видел сам - dbal из симфони. Оно без 7.1 не заводится. И тут уже порекомендовали VPS, они в самом деле стоят дешево и позволяют все, что хочешь. Не представляю, как бы я очереди на хостинге заводил, например.
В общем, такая вот проблема. Есть у меня код в контроллере:
public function test(){
return view('test');
}
public function index(){
$this->test();
}
Когда я открываю страницу, роут смотрит на метод index и выполняет его. index выполняет test. А test должен отрендерить вьюху и остановить исполнение остальной программы на этом.
Но, разумеется, test возвращает управление в метод index. Поэтому рендера не происходит. Что сделать, чтобы рендер таки произошел?
Мне нужна именно такая история. Я не могу сделать return $this->test() из index(), это убьет всю мою идею. Это что-то вроде проверок на ошибки, и если ошибка, то отрендерить одно, а если не ошибка - продолжить выполнение того, что в index(). И я навешиваю этот самодельный валидатор в разные методы.
Вроде работает. В подробности не вдавался:
Ребят, можно как-то распараллелить выполнение очередей? Все обгуглил, не нашел.
Дело в том, что у меня может появиться одновременно огромное число очередей с долгим временем выполнения каждая. Каждая очередь инициализируется пользователем и в ответе передает данные обратно через websocket. Получается, что если 100 человек одновременно что-то запросят на сайте, то будь у меня запущено даже 50 воркеров, то последний пользователь все равно будет долго ждать, пока воркеры не доберутся до его очереди.
Есть ли какой-то способ для каждой новой очереди запускать отдельный php-процесс автоматически?
Есть подозрение, что никак. Есть какое-то решение действительно параллельного выполнения для ларавела, пусть это и не очереди?
Почему бы после валидации не написать проверку вручную?
Странно...Раньше так делал и работало...
Я бы сказал, что это вообще порочная практика из Си - возвращать 0 или 1, тру или фелс. По идее если что-то случилось внутри Auth::logout() (или чего угодно еще), то оно должно кинуть Exception наружу, а ты его перехватить. За конкретно этот метод не ручаюсь, конечно.
Дополню, что и выкидывать отсюда Laravel не хочется. Там уже есть сам функционал поиска. Писать демон на PHP и прочее вроде и не нужно... А вроде и как приспособить Laravel - непонятно.
Всем привет. Очень нужно объяснение одной проблемы, попробую коротко.
Начну с задачи: нужно сделать поисковую выдачу на вебсокетах. То есть пользователь ввел запрос, браузер соединился по вебсокету с сервером, при нахождении очередного результата сервер отправляет его браузеру и браузер отображает. Вебсокет нужен потому, что поиск может длиться хоть полчаса (очень большое количество разных источников), и использовать тут ajax я не хочу (чтобы не опрашивать сервер постоянно и не нагружать его), а просто загрузка страницы и вовсе исключена в силу постановки самой задачи (долгое время выполнения). Очень привлекательной выглядит событийная модель вебсокета, в общем.
Теперь о проблеме. Я прочитал и просмотрел много материалов про связку, которая, видимо, самая популярная. Ставится node.js, в браузер грузится socket.io. Браузер общается с node.js. Сам node.js общается с laravel через redis. Laravel броадкастом рассылает ивент с именем канала, он (видимо), пишется в redis, а node.js слушает redis, подхватывает новый ивент и рассылает его всем браузерам, слушающим этот канал.
Но мне нужно:
а) Передать параметры поиска в Laravel из браузера
б) Вернуть результат обработки от Laravel конкретному браузеру, а не всем подряд вообще
Пункт "б" вообще нигде не раскрывается. Если пользователь не авторизован, то совершенно (мне) не понятно как laravel будет передавать что-то ему, ведь о том, кто именно запрашивает результат laravel не знает.
Я нигде не могу найти ответы на эти вопросы и даже не понимаю, туда ли я двигаюсь. Кто-нибудь сталкивался, может подсказать?
Извините, если сумбурно написал, под вечер каша в голове.
Есть кто живой?
Добрый день, друзья.
Понадобился rbac. Ну или его простая реализация. Нужны роли и у роли должен быть доступ к тому или иному контроллеру. Кроме того, назначение сразу двух ролей (с доступом в админку и без нее). Не хочется городить костыли и хочется, чтобы решение было более гибким, например, если понадобится добавить пермишны и сложные условия.
Подскажите, что попроще и что вы используете?
The Laravel Way - создать helpers.php в нем разместить свою функцию-помощника (helper)
Спасибо! Думаю, тему можно закрывать на этом
А в чём смысл этой затеи?
Да просто есть один сайт, где страницы уже со слешем. Я хочу перевести его на фреймворк. Но я не хочу делать километровый список редиректов или (не дай бог вообще!) переиндексацию в поисковых системах. Для них-то это разные адреса.
А как мне правильно написать свою функцию url()? UPD: Вернее, куда положить ее?
С какой радости Apache редиректит URL c / на URL без /? Обратное - да, если это папка и URL не заканчивается на /, то будет редирект. nginx делается ровно то же самое.
aanon, надо смотреть лог запроса. В Firefox открыть private tab, открыть Firebug или обычные developer tools (ctrl+shift+i), дальше вставить URL со слэшем и смотреть вывод, потом убрать весь код Laravel из public и сравнить. Если редирект от сервера, то он будет в обоих случаях (уверен, что дело не в нём).
Private Mode нужен для отключения кэширования редиректов, которое Firefox делает для 301.
Благодарю, уважаемый. Я уж было подумал, что тут даже темы не читают.
Я вот тут подробнее отписал: https://laravel.ru/forum/viewtopic.php?pid=7754#p7754
Дело вовсе не в редиректах от веб-сервера. Nginx по умолчению позволяет открыть и адрес /test и адрес /test/. Апач можно настроить (вернее - отключить редирект с /test/ на /test в .htaccess) и заработают оба адреса.
Вопрос не в том, что делать с веб-сервером, с ним ничего делать не надо. Updated: Не надо ничего делать потому, что если прописать это на уровне веб-сервера, то все адреса без слеша получат редирект на адреса со слешем. Поисковик сойдет с ума - весь сайт состоит из редиректов О_о
Вопрос в том, как в Laravel по умолчанию правильно задать поведение: "генерировать URL'ы со слешем на конце" и возможно ли это вообще. Я с ним работаю всего неделю и информацию найти не смог.
Смог найти только что-то в духе "нууу, вы можете взять и переписать куски фреймворка как вам надо", но это решение не очень хорошее, мягко говоря.
Может быть вы мне подскажете немного другое: вот есть файл в вендоре (/src/Illuminate/Routing/UrlGenerator.php), я хочу его заменить своим. Очевидно, что нельзя менять его в вендоре, ведь при следующем composer update мои изменения будут затерты (я уже молчу о том, что в git'е вендор не лежит вообще). Как правильно мне изменить его?
не факт что нужно костыли, даже не факт, что нужно что-то делать ;-)
Вы или знаете и скажите или не знаете и не надо напускать загадочность )
Ок, можно попробовать отредактировать вот этот файл: https://github.com/laravel/framework/bl … #L493-L504
Плохо то, что он в vendor'е, нужно придумать грамотный костыль, чтобы как-то переопределить метод.
апач действительно делает дополнительный редирект, ибо его ожидания не совпадают с реальностью.
я лично давно на nginx сижу.
Без проблем. А сделать-то как то, что я хочу? Я выше описал ситуацию с nginx.
Ну так это стало быть Апач делает rewrite. Значит надо задать новое правило для твоей страницы, чтобы он воспринимал этот слэш.
Я не совсем об этом. Дело не только в роутах. Например, я настроил nginx так, что он обрабатывает адреса и со слешем и без слеша и редиректа не происходит. Но когда я создаю URL:
Route:
Route::get('/test/', ['as' => 'test'], function () {
return "test";
});
View:
<p> {{ url('test') }} </p>
То я получаю URL вида:
site.ru/test
вместо
site.ru/test
Чтобы было совсем понятно. Например, в Yii2 можно задать suffix для урлов в настройках роутера. И тогда все урлы автоматически получат этот суффикс в конце. И указываю в роуте "test" на деле будет URL вида "test.html".
Updated:
И нет, если сделать:
{{ url('test/') }}
То это ничего не меняет (насколько я понимаю - это альяс в данном контексте, а не конкретный URL).
Никто не сталкивался?..
Приветствую всех, проблема с Blade шаблонизатором. Никак он не работает. И кодировки менял и перепроверял может где ошибка в ситаксисе, никак не могу через @yield подключить секции (с путями тоже все перепроверил). Не могу нигде найти документацию по таким ошибкам, была ли у кого практика с такой фитчей ? Подскажите пожалуйста.
Не обязательно дублировать пост, тут все равно полтора инвалида
https://laravel.ru/forum/viewtopic.php?id=1662
Покажите контроллер (или роут).
Наводящий вопрос: вы точно view('for') делаете, а не view('start')?
Только что воспроизвел у себя, все работает нормально. Вьюхи ваши просто скопировал, в роуте:
Route::get('/test', function () {
return view('for');
});
Ну и логи посмотрите, конечно.
aanon пишет:Назрел еще один вопрос, на который не нашел однозначного ответа. Как мне самостоятельно разделить сайт на frontend и backend? Есть какие-нибудь общепринятые практики?
Route::group(['prefix' => 'admin', 'namespace' => 'путь до папки где лежат контроллеры для бекенда', 'middleware' => ['auth']], function() {
// Тут роуты для админки
});
Спасибо большое! Как ни странно, дошел до этого сам и скоро попробую натянуть туда AdminLTE.
--resource в 5.2 появился.
обновляйся
Обновился. И выясняется, что этот флаг не генерит CRUD, он тупо генерит не пустой контроллер. И всё?
Добрый день.
Как сделать URL вида не "site.ru/test", а "site.ru/test/"?
Возник вопрос, не могу нагуглить. Смотрите. Например, я хочу создать страницу /test.html, я пишу роут:
Route::get('/test/.html', function () {});
Всё работает и всё отлично. Но если я хочу закончить не .html, а слешем, то у меня происходит переадресация с адреса со слешем на адрес без слеша и вот такая запись ни на что не влияет:
Route::get('/test/', function () {});
При этом непонятно отдельно, как быть с роутами вида, где слеш означает не окончание строки, а как бы индексный файл:
Route::get('/', function () {});
Что делать? Как сделать URL вида не "site.ru/test", а "site.ru/test/"?
Назрел еще один вопрос, на который не нашел однозначного ответа. Как мне самостоятельно разделить сайт на frontend и backend? Есть какие-нибудь общепринятые практики?