【问题标题】:Laravel use a controller in bladeLaravel 在刀片中使用控制器
【发布时间】:2019-02-06 11:18:58
【问题描述】:

我刚开始学习 Laravel,我陷入了一部分,我想从数据库中获取数据并将其传递给刀片(视图)文件,然后在另一个视图文件中使用这个视图,并想将一个变量传递给控制器,但我收到此错误:

“找不到类‘adsController’”

web.php

Route::get('seller/panel', 'sellerController@panel');

panel.blade.php

@include('seller\hook\ads')

sellerController.php

public function panel(){
    $ads = DB::table('ads')->get();
    return view('hook\ads', ['ads' => $ads]);
}

adsController.php

class adsController extends Controller {
  public function getStatus($p) {

    if ($p == 'something') {
      $status = 'yeah';
    } else {
      $status = 'blah blahe';
    }
    return view('hook\ads', $status);
  }
}

ads.blade.php

<div class="ads">
@foreach ($ads as $ad)
{{ $ad->name }}
{{ adsController::getStatus($ad->approved) }}
@endforeach
</div>

所以,如您所见,我正在尝试从 sellerController.php 的数据库中获取数据,然后将其传递给 ads.blade.php,然后我想在 ads.blade.php 中使用 adsController.php 的函数,但它可以'找不到adsController

对不起,我是 laravel 的新手

【问题讨论】:

  • 使用控制器输出数据是不好的做法。控制器应该用于将数据传递给视图,并显示所述视图。
  • 你的 adsController 命名空间是什么?只需在控制器之前添加命名空间。 {{ 命名空间\adsController::getStatus($ad->approved) }}
  • 你有什么建议? @Classified 有什么正确的方法吗?
  • @PayalPandav 它是:namespace App\Http\Controllers;
  • 您可以在您的Ad 模型上将所述函数添加为trait,这甚至会使语法更具可读性。 $ad-&gt;getStatus();

标签: php laravel


【解决方案1】:

尽管我不推荐您尝试实现的方法,但您应该尝试此方法。

{!! app('App\Http\Controllers\adsController')->getStatus($ad->approved) !!}

它应该可以工作,但这是非常错误的。

【讨论】:

    【解决方案2】:

    在刀片文件的开头,您可以包含以下内容

    @php
        use App\Http\Controllers\adsController as adsController;
    @endphp
    

    然后在您的刀片模板上,您可以使用您在此处使用的控制器。 但是直接用一个真的是个坏习惯。

    由于您是 Laravel 的新手,请改变这种编码习惯。

    如果您想要始终在特定刀片视图上显示的数据,您可以使用某种服务提供商。

    【讨论】:

    • 仍然返回同样的错误,"Class 'adsController' not found" 在这一行 &lt;?php echo e(adsController::getStatus($ad-&gt;approved)); ?&gt;
    • 我已经对代码进行了一些编辑,您现在可以查看一下吗,我已将@php() 删除为@php
    • 另外,如果该更改不能解决您的问题,那么您还可以在卖家控制器上添加所有广告项目的状态并将其与广告变量一起发送,这将是另一种解决方案
    【解决方案3】:

    正如大家所说,不建议从视图中调用控制器。 这就是我要做的:

    在你的模型中:

    <?php
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Ad extends Model{
        public function getStatus()
        {
            return $this->approved == 'something' ? 'yeah' : 'blah blaehe';
        }
    }
    

    在你看来:

    <div class="ads">
        @foreach ($ads as $ad)
            {{ $ad->name }}
            @include('hook.ads', ['status' => $ad->getStatus()])
        @endforeach
    </div>
    

    在你的控制器中:

    public function panel(){
        $ads = \App\Ad::all();
        return view('hook\ads', ['ads' => $ads]);
    }
    

    【讨论】:

    • 这个解决方案看起来不错,但有两个问题,首先,你没有将任何数据传递给 getStatus() ,应该将 $ad->approved 传递给这个函数。其次,如果我想在另一个视图中使用这个功能,我该怎么办?我这样做是因为我想在另一个视图中使用 getStatus() 一千次。
    • 我编辑了我的答案。您还需要在控制器中使用Ad 模型。
    • first, you not pass any data to getStatus() , should pass $ad-&gt;approved to this function. 您不再需要将$ad 传递给该方法。 getStatus()$ad 的一部分
    • Second, if I want to use this function in another view, what should I do? 当您从模型中获取广告时,它会自动提供getStatus() 方法。所以你只需要做同样的$ad-&gt;getStatus()
    • 你可以在这里了解更多关于模型的信息laravel.com/docs/5.6/eloquent它是像 Laravel 一样的 MVC(模型、视图、控制器)的重要组成部分
    【解决方案4】:

    当您在控制器中的命名空间声明错误时,通常会出现此错误。典型场景是您使用 Artisan 生成控制器存根,然后将其从默认位置移至其他位置。

    在某些情况下你需要运行:

    作曲家转储自动加载

    生成新的优化类加载器映射。

    【讨论】:

      猜你喜欢
      • 2018-03-24
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 2021-04-17
      • 1970-01-01
      • 2012-12-10
      • 2019-09-23
      相关资源
      最近更新 更多