【问题标题】:Where to place traits in Laravel 5?在 Laravel 5 中的哪里放置特征?
【发布时间】:2015-05-11 13:05:09
【问题描述】:

我正在使用 Laravel 5,我对在 Laravel 5 目录结构中放置特征文件的位置感到困惑。它们应该存在于公共、资源或任何其他目录中吗?

【问题讨论】:

    标签: php laravel-5 traits


    【解决方案1】:

    在放置方面,您应该将特征视为类。这意味着将它们放在app 目录中。您将特征放在哪里取决于您的偏好和特征的实际目的。

    重要的是您将特征的命名空间调整为目录结构。例如,如果您的 trait 与您的控制器有关,并且您决定将其放在 app/Http/Controllers 文件夹中,那么请确保它具有正确的命名空间,即:

    namespace App\Http\Controllers;
    

    【讨论】:

    • 这应该被标记为正确答案。在为模型创建特征时,我遵循相同的约定。
    【解决方案2】:

    你可以把特质放在任何你想要的地方。但就放置而言,您应该将 trait 的命名空间调整为目录结构。

    例如:你想创建一个 Traits 目录Traits >> SayHello.php

    app >> Http >> Controllers >> Traits >> SayHello.php

      <?php
      namespace App\Http\Controllers\Traits; 
    
      trait SayHello{
            public function hello()
            {
                  return "Hello";
            }
      }
    

    app >> Http >> Controllers >> HomeController.php

      <?php
      namespace App\Http\Controllers; 
    
      use App\Http\Requests;
      use Illuminate\Http\Request;
      use App\Http\Controllers\Traits\SayHello;
    
      class HomeController extends Controller {
    
            use SayHello;
    
            public function index()
            {
                  // Called SayHello trait hello method
                  return $this->hello();
            }
      }
    

    【讨论】:

      【解决方案3】:

      我更喜欢在应用程序中创建一个名为 Traits 的目录。 这将增强代码库的可读性和可维护性。

      例子:

      namespace App\Traits;
      
      use Exception;
      use Illuminate\Http\Request;
      
          trait myTrait {
          //your code here
          }
      

      【讨论】:

        【解决方案4】:

        存储特征

        为方便起见,在app 下创建一个名为Traits 的目录,并将我的自定义PHP 文件放在那里。每个文件都使用 Trait 的名称进行逻辑关联。通过在每个文件中使用 App/Traits 命名空间,当我在另一个文件中 use 时,框架能够找到我的文件。

        示例使用代码:

        <?php
        namespace AppJobs;
        
        use App/Jobs/Job;
        
        use App/Traits/ExampleCode;
        
        /**
         *  brief Example code using a Trait in a Laravel "Job"
         */
        class AdminLoginJob extends Job implements SelfHandling
        {
            use ExampleCode;
        
            /**
             * Call trait to print something. Note the use of "$this".
             * 
             * @return void
             */
            public function __construct()
            {
                $this->printThis();
            }
           /**
             * Do more stuff here.
             * 
             * @return void
             */
             public function handle()
            {
                // never gets called in this example.
            }
        }
        

        【讨论】: