Laravel 4为类添加方法(IoC / Namespaces)


Laravel 4 Add Method to Class (IoC / Namespaces)

我想弄清楚如何在Laravel包中添加一个方法到类中,以便所有调用该类的控制器和模型都可以访问新方法。如何在IoC中替换这个类?

这是有问题的包,Angel CMS。这个包是我创建的,所以如果我们需要添加别名或其他东西来完成这个任务,我可以修改它。

假设我想给这个类添加一个方法:

vendor/angel/core/src/models/PageModule.php

好的,我将类文件复制到这里:

app/models/PageModule.php

然后修改复制的文件,添加命名空间和所需的custom_function方法:

<?php namespace MyModels;
use Eloquent;
class PageModule extends Eloquent {
    protected $table = 'pages_modules';
    public static function custom_function()
    {
        return 'It works!';
    }
}

如您所见,我在这里使用的是MyModels命名空间。

然后,我运行composer dump-autoload

接下来,我打开我的app/routes.php并注册绑定并设置测试路由:

App::bind('PageModule', function($app) {
    return new 'MyModels'PageModule;
});
Route::get('test-binding', function() {
    return PageModule::custom_function();
});

但是,当访问测试路由时,我总是收到相同的错误,方法未定义。

我在这里做错了什么?提前感谢您的帮助。

澄清:

我试图取代类应用程序范围内,以便所有其他类(控制器/模型/等)调用PageModule将有访问custom_function方法。谢谢。

说实话,我对所有这些IoC,依赖倒置/注入概念也很陌生。但我想我以前也经历过同样的挣扎。在我所知的范围内,我要做的是……

添加一个构造函数到src/controllers/admin/adminpageconcontroller .php:

protected $pageModule;
public function __construct(PageModule $pageModule)
{
    $this->pageModule = $pageModule;
}

然后在同一文件中执行$module = new PageModule。将其替换为:

$module = $this->pageModule;

上面的两个修改使用了Laravel的IoC来允许在你的控制器中注入一个不同的PageModule对象,而不是严格地在你的代码中创建PageModule。

现在,Laravel应该知道,当它构造AdminPageController时,它应该创建一个PageModule并为你注入到控制器中。

因为你的控制器现在期望一个PageModule类,你不能再在你的应用程序中做class PageModule extends Eloquent了,因为即使名字是一样的,PHP不认为它是!您需要扩展它:

那么让我们将app/models/PageModule.php重命名为app/models/CustomPageModule.php,并在文件中将类更改为:

class CustomPageModule extends 'PageModule {
到目前为止,您还有一个CustomPageModule类,它是包的PageModule的子类。你现在需要做的就是让Laravel知道,如果任何控制器请求PageModule,它应该用你的MyModels'CustomPageModule来代替控制器。

那么在你的应用程序的routes.php文件的顶部:

App::bind('PageModule', 'MyModels'CustomPageModule');

你的AdminPageController现在应该使用你的CustomPageModule,可以使用任何公共方法,在那里!


我期待着大量修改这个答案,因为这将是一个相当长的讨论。我的第一个答案并不是你能写出的最好的代码,但我希望它只需要对原始代码进行最少的编辑,然后我们可以从那里开始。

或者通过阅读http://culttt.com/2013/07/08/creating-flexible-controllers-in-laravel-4-using-repositories

等文章来快速跟踪。

您可能有一个PageModule外观的别名,您应该在您的app/config/app.php文件中使用您的类'MyModels'PageModule覆盖这个别名。

要小心,这似乎是覆盖PageModule类,而不是扩展它。您可能应该扩展父类而不是Eloquent