【问题标题】:Defining methods which can be used in multiple controllers (in short library) in laravel 5在 laravel 5 中定义可用于多个控制器(简称库)的方法
【发布时间】:2016-06-08 15:33:40
【问题描述】:

我想定义一些可以在多个地方或多个控制器中使用的方法。基本上,这些方法就像执行多个查询的库。

我的主要目的是通过创建一些库来避免多次编写通用逻辑。

请帮帮我。

提前致谢:)

【问题讨论】:

    标签: php laravel laravel-5.2 dry


    【解决方案1】:

    很简单,在 app 文件夹中构建自己的库,然后创建新文件 MyLibrary.php

    namespace App;
    
    Class MyLibrary {
    
        public static function sum($a, $b) {
            return $a + $b;
        }
    
    }
    

    然后在您的 config/app.php 中创建别名

    'MyLibrary'      => App\MyLibrary::class,
    

    最后你可以在你的控制器的任何地方调用它

    $result = MyLibrary::sum(4, 5); // your $result now have value of 9
    

    【讨论】:

      【解决方案2】:

      取决于你想做什么。以下是一些选项:

      默认情况下,您的所有控制器都扩展 App\Http\Controllers\Controller 类。只需将控制器之间的所有共享逻辑放在那里即可。

      对于数据库的复杂查询,您可以创建一个存储库并注入控制器。

      class UserRepository {
          public function getActiveUsers() {
              return Users::with('role')
                  ->where('...')
                  ->someQueryScopes()
                  ->anotherQueryScope()
                  ->yetAnotherScope();
          }
      }
      
      class SomeController extends Controller {
          public function index(UserRepository $repository) {
              $users = $repository->getActiveUsers();
              return view('users.index')->withUsers($users);
          }
      }
      

      另一种选择是为业务逻辑创建一个服务类并将它们注入构造函数或相关方法中

       class UserCreatorService {
          public function create($email, $password){
              $user = User::create(['email' => $email, 'password' => $password]);
              $user->addRole('Subscriber');
              Event::fire(new UserWasCreated($user));
              return $user;
          }
      }
      
      class RegisterController extends Controller {
          public function store(Request $request, UserCreatorService $service) {
              $user = $service->create($request->input('email'), $request->input('password'));
              return view('home')->withUser($user);
          }
      }
      

      【讨论】:

      • 存储库示例已在此处记录:laravel.com/docs/5.2/…
      • 感谢scrubmx 和@Hafez,我使用了存储库,这就像一个魅力:)
      【解决方案3】:

      您可以创建一个名为 lib 的文件夹,其中包含一个 functions.php 文件和 composer.json

      ...
      "autoload": {
          "files": [
            "app/lib/functions.php"
          ],
      ...
      

      然后运行 ​​composer dump-autoload

      【讨论】:

        【解决方案4】:

        使用辅助类并在其中创建通用函数。

        在 app 文件夹中创建一个名为 helper 的文件夹,并在其中创建一个 helper 类。然后根据需要在多个控制器或视图中使用该辅助类的功能。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-06
          • 2016-05-20
          • 2015-08-02
          • 2018-01-12
          • 1970-01-01
          • 2019-08-13
          相关资源
          最近更新 更多