Где поставить классы в Laravel? - PullRequest
0 голосов
/ 25 января 2019

Я делаю свой первый проект, пытаясь выучить 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 голосов
/ 25 января 2019

Если это полезно, я обычно структурирую свои приложения Laravel следующим образом:

  • приложение
    • Core (Широко распространенное приложение)
      • Консоль
        • Kernel.php
        • Команда
          • SomeCommand.php
      • Http
        • Kernel.php
        • rout.php (извлекает все файлы маршрутов)
        • Middleware
          • ... (Промежуточное ПО Laravel)
        • Запросы
          • ... (все базовые классы базовых запросов)
        • Контроллеры
          • Controller.php
      • Услуга
        • APIService.php
      • Поставщики
        • AppServiceProvider.php
        • ... (Остальные провайдеры Ларавеллы)
      • Исключения
        • handler.php
      • Хранилища
        • EloquentRepository.php
      • helpers.php (Обычно у меня есть файл помощников)
    • Домен (Business Logic Stuff)
      • Пользователь
        • 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, подобной этой, также требуется обновить файл bootstrap/app.php новыми пространствами имен, а также любые файлы, которые вы перемещаете из установки Laravel по умолчанию.

Используя приведенную выше структуру и в зависимости от того, что будет делать этот новый объект, вам должно быть совершенно ясно, где вы бы поместили его. Вы можете даже создать папку 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; 
    }
}

Все гипотетически, но, надеюсь, вас направят в правильном направлении.

0 голосов
/ 25 января 2019

Вы должны использовать namespaces и создать пространство имен и структуру каталогов, которые имеют смысл для вас и ваших требований.Например, вы можете создать каталог с именем Helpers или BusinessLogic или что-нибудь еще в каталоге app.Затем поместите ваши классы туда с правильным пространством имен, например, для каталога Helpers, пространство имен будет App\Helpers.

Это настраивается в автозагрузке PSR 4 композитора.Оформить заказ Автозагрузка в PHP и PSR 4 в этих статьях


Пример использования автозагрузки PSR-4

Поместите класс в следующую структуру

  • app
    • Помощники
      • 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']);
            }
...
...    

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...