Вызов вспомогательной функции из шаблона блейда во внешнем контроллере приводит к тому, что «класс не найден» - PullRequest
0 голосов
/ 09 мая 2019

Я делаю пример, подтверждающий концепцию / игрушку, чтобы попытаться ознакомиться с подробностями Laravel, и я столкнулся с ошибкой, которой не ожидал.

Внутри моегоВ блейд-шаблоне я сделал вызов вспомогательной функции, содержащейся в контроллере (контроллер был сгенерирован через php artisan make:controller CBookController).И звонок из шаблона лезвия был {{isset($val->prep) ? CBookController::toDate($val->prep) : ''}}.Я получил это работает, и все было денди.Я решил, что хочу извлечь эту вспомогательную функцию из этого контроллера, чтобы использовать ее в другом месте проекта.ПРИМЕЧАНИЕ. Я мог бы вызвать код только из вида, если бы включил строку: <?php use app\Http\Controllers\CBookController; ?> в шаблон блэйда

Имейте в виду, все это работало правильно и не выдавало никаких ошибок.

Итак, вот тут-то и началось.

Я сделал звонок >php artisan make:controller Helper

Я перефразировал все ссылки в представлении, чтобы сказать Helper вместо CBookControllerто есть {{isset($val->prep) ? CBookController::toDate($val->prep) : ''}} -> {{isset($val->prep) ? Helper::toDate($val->prep) : ''}}

и

<?php use app\Http\Controllers\CBookController; ?> -> <?php use app\Http\Controllers\Helper; ?>

до того, как я все проверил, все работало должным образом.Но после упомянутого рефакторинга все пошло не так.

Обратите внимание: я понимаю, что для более продвинутого пользователя laravel создание «вспомогательного» контроллера не имеет смысла.Опять же, как более начинающий пользователь, я просто пытался внести небольшие постепенные изменения, которые по-прежнему будут работать, как и ожидалось.Я не пытаюсь выяснить, как правильно использовать вспомогательные функции (по крайней мере, на этом перекрестке), и не выясняю ничего другого, кроме того, почему создание нового контроллера и последующая ссылка на этот контроллер в представлении приводят меня в замешательство.

Моя интуиция подсказывает мне, что make:controller делает больше за кадром, чем я знаю, и это является причиной проблемы, но я не знаю, что искать или где искать.

Было бы полезно любое объяснение того, почему это небольшое изменение нарушает страницу.

Я могу подтвердить, что и CBookController.php, и Helper.php находятся в одном каталоге, поэтому не должно бытьОшибка filepath с оператором use в представлении.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class CBookController extends Controller
{


    public function main()
    {

        $result = \DB::connection('database')
        ->table("docs")
        ->join("plans","docs.bn","=","plans.bn")
        ->select('docs.bn',
            "plans.a",
            'b as Status',
            'c as fee',
            'd as exec',
            'e as mail',
            'f as prep')
        ->where('id','=','19')
        ->where('b','=','N')
        ->get()
        ->toArray();



        return view('test.Control_Book_Test')->with('result',$result);
    }

    public static function toDate($strToConvert)
    {
        return date("m-d-Y",strtotime($strToConvert));

    }
}

это оригинальный контроллер (отредактированные поля столбцов для анонимности, я считаю, что все оставалось согласованным, но независимо от этого, он работал раньше)

Новый контроллер выглядит следующим образом

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class Helper extends Controller
{
    public static function toDate($strToConvert)
    {
        return date("m-d-Y",strtotime($strToConvert));

    }
}

и, наконец, вот представление (до рефакторинга)

<?php use app\Http\Controllers\CBookController; ?>
@section('content')
<div style = "overflow-x: scroll">
        <table class="table table-striped- table-bordered table-hover table-checkable" id="magicWand">
            <thead>
                <tr>
                    <th>Col 1</th>
                    <th>Col 2</th>
                    <th>Col 3/th>
                    <th>Col 4</th>
                    <th>Col 5</th>
                    <th>Col 6</th>
                    <th>Col 7n</th>
                    <th>Col 8</th>
                    <th>Col 9</th>
                    <th>Col 10</th>
                    <th>Col 11</th>
                    <th>Col 12</th>
                    <th>Col 13</th>
                    <th>Col 14<br></th>
                </tr>
            </thead>
            <tbody>
                @foreach($result as $k => $val)
                <tr>
                    <td>{{isset($val->bn) ? $val->bn : ''}}</td>
                    <td>{{isset($val->ShortPlanName) ? $val->ShortPlanName : ''}}</td>
                    <td>n/a</td>
                    <td>{{isset($val->Status) ? $val->Status : ''}}</td>
                    <td>{{isset($val->fee) ? "$".number_format($val->fee,2) : ''}}</td>
                    <td>{{isset($val->exec) ? CBookController::toDate($val->exec) : ''}}</td>
                    <td>{{isset($val->mail) ? CBookController::toDate($val->mail) : ''}}</td>
                    <td>{{isset($val->prep) ? CBookController::toDate($val->prep) : ''}}</td>
                    <td>n/a</td>
                    <td>n/a</td>
                    <td>n/a</td>
                    <td>n/a</td>
                    <td>n/a</td>
                    <td>n/a</td>
                </tr>
                @endforeach
            </tbody>

        </table>
</div>
@endsection

Для краткости нет смысла перекомпилировать весь файл только с некоторыми измененными именами, но вот строки, которые содержат измененную ссылку

<?php use app\Http\Controllers\CBookController; ?> (самая первая строка)

<td>{{isset($val->exec) ? CBookController::toDate($val->exec) : ''}}</td> (в пределах @foreach)

<td>{{isset($val->mail) ? CBookController::toDate($val->exec) : ''}}</td> (в пределах @foreach)

<td>{{isset($val->prep) ? CBookController::toDate($val->exec) : ''}}</td> (в пределах @foreach)

Я ожидал, что страница будет работать нормально, но в итоге получаю страницу с сообщением "Class 'app \ Http \ Controllers \ Helper' not found"

1 Ответ

0 голосов
/ 10 мая 2019

Что вы можете сделать, это создать собственный фасад для своей пользовательской функции.

  • Создать папку в App / Http / Custom
  • Создать класс DateHelper
  • Добавьте свою функцию в класс
  • Используйте пользовательский фасад в своем представлении, используя @inject

использование

 @inject('helper', 'App\http\DateHelper');
      {{ $helper->toDate('params') }};
...