【问题标题】:Laravel call controller action from other controllerLaravel 从其他控制器调用控制器动作
【发布时间】:2018-04-19 15:41:01
【问题描述】:

我有一个post 模型、一个user 模型和一个point 模型。

每当用户发布新帖子时,他们都会获得一个积分(积分表中的新行)。

我为每个模型设置了控制器。

添加帖子后,我应该/如何从PostsController@store 调用PointsController@store

或者这是错误的做法?

Full code on GitHub

【问题讨论】:

  • $controller = new PointsController; $controller->store();
  • 我必须传递更多的数据,比如点的数量......但这是否是正确的方法?
  • post 和 point 模型之间是否有关系设置?如果你这样做 $post->point->create([]);你不想为此调用控制器。或者也许 $post->user->point->create([]);确保您在点模型中有可填充的列
  • 不是,帖子和用户、用户和积分的关系。又名用户hasMany posts和hasMany points,但是points和posts没有关系
  • @LuisfelipeDejesusMunoz store 方法应该接收一个 Request 作为第一个参数,所以调用它不是一个好主意。为此,您应该始终使用模型和关系

标签: laravel api events laravel-5 model-view-controller


【解决方案1】:

考虑使用模态。

例如,在您的PointsController:

public function store() {
    // your code
    User::addPoint(); // this is responsible for adding the point
}

在你的PostsController

public function store() {
    // your code
    User::addPoint(); // call this again
}

这样,您就有了一个负责更新帖子的模型。

【讨论】:

  • 等等……什么? :P
  • Michał 他的意思是在用户模型中添加一个静态函数。这是一种草率的做法。最好的方法是与观察者一起。所以你的想法会最有效。我会尝试在接下来的几个小时内发布一些内容。 @TaylorSwift 您永远不需要从另一个控制器调用控制器,只有极少数例外,这不是其中之一。请再次阅读问题。他甚至问这是否是正确的做法。
【解决方案2】:

选项1:使用模型

在 PostController 中

public function store(Request $request){
\Auth::user()->post()->create($request->all()); 
\Auth::user()->points()->create['point'=> 1]; // add your columns here
}

点模型

protected $fillable = ['point']; //add here  list of columns you want to use on \Auth::user()->points->create['point'=> 1];

选项2:使用观察者

像这里一样创建一个观察者类。我会在 app/ 中创建一个 Observers 文件夹

https://laravel.com/docs/5.5/eloquent#observers

称之为 PostObserver

在 PostObserver 中的 create 方法中:

 public function created(Post $post)
    {
        $post->user()->points()->create['point'=> 1]; // [column1=>value1, column2=>value2]
    }

点模型

protected $fillable = ['point']; //add here  list of columns you want to use on \Auth::user()->points->create['point'=> 1];

在 AppServiceProvider 方法启动添加

public function boot()
{
 Post::observe(PostObserver::class);
}

不要忘记添加正确的命名空间,然后在 AppServiceProvider 中添加 use Observers\PostObserver

【讨论】:

    猜你喜欢
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 2011-05-23
    • 2016-01-31
    相关资源
    最近更新 更多