如何在 Laravel 5.1 中从 Blade 调用控制器动作?

Posted

技术标签:

【中文标题】如何在 Laravel 5.1 中从 Blade 调用控制器动作?【英文标题】:How to call controller action from Blade in Laravel 5.1? 【发布时间】:2015-11-07 14:36:23 【问题描述】:

我试图在 Laravel 5.1 的视图中调用控制器操作,但无法执行此操作。

这是我迄今为止尝试过的:

<?php echo BridesController::getPhotographer($data->sender_id);?>

但它给出了 Class 'BridesController' not found 错误。

【问题讨论】:

你想达到什么目的?肯定有比从视图执行控制器更好的方法。 【参考方案1】:

要在属于当前操作的视图中呈现外部操作输出,您需要从当前操作调用外部操作,然后将其输出存储到变量并将其传递给当前视图。

从同一个控制器调用动作

如果您要渲染的动作在您使用的同一个控制器内,您可以调用:

$result = $this->action();

return view('my.view',['my_rendered_action'=>$result]);

然后,在你的视野中,只是:

!! $my_rendered_action !!

注意不要渲染来自用户使用此方法的任何内容,因为 !! !! 标签不会逃避危险的输入。如果您不需要在操作响应中包含 html,请始终使用 。

从另一个控制器调用动作

如果您需要在多个控制器之间共享一个方法,最简洁的方法是创建一个实现逻辑的 trait 或 Job,然后两个控制器将使用该 trait 或调度相同的作业。

更多信息请参考Shaddy's answer to this question。

希望对您有所帮助。 ;)

【讨论】:

我在 Laravel 5.4 中尝试了你的路由解决方案,但结果只是 url 路径而不是视图。例如。当我调用 action('page.listAll') 结果是“localhost.indalpe/page/listAll”。如何渲染动作返回的视图? 路由解决方案被标记为“旧答案”,因为它正在打印 URL。为了清楚起见,我现在编辑了文本以删除其旧版本。要渲染视图,您需要在渲染之前将其存储在变量中。请重新阅读答案(我认为现在更清楚了)。【参考方案2】:

你可以这样做:

action('BridesController@getPhotographer',$data->sender_id);

当然,如果你使用刀片,你可以这样做

 action('BridesController@getPhotographer',$data->sender_id) 

你可以在这里查看 http://laravel.com/docs/5.1/controllers#basic-controllers

【讨论】:

【参考方案3】:

如果您创建自己的外观,您可以这样做。

控制器:

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Facade;

class BridesController extends Facade 

   protected static function getFacadeAccessor() 
       //what you want
       return 'getPhotographer';
   

   public static function getPhotographer() 
       return "photographer";
   


//可能是服务提供者。

配置/app.php

 'BridesController'=>  App\Http\Controllers\BridesController::class,

然后你就可以在你的视图中使用了。

<div class="panel-body">
    BridesController::getPhotographer()
</div>

我还没有测试过,但我认为应该可以。

【讨论】:

以上是关于如何在 Laravel 5.1 中从 Blade 调用控制器动作?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 和 Vue 在 Blade 中从组件 1 向组件 2 发送数据

在 Laravel 5.1 中使用 Blade 访问嵌套 URL

Laravel 5.1 Blade模板引擎

Laravel 5.1 Ajax 从 Blade View 获取 html

Laravel系列5.1Blade模板开发

如何将 Laravel Blade 中的第一个字母大写