我正在做我的第一个项目,试图学习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
答案 0 :(得分:3)
如果有帮助,我通常会像这样构建Laravel应用:
为了简洁起见,我显然省去了一些东西,但是您明白了。
我的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
目录中创建一个名为BusinessLogic
或app
的目录或其他任何目录。然后将您的类放在适当的名称空间中,例如对于目录Helpers
,名称空间为App\Helpers
。
这是在composer PSR 4自动加载中设置的。在这些文章中结帐 PHP自动加载和 PSR 4
将类放在以下结构中
然后将其导入为您的控制器类
<?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']);
}
...
...