Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Спасибо AlexeyMezenin
Перенес логику в контроллер, так явно быстрее получается. А закэшировать остальные маршруты все равно не получается так как пользуюсь такими штуками как
Route::group(['prefix' => 'content', 'middleware' => 'auth.basic'], function()
Вот мне интересен еще один момент, походу дела ларавел выполняет все функции с инсталом роутев, а уже потом ищет подходящий маршрут. По мне как то не совсем умно получается, может конечно чего не понимаю...
Так в таком случае мне надо в урле указывать id категории. А она может быть разная, не обязательно, что я написал, вот пример еще
/root-cat/cat-2/cat-3/contacts
/root-cat2/contacts
Ну смотри, вот у меня есть куча роутингов для моего дерева категорий, если я делаю обычный контроллер роуте, то там вызывается какой то контроллер и максимум, что я могу сделать это передать ему часть урла {id} . А мне нужно передать туда еще ID категории, что бы контроллер мог понять какую запись надо получить.
Вот пример у меня есть 2 статьи урл у которых contacts . Одна находиться по пути /info/contacts вторая /pages/contacts . За вывод их отвечает один котроллер. Если я добавляю два рутинга например info и pages на один и тот же метод контроллера и в параметрах методу будет название статьи тобиш contacts, то не ясно какую статью надо выдать, толи с первого пути, то ли со второго. Вот по этому мне надо как то в этот метод передать id категории. Для этого использую Route::get($uri, $callback); Но они не кэшируются (
Так лучше ?
Привет всем!
Опишу немного ситуацию. Есть у меня приложение. Там куча роутингов соответсвенно. Каждый раз при запуске все эти маршруты по новой компилируются и тп... Вот. Для контроллер роутинга есть фишка в том, что можно закэшировать, но вот беда в том, что у меня части маршрутов надо передать переменную из кода, и приходиться использовать роутинги с функциями(клосуре) и как это оптимизировать я пока понятия не имею.
То-есть по сути у меня через админку создается дерево категорий, для каждой категории задается url и в модуль(контроллер) с кем она работает. Потом я строю урлы для всего этого дела(вложенность может быть любая) и далее генерю роутинги, но опять же в роутинг надо передать id категории, что бы контроллер который отвечает за отображения данного материала применил фильтр по категории... Вот. Мысли у меня пока такие.
1. Создать обычные контроллер роутинги, и там, где нужно знать категорию обращаться к зараенее закэшированному массиву с роутингами...
2. В конце файла роутингов добавить переход в контроллер который уже определит к какому модулю относиться данная ссылка и вызовет нужный контроллер с нужными параметрами.
Может еще как можно реализовать? Щас пишу, думаю второй способ получше, но хотелось бы вашего мнения услышать. Если конечно я хоть что то понятно написал
Спасибо!
Constb спасибо, но либо я ничего не понял, либо уже это реализовал,только у меня называется поле module. А вот с айдишниками приходится плюсовать к ним значение, иначе при выборке, часть записей отсутсвует у которых одинаковые id. Вот. По сути я реализовал пагинацию таки, надо было другой класс использовать...
use Illuminate\Pagination\LengthAwarePaginator;
$paginator = new LengthAwarePaginator($resultNew, $count, 12);
$paginator->setPath("search")->appends(Request::All());
Щас вот с генерацией уролов еще разберусь .
Еще такой вопрос, может есть решение, вот сделал я выборку, а как мне можно теперь выделить слова найденые? Что то ума не приложу, по идее это должен бы сфинкс сделать, но тоже не ясно как его уговорить на такой подвиг
Вообщем потестировал я этот метод, если айдишнки совпадают, то он выводит в выборке что то одно. Вот мой конфиг пока такой
source gotoaltay . Это я так понял не вот такая фитча штатная, поэтому всяческие скрипты ее врятли будут поддерживать
http://sphinxsearch.com/docs/current/conf-source.html
Вот оно, кстати я конфиг чуть пределал в надежде что получиться но походу, тот вариант что у меня был делает то же самое .
Вообщем пока не вижу выхода из готовых решений, Хелп ми плиз )
{
type = mysql
sql_host = localhost
sql_user = 234234
sql_pass = 234234
sql_db = 2342344
sql_port = 3306 # optional, default is 3306
sql_query_pre = SET NAMES utf8
sql_query_pre = SET SESSION query_cache_type=OFF
sql_field_string = name
sql_field_string = desc
sql_attr_string = module
sql_attr_timestamp = created_at
}
source gotoaltayProperties : gotoaltay
{
sql_query = \
SELECT id, UNIX_TIMESTAMP(created_at) AS created_at, name, `desc`, 'property' as 'module' FROM properties
}
source gotoaltayExcursions : gotoaltay
{
sql_query = \
SELECT id, UNIX_TIMESTAMP(created_at) AS created_at, name, `desc`, 'excursion' as 'module' FROM excursions
}
source gotoaltayRealties : gotoaltay
{
sql_query = \
SELECT id, UNIX_TIMESTAMP(created_at) AS created_at, name, `desc`, 'realty' as 'module' FROM realties
}
source gotoaltayNews : gotoaltay
{
sql_query = \
SELECT (id+4000000) as id, UNIX_TIMESTAMP(created_at) AS created_at, name, `text` as 'desc', 'news' as 'module' FROM news
}
source gotoaltayPosts : gotoaltay
{
sql_query = \
SELECT (id+5000000) as id, UNIX_TIMESTAMP(created_at) AS created_at, name, `text` as 'desc', 'post' as 'module' FROM posts
}
index gotoaltayIndexPosts
{
source = gotoaltayPosts
path = /var/lib/sphinx/posts
morphology = stem_enru
docinfo = extern
min_word_len = 3
charset_table = 0..9, A..Z->a..z, _, a..z, U+0401->U+0435, U+0451->U+0435, U+410..U+42F->U+430..U+44F, U+430..U+44F
html_strip = 1
}
index gotoaltayIndexProperies : gotoaltayIndexPosts
{
source = gotoaltayProperties
# source = gotoaltayExcursions
# source = gotoaltayRealties
# source = gotoaltayNews
path = /var/lib/sphinx/gotoaltay-properies
}
index gotoaltayIndexExcursions : gotoaltayIndexPosts
{
source = gotoaltayExcursions
path = /var/lib/sphinx/gotoaltay-excursions
}
index gotoaltayIndexRealties : gotoaltayIndexPosts
{
source = gotoaltayRealties
path = /var/lib/sphinx/gotoaltay-realties
}
indexer
{
mem_limit = 128M
}
Спасибо, завтра проверю, посмотрим что получится. Но со скаутом получается толком не скрестить, так как он использует какую то одну таблицу. Все равно придется делать выборку и заморачиваться с пагинацией... Или скаут можно натравить на выборку из нескольких моделей?
я там через конфиг объединил, но твой способ крутее полюбому если заработает .
constb Спасибо! Но вот что меня смущает, в сфинксе я объединил 5 таблиц в одну, так же пришлось там айдишки править, ибо ему надо уникальные. Вот, и мне кажется sphinxsearch работать будет не идеально с таким положением дел... Про скаута погляжу, не смотрел с ним реализаций...
Фуф, дошли руки до дела таки, решил начать с Sphinx. Все настроил, но вот досада, с пагинацией таки не срастается у меня ничего. Не могу понять как прикрутить страндартную пагинацию к этому движку, так что бы шаблоны все стандартные работали... Совсем нет желание переписывать тот функционал, что есть. Может есть какие наработки уже?
Вот что наклепал, но это тестово, оно толком не работает
$count = get_object_vars($conn->select(
\DB::raw("SELECT COUNT(*) FROM gotoaltayIndex WHERE MATCH (:query) OPTION max_matches=100000,field_weights=(name=10, desc=5)"), array(
'query' => $query,
))[0])['count(*)'];
$results = DB::connection('sphinx')->select("SELECT * FROM gotoaltayIndex WHERE MATCH ('".$query."') OPTION max_matches=100000,field_weights=(name=10, desc=5)" );
$paginator = new Paginator($results, ($count/12), 2);
echo $paginator->links('vendor.pagination.bootstrap-4');
Всем спасибо, обмозгую все сказанное и буду потихоньку внедрять...
}%Как вариант - поля name & desc вынести в отдельную таблицу (и модель), которая будет связана с остальными полиморфной связь.
Тогда можно будет искать по одной таблице, легко можно будет получать объекты разных типов и не надо будет следить за синхронизацией таблицы для поиска.
А для основных таблиц можно будет сделать прокси-геттеры для получения нужных данных из полей name & desc.
Понятно? или нужен пример?
Частично понятно, а вот про прокси-геттеры не ясно, видимо не дочитал . С примером оно всегда понятне будет
. А возможно оставить поля name и desc в основных таблицах и продублировать их в таблицу для поиска? Так как поиск не так часто нужен будет и структуру менять не охота.
Так старательно хотел уйти от структуры таблиц в вордпресе, где все данные в двух таблицах храняться и опять таки прихожу к этой теме )...
Спасибо за ответы.
По поводу вывода, да мне надо получить список найденых моделей, получается, что разных типов, но можно привести все к одному типу, там надо то заголовок только да и описание...
Algolia я так понял бесплатный сервис.
Сейчас обрисовывается такая картинка, при сохранении записи я создаю клон полей(загловок и текст) например в модели search и далее у меня появляется возможность делать нормальную выборку всех данных разных типов с использование пагинации. Но если честно мне не очень охота зависеть от дополнительных сервисов и тем самым усложнять относительно простой проект. Со Sphinx та же история, если бы база была очень большой все это имело бы смысл но в моем случае наверное излишне, автокомплита там тоже не будет, поэтому запросов к бд минимум. Может что то попроще можно подтянуть для боле менее корректного поиска теперь уже получается по одной таблице?
Ну или еще какие то варианты может есть интересные?
Добрый день!
Есть у меня проект, там несколько моделей, статьи, объявления и тп. У всех у них есть поля name и desc, вот хотелось бы как то сделать нормальный поиск по всем этим моделям, вся документация, что по скауту, что по другим решениям описывает, работу только с одной таблицей... По крайней мере я ничего не нашел другого...
На ум приходит решение написать трейт для модели, как для скаута, что бы при добавлении новой записи она еще дублировалась в нужную мне табличку и потом уже по той табличке осуществлять поиск, но там тонкостей столько всплывает, и импорт делать и как то обрабатывать сотфделит... Может какое решение уже есть готовое?
Спасибо!
Здравствуйте!
Назрела тут пачка вопросов, помогите, чем сможете .
В новом ларавеле в блейде добавили компоненты, вот, можно ли их использовать как функци? И как вообще правильно решить задачу, где надо время от вермени повторять код?
У меня есть еще проектик, сделал вывод всяких там разных хтмл инпутов селектов и все это заточено под бутстрап. Что бы побыстрому формы делать нужные мне. Вот в данный момент часть когда реализована через класс, где идет обработка параметров и собственно сами инпуты выводяться, а другая часть реализования через блейд, где я уже натягиваю на это все html разметку. А есть компоненты типа галереи, там много html и рука не позволяет их из вьюх выносить и их сделал как компоненты(благо не часто вызываются). А вообще в идеале хочется к какому то одному решению придти, но незнаю как красиво это реализовать...
Спасибо за такой классный ответ. я учусь кодить красиво, но пока опыта мало, поэтому такие ответы очень ценные. Чем больше такой информации попадает тем лучше получается код. Сейчас написал класс для операций вставки обновления и прочего для контроллера и наследую его всеми другими контроллерами, вот там не получается метод внедрить при перегрузке функций... Сейчас все больше и больше ясности приходит по работе с сервис контейнером , поначалу мозг совсем отказывался понимать :-). А уж грамотная работа с редактором кода для меня конечно это высший пилотаж :-)
Спасибо!
Добрый день, любителям ларавела :-).
С инглишом не совсем силен, а вот в русских доках совсем не встречал такой инфы. Сейчас создаю фасады просто указывая на мой класс без всякого создание сервис контейнера. Это удобно ибо проще. Но вот в доках везде пишут, что надо создавать сервис контейнер вначале. А вот зачем если он сам создаётся? :-)
Просто штука такая, я админку делаю и буду таскать ее между проектами постоянно, мне надо как то автоматизировать процесс добавления всего этого дела, типа копи паст и все работает :-).
routes.php – это просто пхп-файл, в нём необязательно вызывать только фасады. в нём вообще что угодно можно выполнить
Это хорошо. я вот хочу вынести часть когда из роутев в отдельное место, создал для админки пространство имено новое, вот туда бы вынести куда то. Как это грамотно сделать?
а если без фасадов?
app()->make(\App\Libs\Categories::class)->installRoutes();
Можно и так но у меня там структура вся в этом классе, виде дерева, она при каждом запросе нужна и много где используется и не однократно за запуск приложения...
Угу все верно конфиг разный, в php.ini я сам писал. Кстати раз уж пошла такая тема, когда пересоздовал все таблицы все равно валиться в ошибку, так как таблицы не находит, решил вот так
if (!App::runningInConsole()){
Categories::installRoutes();
}
но честно говоря тоже не идеал, так как надо проверять команду работы с миграциями.
Сам спросил сам отвечаю ... Вообщем не надо использовать шорттэги в пхп, в консоли они не работают :-). Как догодался даже понятия не имею, бубен все таки вещь хорошая ;-) . <? заменил на <?php ...
Доброе время суток, Друзья!
Наткнулся на такую вот неприятную вещь.
Пишу в файлик routes/web.php такую строчку
Categories::installRoutes();
Собственно это мой класс, который генерит маршруты. На него создан фасад.
class Categories extends Facade {
protected static function getFacadeAccessor() { return '\App\Libs\Categories'; }
}
И все великолепно работает в вебе, но как только я запускаю команду artisan он вываливает мне на экран файлик '\App\Libs\Categories, все как пологается со всеми классми и функциями и пишет ошибку:
[ReflectionException]
Class \App\Libs\Categories does not exist
я понять то не могу какого он лезет в файл web.php (вроде как для веба он ), а во вторых, как он не может найти класс если он мне его в этом же сообщении на экран вывалил. Может я что то не догоняю просто.
Сервис контейнер не делал для него, вернее делал но там похожая котовасия. я так понимаю при создани фасадов Ларавел как бы создает одиночный экземпляр класса, который и нормально доступен в системе... Мне большего не нужно от этого класса.
Вот, версия самая последняя, только обновился...
Спасибо!