Laravel, использовать внешний класс в контроллере - PullRequest
0 голосов
/ 04 мая 2020

Я использовал много функций из класса для использования в контроллере, и это нормальный способ предотвратить дублирование кода, но у меня есть функция, которая хранит расстояние в модели и использует коллекцию для разбивки на страницы, эта функция работает нормально и Возвращаем переменную $ store в контроллере, которая будет использоваться для разбиения на страницы, теперь мне нужно поместить ее в класс и вызвать ее из контроллера, к сожалению, она возвращает нулевое значение !!! как я могу исправить эту проблему? та же функция в контроллере работает нормально, но если я помещу ее в класс и вызову из контроллера, то будет возвращено значение null, помогите мне

enter image description here

Класс:

public function getStoresDistance($allstores)
{
    $stores = collect([]);
    foreach (session('storeinfo') as $storeInfo) {
        $store = $allstores->find($storeInfo['id']);
        if ($store) {
            $store->distance = $storeInfo['distance'];
            $stores[] = $store;
            if (!Collection::hasMacro('paginate')) {
                Collection::macro('paginate', function ($perPage = 25, $page = null, $options = []) {
                    $options['path'] = $options['path'] ?? request()->path();
                    $page = $page ?: (Paginator::resolveCurrentPage() ?: 1);

                    return new LengthAwarePaginator(
                        $this->forPage($page, $perPage)->values(),
                        $this->count(),
                        $perPage,
                        $page,
                        $options
                    );
                });
            }
        }
    }
}

звонок с контроллера:

$allstores = Storeinfo::where('show', 'y')->get();
$findstores = Helper::getStoresDistance($allstores);

1 Ответ

1 голос
/ 05 мая 2020

Если функция является общей для нескольких контроллеров, переместите ее в черту PHP. Черты специально разработаны для повторного использования. Затем вы можете использовать эту черту в вашем контроллере и вызывать его функцию так же, как если бы ваш контроллер работал следующим образом: $this->yourFunction(). Ниже будет выглядеть ваш код:

Черта:

trait StoresDistance
{
    public function storesDistance(){}
}

Контроллер:

class YourController extends Controller
{
    use StoresDistance;

    public function getStoresDistance($allstores)
    {
         // some code
         $this->storesDistance();
         // some code
    }
}

Справочные документы : https://www.php.net/manual/en/language.oop5.traits.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...