我应该把这段代码放在 Laravel 的啥地方?

Posted

技术标签:

【中文标题】我应该把这段代码放在 Laravel 的啥地方?【英文标题】:Where should I put this code in Laravel?我应该把这段代码放在 Laravel 的什么地方? 【发布时间】:2014-06-26 09:52:39 【问题描述】:

我正在使用 Laravel4 构建一个网站。这是我的第一个 Laravel 项目,所以我仍在学习如何将所有内容组合在一起以及它们应该去哪里。

我刚刚将Laravel-Mandrill-Request 捆绑包添加到我的网站。我可以从我的测试控制器中的方法发送电子邮件,如下所示:

public function sendMeSomething()
    $payload = array(
        'message' => array(
            'subject' => 'Greetings!!',
            'from_email' => 'xxxx@yyyy.com',
            'to' => array(
                array('email'=>'aaaa@bbbb.com'),
                array('email' => 'cccc@bbbb.com')
                ),
            'global_merge_vars' => array( 
                array(
                    'name' => 'time', 
                    'content' => time()
                    ), 
                array(
                    "name" => "SenderName", 
                    "content" => "Chris"
                    )
                ),
            'merge_vars' => array(
                array(
                    'rcpt' => 'aaaa@bbbb.com',
                    'vars' => array(
                        array(
                            'name' => 'firstName',
                            'content' => 'Christopher'
                            )
                        )
                    ),
                array(
                    'rcpt' => 'cccc@bbbb.com',
                    'vars' => array(
                        array(
                            'name' => 'firstName',
                            'content' => 'Chris!'
                            )
                        )
                    )
                )
        ),
        'template_name' => "sk-hello",
        'template_content' => array(
            array(
                'greetings' => 'why hello!'
                )
            )
    );
    $result = Mandrill::request('messages/send-template', $payload);
    return "check your email. result: " . var_dump($result);

在测试中一切都很好,所以现在我准备开始将它构建到我的实际站点工具中。

我想通过构建一个动态构建有效负载变量的方法来对其进行一点抽象。

我的问题是,将这段代码放在哪里合适?它似乎不应该在它自己的控制器中,因为它是一个可以从其他控制器的不同位置调用的工具。它不是仅与我的数据库中的表交互的东西,所以它看起来不应该是一个模型。我应该为它创建一个外观吗?这门课应该去哪里?

【问题讨论】:

【参考方案1】:

创建一个服务,假设Mailer 在您的控制器或其他服务中以这种方式使用它:

Mailer::send('emails.greetings', 'Welcome!', $user->email);

你需要:

您的基本服务类 (Mailer.php) 服务提供者 (MailerServiceProvider.php) 门面 (MailerFacade.php)

看看这篇文章:http://fideloper.com/create-facade-laravel-4

您可以为您的服务创建文件夹,如下所示:

app
│   └── App
│       └── Services
│            └── Mailer
│                ├── Mailer.php
│                ├── MailerServiceProvider.php
│                └── MailerFacade.php

并命名它们:

<?php namespace App\Services;

并使用 PSR-4 通过命名空间自动加载您的类,但将其添加到您的 composer.json:

"autoload": 
    "psr-4": 
        "App\\": "app/App",
    ,
,

并执行

composer dumpautoload

【讨论】:

太棒了,感谢您的建议和链接。这个解释比我自己找到的许多解释要清晰和简洁得多。还有一个问题:如果我做了所有这些,我应该把文件放在哪里?我应该为它创建自己的供应商文件夹还是应该把它们放在其他地方? 完美!我希望我能给你第二个复选标记:) 应该将MailerFacade.php 文件放在名为Facades 的子文件夹中吗?链接中的博客将 Facade 文件的命名空间显示为 namespace Fideloper\Example\Facades;,而其他两个文件的命名空间为 namespace Fideloper\Example;。我的网站正在查找服务提供者类,但是当我尝试从 Mailer::sayHi() 触发测试方法时收到错误消息 Class 'App\Services\Mailer\MailerFacade' not found

以上是关于我应该把这段代码放在 Laravel 的啥地方?的主要内容,如果未能解决你的问题,请参考以下文章

我应该将瞬态域类放在 grails 应用程序中的啥位置?

将迁移放在 Laravel 5.1 包中的啥位置?

我应该将前端代码放在我的后端项目中的啥位置以及如何/何时运行它?

我应该将 Angular 代码放在这个 Mean.js 应用程序中的啥位置以使该列表可排序?

如何上传文件(Laravel)

我应该将 SQL 文件放在我的 Java 项目中的啥位置?