Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 Re: Laravel 5.x » Вопрос от дилетанта. Если сработал фильтр то... » 16.02.2018 20:53:04

Тут нужны конкретные вопросы. Смотря как и что устроено.
Ну например в контроллере может быть так:

$city = City::where('id', $id)->firstOrFail();
return view('viewName', ['cirty' => $city]);

А потом во вьюхе:

{{ $city->name }}

#2 Re: Laravel 5.x » Почему не отрабатывается запрос с 'AND' ? » 16.02.2018 11:53:56

Если тебе нужно получить единственный элемент, то вместо ->get() используй ->first() или ->firstOrFail() если надо выдать 404, когда ничего не найдено.

В случае ->first() ты получишь не коллекцию а саму сущность, либо null, если ничего не найдено.

Далее для проверки на пустоту коллекции есть соответствующий метод https://laravel.ru/docs/v5/collections#isempty

Чтоб понять что у тебя происходит в if ($checkName->max()) надо сделать dd($checkName)

#3 Re: Laravel 5.x » Вопрос от дилетанта. Если сработал фильтр то... » 16.02.2018 11:37:55

города хранятся в базе - регион + город

Следовательно, необходимо в контроллере получить из базы город, передать его во вьюху и отобразить значение из поля в котором хранится его имя.

#5 Re: Laravel 5.x » Наследование моделей » 05.02.2018 14:59:58

Если таблица одна, то и модель лучше одну иметь а по типам можно фильтровать вручную, либо с помощью локальных заготовок (local scopes):

С фильтрацией проблем нет, проблема в том, что в таблице хранятся похожие сущности, но разных типов, над ними надо совершать какие то похожие, но всё таки отличающиеся манипуляции.

Скажем есть в модели метод getSize(), но логика работы разная для элементов с разными типами и получается такая штука:

public function getSize()
{
  if ($this->type === 'typeA') {
    return ....;
  } elseif ($this->type === 'typeB') {
    return ....;
  } elseif (...) { ... }
}

И так в десятке методов. Потом у нас появляется еще несколько типов и приходится в десятке методов отредактировать условные операторы... А если применить наследование, то каждый тип имел бы свою реализацию getSize() и других необходимых методов, а остальное поведение наследовал.

Как правило требуется получать коллекцию со всеми элементами и что то сделать с каждым. Например вызывать какой то метод элемента.

#6 Laravel 5.x » Наследование моделей » 04.02.2018 22:51:51

Silm
Ответов: 5

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 объекты разного типа?).

#7 Re: Laravel 4 » Как заменить страницу "Woops..." » 10.03.2015 13:18:07

Спасибо, что погуглил, помогло.

Влад пишет:

Вы можете отключить детализацию ошибок установкой настройки 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);
    });
}

#8 Re: Laravel 4 » Действия Before. » 06.03.2015 13:17:59

Реализовал другим путем, с помощью составителя шаблона

очень удобный механизм.

#9 Общий раздел » Sentry - логин на нескольких устройствах » 06.03.2015 11:08:24

Silm
Ответов: 0

В проекте используется Sentry - популярный пакет системы авторизации.

При авторизации на сайте с другого устройства/браузера пользователя разовтаризовывает на всех остальных устройствах\браузерах. Есть необходимость изменить это поведение, чтобы логин везде сохранялся.

Вопросы:
1. Не знаете, есть ли у такой функции лаконичное название? )
2. Есть ли готовое решение?
3. Если решений нет, как это можно реализовать, чтобы не создать проблемы в безопасности?

#10 Laravel 4 » Модульное тестирование и свое правило валидации » 06.03.2015 10:57:44

Silm
Ответов: 0

В одной из моделей у меня зарегистрировано свое правило валидации. Беда в том, что при тестировании действия связанного с валидацией и использованием этого правила, phpunit выкидывает такое исключение:

BadMethodCallException: Method [validateMethodName] does not exist.

Как подружить модульное тестирование и свое правило валидации?

#11 Laravel 4 » Как заменить страницу "Woops..." » 06.03.2015 10:49:27

Silm
Ответов: 4

Подскажите, как заменить стандартную страницу "Woops", которая появляется на продакшене, если вылетает исключение.

#12 Laravel 4 » Действия Before. » 06.03.2015 10:46:41

Silm
Ответов: 1

Где и как можно определить некие действия выполняемые на каждой странице перед любыми другими акшенами в любом контроллере?

В Yii (или kohana... что то не помню), например, есть возможно создать в базовом контроллере метод с именем before() и он будет выполнятся всегда перед всем остальным.

Конкретно: надо показывать некое сообщение пользователям (через передачу в шаблона массива с сообщениями) на всех (или некоторых) страницах при выполнении некоторого условия.

Подвал раздела