理解PHP / Laravel中的Constructor,$ this关键字和控制器类

时间:2016-07-08 20:15:32

标签: php laravel

我知道之前有过这方面的内容,但我正在努力将其应用到我的代码中。

我正在Laravel中开发一个PHP应用程序但是想让我的代码更加模块化和可测试,这意味着将我的逻辑从我的重组控制器中拉出来并将它们分离成单独的文件并从控制器中调用它们。

在一个这样的控制器(ImageController)中,我正在调用ImageRepository.php中的逻辑,它看起来像这样:

    <?php
namespace App\Http\Controllers;
use App\Logic\Image\ImageRepository;
use Illuminate\Support\Facades\Input;
class ImageController extends Controller
{
    protected $image;
    public function __construct(ImageRepository $imageRepository)
    {
        $this->image = $imageRepository;
    }
    public function getUpload()
    {
        return view('pages.upload');
    }
    public function postUpload()
    {
        $photo = Input::all();
        $response = $this->image->upload($photo);
        return $response;
    }
    /*public function deleteUpload()
    {
        $filename = Input::get('id');
        if(!$filename)
        {
            return 0;
        }
        $response = $this->image->delete( $filename );
        return $response;
    }
    */
}

我的问题是我不明白这段代码是如何工作的,因为我从其他来源获得它并想要理解它,所以我可以在我的代码中的其他地方复制这个架构。

上传图片时的路线是:

Route::post('upload_image', ['as' => 'upload-post', 'uses'     =>'ImageController@postUpload']);

所以我的第一个问题是,我从不在我的路线中调用构造函数。它正确到postUpload()。这是否意味着没有目的?另外为什么构造函数在ImageRepository$imageRepository之间没有逗号......根据我对文档的理解,如果其中一个是布尔值,你只会这样做?

为什么$response = $this->image->upload($photo);代表postUpload()中的任何内容?该函数upload()来自存储库,use足以让它知道该怎么做?为什么$this->image意味着什么,$this指的是什么? ImageController班? image中的$this->image是否来自protected $image

我想在迁移到Laravel框架之前我应该​​坚持使用常规PHP,因为虽然我可以轻松地浏览Laravel以创建一个有效的应用程序,但它似乎阻碍了我遵循最佳实践/架构的能力。 AFAIK控制器主要是操纵数据并将其发送到视图或数据库,我不明白为什么它是一个类?

对不起,我很困惑多个问题。我在codeacademy上自学了php,但是他们的类声明和对象实例很容易遵循,但事实并非如此。如果有人能够向我解释代码,那将非常有帮助。

谢谢!

1 个答案:

答案 0 :(得分:2)

  

我从不在我的路线中调用构造函数。它适用于postUpload()。这是否意味着没有目的?

创建控制器对象时会自动调用constructor

  

为什么构造函数在ImageRepository和$ imageRepository之间没有逗号......根据我对文档的理解,如果其中一个是布尔值,你只会这样做吗?

ImageRepository不是另一个论点。它是type hint(或在PHP 7中,类型声明

  

为什么$ response = $ this-&gt; image-&gt; upload($ photo);在postUpload()中意味着什么?那个函数upload()来自Repository,是否足够用,以便它知道该怎么做?

use是您的控制器能够使用ImageRepository所必需的。在使用$this->image = $imageRepository;的构造函数中将对象加载到对象后,您的控制器方法可以通过upload访问其方法(例如$this->image)。

  

为什么$ this-&gt;图像意味着什么,$ this引用了什么?

是的,$this确实引用了ImageController类。 PHP manual州:

  

The pseudo-variable $this is available when a method is called from within an object context. $this is a reference to the calling object

  

$ this-&gt;图片中的图片是否来自受保护的$ image?

protected $image设置控制器对象$image属性的visibility。它没有为物业分配任何东西;这是在构造函数中完成的。