gpt4 book ai didi

php - Laravel 4 - 在其他 Controller 中使用 Controller Action ?

转载 作者:行者123 更新时间:2023-12-02 06:35:46 26 4
gpt4 key购买 nike

好吧,我有几个 Controller 在做我的工作,现在我创建了更多的 Controller ;在新 Controller 中执行某个操作的某个地方,我只记得我已经在旧 Controller 中编写了正确的代码。

例如在 oldController@handyAction

some_good_codez();

并在 newController@newAction 中

$myOldController = Load::controller('oldController'); // I wish Laravel had this?
$myOldController->handyAction();

最佳答案

这是错误的。 Controller 只需承担一项责任:接收 http 请求,从模型中获取一些数据并将其传递给 View 。如果您的 Controller 必须与另一个 Controller “对话”,这可能是因为您正在处理它们的数据,或者通过它们读取数据,而您不应该这样做,因为处理数据是模型的责任,而不是 Controller 的责任。

首先,看一下SOLIDSingle responsibility principle .如果能买到Taylor Otwell's book: Laravel: From Apprentice To Artisan ,去做吧,它会让你很好地了解如何在 Laravel 中实现 SOLID 原则。

然后,如果你真的需要在两个不同的 Controller 上使用一个方法,创建一个新类并在两个 Controller 上使用这个类。只需重构您的代码即可执行以下操作:

class MyController1 extends Controller {

public function __construct(MyClass $class)
{
$this->myClass = $class;
}

public function store()
{
$this->myClass->doWhatever();
}

}

class MyController2 extends Controller {

public function __construct(MyClass $class)
{
$this->myClass = $class;
}

public function update()
{
$this->myClass->doWhatever();
}

}

class MyClass {

public function doWhatever()
{
return 'done';
}

}

这仍然是错误的,但好一点了。

更好的是在数据存储库中处理数据,因此请查看存储库模式,this Taylor's video会让你很好地了解你是如何做的。它谈论可测试性,但不仅如此,您可以创建域存储库并在其中混合两个或多个模型,并在一个类中处理来自这些模型的数据。使用 Repository 模式的代码看起来更像:

创建接口(interface)(契约):

interface MyDataRepository {

public function getInfoA();
public function getInfoB($dataA);

}

创建一个实现该接口(interface)的类

class MyData implements MyDataRepository {

public function __construct(MyModelA $dataA, MyModelB $dataB)
{
$this->dataA = $dataA;
$this->dataB = $dataB;
}

public function getInfoA()
{
return $this->dataA->processData();
}

public function getInfoB($dataA)
{
return $this->dataB->processData( $this->getInfoA() );
}

}

[编辑]

将存储库想象成一个袋子,您可以在其中放入所需的所有内容并从中提取所需的内容。

在这个存储库中,我们使用了 2 个模型(MyModelA 和 MyModelB),由 Laravel 的 IoC 容器实例化,并且在方法 getInfoB 中,存储库使用这两个模型来生成数据并将其传递回 Controller 。

这一切都来自领域驱动开发。 Domain 是一个复杂的模型,例如 Order,它是使用来自订单、用户、项目、运输和付款表的数据构建的。如果没有所有这些信息,您实际上并没有在付款页面上显示的订单,因此您创建了一个订单存储库并将所有 ORM 混合在一个类中,它具有从这些表中获取数据并将其发送回的单一责任你的 Controller 。

[/edit]

当 Laravel 需要您的接口(interface)实例时,您必须告诉它实例化该类:

App::bind('MyDataRepository', 'MyData ');

这仅在您使用接口(interface)时完成,这里我们使用具体类做同样的事情,我们不需要通知任何东西,Laravel 知道该做什么:

public function __construct(MyClass $class)   
{
$this->myClass = $class;
}

并使用存储库创建您的 Controller :

    class MyController1 extends Controller {

public function __construct(MyDataRepository $data)
{
$this->data = $data;
}

public function store()
{
$this->data->getInfoA();
}

}

class MyController2 extends Controller {

public function __construct(MyDataRepository $class)
{
$this->data = $data;
}

public function update()
{
$this->myClass->getInfoB();
}

}

Laravel 会自动实例化你的类的一个实例,你不需要做任何其他事情来让它工作。

关于php - Laravel 4 - 在其他 Controller 中使用 Controller Action ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19495106/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com