我想弄清楚如何在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
。