从外部控制器中的刀片模板调用助手功能会导致“找不到类”

时间:2019-05-09 18:47:44

标签: php laravel controller laravel-blade

我正在做一个概念验证/玩具示例,试图使自己熟悉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在幕后所做的事情比我所知道的要多,这是导致问题的原因,但我不知道要寻找什么或要寻找什么。< / p>

任何有关此小的更改为何会使页面中断的解释都将有所帮助

我可以确认CBookController.php和Helper.php都在同一目录中,因此视图中的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中)

我希望页面工作正常,但最终出现错误页面,并显示消息“找不到类'app \ Http \ Controllers \ Helper'”

1 个答案:

答案 0 :(得分:0)

您可以做的是为您的自定义功能创建一个自定义外观。

  • 在App / Http / Custom中创建一个文件夹
  • 创建一个类DateHelper
  • 将您的功能添加到课程中
  • 使用@inject
  • 在视图中使用自定义外观

用法

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