Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Тут нужны конкретные вопросы. Смотря как и что устроено.
Ну например в контроллере может быть так:
$city = City::where('id', $id)->firstOrFail();
return view('viewName', ['cirty' => $city]);
А потом во вьюхе:
{{ $city->name }}
Если тебе нужно получить единственный элемент, то вместо ->get() используй ->first() или ->firstOrFail() если надо выдать 404, когда ничего не найдено.
В случае ->first() ты получишь не коллекцию а саму сущность, либо null, если ничего не найдено.
Далее для проверки на пустоту коллекции есть соответствующий метод https://laravel.ru/docs/v5/collections#isempty
Чтоб понять что у тебя происходит в if ($checkName->max()) надо сделать dd($checkName)
города хранятся в базе - регион + город
Следовательно, необходимо в контроллере получить из базы город, передать его во вьюху и отобразить значение из поля в котором хранится его имя.
Понятно. Спасибо.
Если таблица одна, то и модель лучше одну иметь а по типам можно фильтровать вручную, либо с помощью локальных заготовок (local scopes):
С фильтрацией проблем нет, проблема в том, что в таблице хранятся похожие сущности, но разных типов, над ними надо совершать какие то похожие, но всё таки отличающиеся манипуляции.
Скажем есть в модели метод getSize(), но логика работы разная для элементов с разными типами и получается такая штука:
public function getSize()
{
if ($this->type === 'typeA') {
return ....;
} elseif ($this->type === 'typeB') {
return ....;
} elseif (...) { ... }
}
И так в десятке методов. Потом у нас появляется еще несколько типов и приходится в десятке методов отредактировать условные операторы... А если применить наследование, то каждый тип имел бы свою реализацию getSize() и других необходимых методов, а остальное поведение наследовал.
Как правило требуется получать коллекцию со всеми элементами и что то сделать с каждым. Например вызывать какой то метод элемента.
Laravel 5.3.31, PHP 7.1.13
Есть таблица Elements. Сущности в этой таблице имеют определенные типы, хранимые в поле type, от типа зависит поведение элемента. Например отличается логика в некоторых методах модели. Это сейчас сделано через условные операторы, что не удобно.
Хочется как то унифицировать работу с элементами, чтобы она происходила через один интерфейс, этого можно было бы достичь наследованием. То есть от модели Element унаследовать ElementOfTypeA, ElementOfTypeB, ... и реализовать в каждом по своему определенные методы.
Но проблема в том, что непонятно как это сделать и вообще возможно ли это сделать, чтобы можно было работать со всем этим через eloquent.
То есть, если нужно получить все элементы и обратиться к какому то методу каждого из них, то нельзя просто сделать
Element::all()
поскольку в полученной коллекции тип всех элементов окажется родительский - Element и, соответственно, обращения пойдут к методам родительского класса.
В идеале, я вижу такое решение: при запросах на получение (вроде ::all()) к модели Element как то заставить eloquent создавать объекты нужного типа основываясь на значении хранимом в поле type таблицы Elements.
Есть ли такой способ?
Или, возможно, есть более подходящая архитектура для такого кейса?
(похожая ситуация рассматривается в https://habrahabr.ru/post/344728/ но там не приводятся решения для описанной мной проблемы: как получать от eloquent объекты разного типа?).
Спасибо, что погуглил, помогло.
Вы можете отключить детализацию ошибок установкой настройки debug файла app/config/app.php в значение false.
Всё верно, с дебагом отображается стек трейс, без дебага страница "Whoops, looks like something went wrong."
Решил задачу так:
if ( ! App::environment('local'))
{
App::error(function(Exception $exception)
{
Log::error($exception);
return Response::view('errors.fatal', [], 500);
});
}
Реализовал другим путем, с помощью составителя шаблона
очень удобный механизм.
В проекте используется Sentry - популярный пакет системы авторизации.
При авторизации на сайте с другого устройства/браузера пользователя разовтаризовывает на всех остальных устройствах\браузерах. Есть необходимость изменить это поведение, чтобы логин везде сохранялся.
Вопросы:
1. Не знаете, есть ли у такой функции лаконичное название? )
2. Есть ли готовое решение?
3. Если решений нет, как это можно реализовать, чтобы не создать проблемы в безопасности?
В одной из моделей у меня зарегистрировано свое правило валидации. Беда в том, что при тестировании действия связанного с валидацией и использованием этого правила, phpunit выкидывает такое исключение:
BadMethodCallException: Method [validateMethodName] does not exist.
Как подружить модульное тестирование и свое правило валидации?
Подскажите, как заменить стандартную страницу "Woops", которая появляется на продакшене, если вылетает исключение.
Где и как можно определить некие действия выполняемые на каждой странице перед любыми другими акшенами в любом контроллере?
В Yii (или kohana... что то не помню), например, есть возможно создать в базовом контроллере метод с именем before() и он будет выполнятся всегда перед всем остальным.
Конкретно: надо показывать некое сообщение пользователям (через передачу в шаблона массива с сообщениями) на всех (или некоторых) страницах при выполнении некоторого условия.