【问题标题】:calling function from controller in view laravel在视图 laravel 中从控制器调用函数
【发布时间】:2016-10-02 02:31:53
【问题描述】:

这实际上是一件简单的事情,但由于我是 laravel 的新手,这给我带来了麻烦,我有这个功能

class HomeController extends Controller {
    public $layout = 'layouts.master';
    public function __construct()
    {
        $this->middleware('auth');
    }
    public function index()
    {
        return view('landing-page')
       ->with('title','Landing Page')
       ->with('users',User::member()->get());

    }
    <!-- HOW TO CALL getDate Function in my view -->
    public function getDate(){
       $mytime = Carbon::now()->format('f');
       $response = array
                (
                    'content' =>$mytime,
                    'status'  =>'success',
                );
       return Response::json($response)->view('landing-page');      
   }
}

如何在我的 laravel 视图中调用它?我在整个互联网上搜索,但我不太明白,因为编程对我来说是新的我已经在我看来使用路由{{url('date')}}{{$mytime}} 尝试过这样的事情,但是没有工作,如果有某些事件我可以调用一个函数就像点击按钮一样发生,但如果没有特定事件,我会很困惑

<p>Month :{{url('date')}}</p>
<p>Month :{{$mytime()}}</P>

以上是我尝试调用函数的一些方法

根据@tptcat 的回答和工作更新我的尝试

创建helpers.php位于文件`app\helpers.php下

<?php
use Carbon\Carbon;
if (! function_exists('myGetDate')) {
    function myGetDate()
    {
       $mytime = Carbon::now()->format('F');
      return $mytime
    }
}

composer.json

"autoload": {
    "files":[
        "App/helpers.php"
    ],

在我看来调用函数

{{myGetDate()}}

【问题讨论】:

  • 错误是什么?
  • @SanzeebAryal none,它什么都不显示
  • 在创建帮助文件并将其添加到 composer.json 的自动加载部分后,不要忘记在终端上运行 composer dump-autoload 命令。

标签: php laravel


【解决方案1】:

这不是一个硬性规定,但使用框架的一部分是在一定程度上接受它的约定并将它们用于你的优势。

一般来说,您的控制器用于处理 HTTP(GET、POST、PUT 等)。它们并非旨在以不加选择的方式从您的视图中调用方法。

我建议改为这样做:

// app/Utilities.php
<?php

class Utilities
{
    public static function getDate()
    {
        // your code
    }
}

那么在你看来:

{{ Utilities::getDate() }}

或:

// app/helpers.php
<?php

if (! function_exists('myGetDate')) {
    function myGetDate()
    {
        // your code
    }
}

那么在你看来:

{{ myGetDate() }}

然后在composer.json 中自动加载您创建的任何文件:

"autoload": {
    "files": [
        "app/Utilities.php"
    ]
}

或者...

"autoload": {
    "files": [
        "app/helpers.php"
    ]
}

然后运行composer dump-autoload

解决此问题的另一种方法是使用Blade Service Injection(在 Laravel 5.1 中引入)。从技术上讲,这可以通过您的控制器完成:

// In your blade template
@inject('service', 'App\Http\Controllers\HomeController')

{{ $service->getDate() }}

但我仍然建议您的控制器中不要有一个方法来负责返回此数据,如果它将作为 Blade 模板中的方法调用的话。使用某种类型的服务类会更合适:

// app/Utilities.php
<?php

namespace App;

class Utilities
{
    public function getDate()
    {
        // your code
    }
}

// In your blade template
@inject('service', 'App\Utilities')

{{ $service->getDate() }}

在这种情况下,您不需要将其添加到 composer.json 中的 files 自动加载数组中。

对于它的价值,对您的项目一无所知,我会选择前两个选项之一,更可能是helpers.php 选项。

【讨论】:

  • 如果我使用helpers.php 在我看来如何调用我的函数
  • 我更新了我的答案。如果您确实使用了 helper 或 Utilities 类的想法,请务必按照有关添加到您的 composer.json 和运行 composer dump-autoload 的步骤进行操作
  • 完全按照你说的做,出现这样的错误Uncaught TypeError: Argument 1 passed to Activity\Exceptions\Handler::report() must be an instance of Exception
  • 好的。 1) 您的帮助文件不应有命名空间,因此请从该文件中删除 namespace App;。 2)在composer.json中,就是你需要的路径,所以:app/helpers.php(小写app)。不是App/helpers.php
  • 另一个错字:在您的myGetDate() 函数中,使用return,而不是echo。如果您回去阅读我的答案,请确保您完全了解我所做的事情并按照说明进行操作。它会按描述工作。
【解决方案2】:

试试这个:

   class HomeController extends Controller {

      public function __construct()
      {
          $this->middleware('auth');
      }

      public function index()
      {
        $title  = 'Landing Page';
        $users  = \User::member() - > get();
        $mytime = \Carbon::now()->format('f');

        return view('layouts.master.landing-page', [
            'title'        => $title,
            'users'        => $users,
            'mytime'       => $mytime
          ]
        );
      }

    }

要在登录页面视图中显示它,您可以通过以下方式访问它们:

{{ $title }}
{{ $users }}
{{ $mytime }}

【讨论】:

  • 问题是关于在视图中获取未通过控制器发送的数据。
猜你喜欢
  • 2014-10-30
  • 2016-05-23
  • 2017-03-12
  • 1970-01-01
  • 2013-09-14
  • 2016-05-21
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
相关资源
最近更新 更多