【问题标题】:How to use Traits - Laravel 5.2如何使用特征 - Laravel 5.2
【发布时间】:2016-04-15 22:08:19
【问题描述】:

我是 Traits 的新手,但我的函数中有很多重复的代码,我想使用 Traits 使代码不那么混乱。我在我的Http 目录中创建了一个Traits 目录,其中包含一个名为BrandsTrait.php 的特征。它所做的只是呼吁所有品牌。但是当我尝试在我的产品控制器中调用 BrandsTrait 时,如下所示:

use App\Http\Traits\BrandsTrait;

class ProductsController extends Controller {

    use BrandsTrait;

    public function addProduct() {

        //$brands = Brand::all();

        $brands = $this->BrandsTrait();

        return view('admin.product.add', compact('brands'));
    }
}

它给了我一个错误,说 方法 [BrandsTrait] 不存在。我是要初始化某些东西,还是以不同的方式调用它?

这是我的BrandsTrait.php

<?php
namespace App\Http\Traits;

use App\Brand;

trait BrandsTrait {
    public function brandsAll() {
        // Get all the brands from the Brands Table.
        Brand::all();
    }
}

【问题讨论】:

    标签: php laravel laravel-5.2 traits


    【解决方案1】:

    考虑一下特性,例如在不同的地方定义你的类的一部分,它可以被许多类共享。通过将use BrandsTrait 放在您的班级中,它就有该部分。

    你要写的是

    $brands = $this->brandsAll();
    

    这是你的 trait 中方法的名称。

    另外 - 不要忘记在您的 brandsAll 方法中添加一个返回值!

    【讨论】:

    • 我可以通过继承来实现这一点,还有什么可以提供特征?
    • PHP 不支持多重继承,因此只允许您扩展单个类。但是,有了特征,您可以根据需要使用任意数量。
    • 此外,在考虑对象的结构时,继承确实应该保留给具有相似职责的对象。然而,Traits 只能用于 DRY 两个可能没有类似职责但类似方法的类。
    • @JoseRojas 是的,特征和继承可能看起来很相似。但是差异可以这样解释:Dog 类将由 Bulldog 和 Pug 类继承,但不会由 Ragdoll(它的猫品种)继承,尽管所有三个提到的类都可以使用特征“吃”。 :)
    【解决方案2】:
    use App\Http\Traits\BrandsTrait;
    
    class ProductsController extends Controller {
    
        use BrandsTrait;
    
        public function addProduct() {
    
            //$brands = Brand::all();
    
            $brands = $this->brandsAll();
    
            return view('admin.product.add', compact('brands'));
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-10
      • 2016-09-11
      • 2020-09-28
      • 1970-01-01
      • 2016-12-17
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多