在Laravel中将课程放在哪里?

时间:2019-01-25 14:31:23

标签: php laravel laravel-5.7

我正在做我的第一个项目,试图学习Laravel,现在我要创建对象了。

我已经创建它并对其进行了尝试,并且它可以按我的意愿工作,但是我应该放在哪里?到目前为止,它直接位于我的控制器中,但是感觉不正确,此外,我认为它使代码混乱。您实际上应该放在哪里?有这样的地方吗?

这是我的代码的外观,如您所见,它被称为“主机”,它位于页面顶部:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;


class Host {
    public $ipv4, $mac;

    public function __construct($ipv4, $mac){
        $this->ipv4 = $ipv4;
        $this->mac = $mac;
    }
}

class PagesController extends Controller
{
    public function index(){

        libxml_use_internal_errors(true); //ignore invalid HTML tag warnings
        $dom = new \DOMDocument();
        // Check that there's actually a file to load 
        if(!$dom->loadHTMLFile('\\\192.168.1.201\root\test.xml')){
            die('error loading xml');
        }

        // Loop through all <host> tags
        foreach ($dom->getElementsByTagName('host') as $hostKey => $host) {
            $hostAttributes = array();
            // Check for <address> tags and loop through them as well
            foreach ($host->getElementsByTagName('address') as $addressKey => $addressValue) {
                // Check that there is an <addrtype> and <addr> tag
                if($addressValue->getAttribute('addrtype') && $addressValue->getAttribute('addr')){
                    // Put that into the array $hostAttributes
                    $hostAttributes[$addressValue->getAttribute('addrtype')] = $addressValue->getAttribute('addr');
                }
            }
            // Check for the keys 'ipv4' and 'mac' in $hostAttributes
            if(array_key_exists('ipv4', $hostAttributes) && array_key_exists('mac', $hostAttributes)) {
                $hosts[$hostKey] = new Host($hostAttributes['ipv4'], $hostAttributes['mac']);
            }
        }

        // set data
        $data = [
            'hosts' => $hosts
        ];

        // return view
        return view('pages.index')->with('data', $data);
    }
}

该文件位于“ /app/Http/Controllers/PagesController.php”中,我正在运行Laravel 5.7.21

2 个答案:

答案 0 :(得分:3)

如果有帮助,我通常会像这样构建Laravel应用:

  • 应用
    • 核心 (共享应用范围内的资料)
      • 控制台
        • Kernel.php
        • 命令
          • SomeCommand.php
      • Http
        • Kernel.php
        • routes.php (拉入所有路由文件)
        • 中间件
          • ... (Laravel中间件)
        • 请求
          • ... (所有核心请求基类)
        • 控制器
          • Controller.php
      • 服务
        • APIService.php
      • 提供商
        • AppServiceProvider.php
        • ... (其余Laravel提供者)
      • 例外
        • Handler.php
      • 存储库
        • EloquentRepository.php
      • helpers.php(通常我在这里有一个辅助文件)
    • (业务逻辑资料)
      • 用户
        • User.php (用户模型)
        • Http
          • routes.php
          • 控制器
            • UserController.php
        • 请求
          • NewUserRequest.php
    • 部门
      • Division.php (另一个模型)
      • Http
        • routes.php
        • 控制器
          • DomainController.php

为了简洁起见,我显然省去了一些东西,但是您明白了。

我的PSR-4定义最终看起来像:

"autoload": {
  ...
  "files": [
    "app/Core/helpers.php"
  ],
  "psr-4": {      
    "App\\": "app/Domain/",
    "Core\\": "app/Core/"
  }
  ...
}

要像这样修改Laravel的结构,还需要使用新的命名空间以及从默认Laravel安装中移出的所有文件来更新bootstrap/app.php文件。

使用上面的结构,并取决于此新对象将要执行的操作,您应该清楚地知道位置。您甚至可以为该类的 Models 文件夹,例如 User 。或者,只要将新类与用户相关,就将其直接放置在 User.php 模型旁边。

它可能看起来像这样:

<?php namespace App\User;

class SomeClassName {
  ...
}

然后,例如从 UserController.php 引用:

<?php namespace App\User;

use Core\Http\Controllers\Controller;
use App\User\SomeClass;

class UserController extends Controller {

    public function __constructor(SomeClass $someClass)
    {
        $this->someClass = $someClass; 
    }
}

所有假设,但希望能使您指向正确的方向。

答案 1 :(得分:2)

您应该使用namespaces并创建一个对您和您的要求有意义的名称空间和目录结构。 例如,您可以在Helpers目录中创建一个名为BusinessLogicapp的目录或其他任何目录。然后将您的类放在适当的名称空间中,例如对于目录Helpers,名称空间为App\Helpers

这是在composer PSR 4自动加载中设置的。在这些文章中结帐 PHP自动加载 PSR 4


使用PSR-4自动加载的示例

将类放在以下结构中

  • 应用
    • 助手
      • Host.php

然后将其导入为您的控制器类

<?php

namespace App\Http\Controllers;

use App\Helpers\Host;
use Illuminate\Http\Request;

class PagesController extends Controller
{
...
...
            if(array_key_exists('ipv4', $hostAttributes) && array_key_exists('mac', $hostAttributes)) {
                $hosts[$hostKey] = new Host($hostAttributes['ipv4'], $hostAttributes['mac']);
            }
...
...