Laravel 5.2控制器返回一个对象

Posted

技术标签:

【中文标题】Laravel 5.2控制器返回一个对象【英文标题】:Laravel 5.2 Controller returning an object 【发布时间】:2016-10-26 21:56:43 【问题描述】:

我在控制器只返回一个对象时遇到问题。我有一个表类型,在 TypesController 中我想要一个只返回类型数组的函数,所以我可以在另一个控制器中使用它,所以我在 TypesController 中编写:

public function getNavTypes()
    
        $types = DB::table('v_itemtypes')->get();
        return ($types);
    

我想在另一个控制器(作者)中调用它,所以我添加了这一行

use App\Http\Controllers\TypeController;

并且只想在我的方法中调用对象以传递给视图:

 public function getAuthor($author_id)
    

        $author = Author::where('id', $author_id)->first();
        $navtypes = TypeController::getNavTypes;
        return view('authors.edit',['author'=>$author, 'navtypes'=>$navtypes]);
    

但我收到以下错误:

FatalErrorException in AuthorController.php line 28: Undefined class constant 'getNavTypes'

第 28 行是

$navtypes = TypeController::getNavTypes;

作为一个新手,我做错了什么,但是什么?

【问题讨论】:

【参考方案1】:

除非函数是static,否则您不能在不实例化其类的情况下调用函数。所以要么你把你的函数改成static

public static function getNavTypes()

或者你先实例化一个控制器的对象:

$typeController = new TypeController();
$navtypes = $typeController->getNavTypes();

顺便说一句,getNavTypes 是一个函数,你需要添加两个括号:

()

在调用它时在它的名字之前。所以把$navtypes = TypeController::getNavTypes;改成$navtypes = TypeController::getNavTypes();

希望这会有所帮助。

【讨论】:

谢谢!现在排序!【参考方案2】:

我认为你应该使用 TypeController::getNavTypes(),因为 getNavTypes 是一种方法,而不是类常量。

【讨论】:

【参考方案3】:

仅当您将方法指定为static 时,才可以使用:: 调用方法。

public static function myMethod()

    // Do stuff...

在您的情况下,方法 不是 静态的,因此您需要像这样调用您的方法:

$TypeController = new TypeController();
$navtypes = $TypeController->getNavTypes();

在 Laravel 中,您还可以像这样创建控制器实例:

$TypeController = App::make('TypeController');
$navtypes = $TypeController->getNavTypes();

注意: 您的 getNavTypes() 方法在逻辑上属于 Model 或 Repository 类。因此,您最好将其移出控制器并将其放置在您选择的模型类中 - 可能最适合上下文的位置。在您的控制器中,应该放置大部分 action 方法。

【讨论】:

【参考方案4】:

您可以在 Laravel 5 的不同控制器中调用控制器方法,例如:

app('App\Http\Controllers\TypeController')->getNavTypes()

参考:Access Controller method from another controller in Laravel 5

根据您的代码:getNavTypes 是一种方法,而不是静态属性或常量。你可以这样称呼它

TypeController::getNavTypes();

在调用它之前也要声明这个方法是静态的:

public static function getNavTypes()

【讨论】:

以上是关于Laravel 5.2控制器返回一个对象的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.2:测试上传的文件是不是有效:非对象上的 isValid()

Laravel 5.2 ajax 更新问题

处理来自 PHPUnit (Laravel 5.2) 的自定义异常

如何通过Laravel 5.2中的其他控制器扩展通用控制器?

Laravel 5.2 - 如何将变量(数组和整数)从视图传递到控制器?

如何通过 post 方法将数据从 ajax 传递到 laravel 5.2 控制器