artinict/laravel-customs

以更简洁的方式导入Laravel中的类。

v2.3 2019-03-12 11:47 UTC

This package is not auto-updated.

Last update: 2024-10-02 20:46:10 UTC


README

Laravel Customs Logo

Laravel Customs

LaravelCustoms (LC) 是一个提供更简洁方式导入您的类和第三方包的包。您可以这样理解:Composer管理您的依赖项,Customs规范您的导入。

LC 使用了一个名为 IOCA(一次性导入,任何地方调用)的概念。

如果您不想使用这个概念,LC 将会自动在运行时导入类。(见下文“自动解析”)

目录

  1. 安装
  2. 使用
  3. 一次性导入,任何地方调用(IOCA)
  4. Customs 配置
  5. 自动解析
  6. 致谢
  7. 许可证

安装

composer require artinict/laravel-customs
{
"require": {
      "php": ">=5.3.0"
    }
}    

如果安装成功,将在Laravel的 config 目录中创建一个 cusfiguration.php 文件。

注意:如果在 config 中找不到 cusfiguration.php,请将 cusfiguration.php$BASE_DIR.\vendor\artinict\laravel-customs\src\ 复制到 $BASE_DIR.\config\
或者
在您的任何类文件顶部导入 LaravelCustoms 并运行应用程序。现在检查 config 目录以查找 cusfiguration.php

使用

在您的类文件顶部将 LaravelCustoms 导入为 LC


use Artinict\LaravelCustoms as LC;

/*
instead of:
use App\Drinks\Pepsi;
use App\User;
...
*/

然后您可以通过以下方式访问 LaravelCustoms 实例


LC::Pepsi()::okurrr();

通用语法是 LC::[Prefix_]Classname('methodName', [args]);。以下是如何在实际项目中使用 LC 的示例。

通常,您会这样做

<?php

namespace App\Http\Controllers;


use App\Http\Controllers\Controller;
use Illuminate\Http\Request
use App\Repository\FlightRepository;
use App\Repository\PassengersRepository as PassRepo;
use App\Services\AirAPI;
...

class FlightController extends Controller
{
  
  public function index(Request $request)
  {
  
      $flight = FlightRepository::getFlightTo('Wakanda');
      $price = (new AirAPI)->getDiscountedPrice($flight, 'NGN'); 
      $user = App\User::all(); 
      
      $destination = $request->dest;

      //...
   
  }
  
}

但现在,使用 LaravelCustoms,您不必再导入多个类。相反,您只需导入一个类,如下所示

<?php

namespace App\Http\Controllers;


use Artinict\LaravelCustoms as LC;

use App\Http\Controllers\Controller; 
use Illuminate\Http\Request
/*But wait! Why did we still import these guys?🤨 [See next paragraph]*/

class FlightController extends Controller
{
  
  public function index(Request $request)
  {
  
      $flight = LC::Repository_Flight('::getFlightTo', 'Wakanda'); //for static methods
      $price = LC::Services_AirAPI('getDiscountedPrice', $flight, 'NGN'); //for non-static methods
      $user = LC::User()::all();
      
      $destination = $request->dest;

      //...
    }
  
}

好的!所以我相信你可能想知道为什么我们仍然需要写 use App\Http\Controllers\Controller;。好吧,从技术上讲,我们没有写这一行代码。当我们在命令行中运行 php artisan make:controller FlightController 命令时,Laravel为我们写了这一行代码。

一般来说,LaravelCustoms 不应该取代 Laravel 编写的默认类导入。

好吧!那关于 use Illuminate\Http\Request 呢?!遗憾的是,截至 v2.1,LC 无法支持依赖注入(DI)😬

通用用法示例:

  1. 对于非静态方法
    LC::Prefix_Classname(['methodName'], [args]);
Example:
LC::Services_AirAPI('getDiscountedPrice', $flight, 'NGN');

is equivalent to:
(new App\Services\AirAPI)->getDiscountedPrice($flight, 'NGN');

  1. 对于静态方法,将 :: 放在 methodName 前面
    LC::Prefix_Classname(['::methodName'], [args]);
Example:
LC::Facades_View('::make', 'path.to.view'); 
 OR
LC::Facades_View()::make('path.to.view');

is equivalent to:
Illuminate\Support\Facades\View::make('path.to.view');

  1. 不使用“前缀”调用非静态方法
    LC::Classname(['methodName'], [args]);
Example:
LC::User('getName');

is equivalent to:
(new App\User)->getName();

  1. 获取类的非静态属性
    $classInstance = LC::Classname();
    $property = (new $classInstance)->propertyName;
Example: 
$flight = LC::Flight();
$property = (new $flight)->category;
     
is equivalent to:
$property = (new App\Flight)->$category;

/*Honestly, i hardly use LC to reach for non-static properties😁*/

  1. 获取类的静态属性
    LC::Classname()::$staticProperty;
Example:
LC::Flight()::$category;

is equivalent to:
App\Flight::$category;

  1. 最后,如果不传递任何参数,LaravelCustoms 将返回类路径。
Example:
return LC::User(); 

will return App\User

一次性导入,任何地方调用(IOCA)

LaravelCustoms 的一个目标是消除每次需要时都重复导入类的需求。LC 通过使用一个名为 IOCA(一次性导入,任何地方调用)的新概念,以更干净的方式实现这一点。

在提供的 customs 配置文件中定义您的导入(见下一节)。

使用别名导入

别名是导入类的一种简单方式。这对于您的模型和其他不太可能发生类名冲突的类来说非常合适。

[
      "Alias" => Namespace\Classname::class
],

例如,App\UserFlightModel.php 可以导入为

[
      "UFModel" => App\UserFlight::class
],

这将调用为 LC::UFModel();

使用前缀导入

前缀是导入类的一种更干净的方式。它将一组类分组到一个类别(称为前缀)中。这有助于减轻类名冲突。

[
      "Prefix" => [
      
            "Alias" => Namespace\Classname::class,  
      ],
],

例如,App\Repository\FlightRepository.php 可以导入为

[
      "Repo" => [
      
            "Flight" => App\Repository\Flight::class,
      
      ],
   ],

这将调用为 LC::Repo_Flight();

Customs 配置

当您安装LaravelCustoms包时,将在Laravel的config目录下创建一个cusfiguration.php文件。这就是您使用别名和前缀导入类的地方(确保您阅读下面的cusfiguration.php,以便熟悉规范)。

<?php


/*
|--------------------------------------------------------------------------
| APP NAME
|--------------------------------------------------------------------------
|
| When you run php artisan app:name, you have to come here and change it manually.
| The default base namespace is 'App'
|
*/

$APP_NAME = 'App\\';

return [

    /*
    |--------------------------------------------------------------------------
    | User-defined Imports
    |--------------------------------------------------------------------------
    |
    | This is where you should define all your local Classes, Models, Third-party Packages (See Vendor prefix below), etc.
    | Imports defined here overwrites the Laravel Customs automatic imports.Imports must be defined in the format:
    | 'Alias' => $APP_NAME\Classname::class,
    |
    | Note: User defined imports can get really messy in large Apps. Best practice is to use Prefix (See below).
    |
    */

    'User' => $APP_NAME.\User::class,


    /*
    |--------------------------------------------------------------------------
    | User-defined Imports using Prefix
    |--------------------------------------------------------------------------
    |
    | Prefixes provide a cleaner way to define your import.
    | It also helps to reduce key name conflict. Prefixes must be defined in the format:
    | 'Prefix' => [
    |                 'Alias' => $APP_NAME\Classname::class,
    |              ],
    |
    */

    'Repository' => [
    
            'Flights' => App\Repository\Flights::class,
            
    ],

    'Services' => [
    
            'AirAPI' => App\Services\AirAPI::class,

    ],

    'Packages' => [

        'Carbon' => Carbon\Carbon::class,

    ],

    /*
    |--------------------------------------------------------------------------
    | Laravel's defined Imports
    |--------------------------------------------------------------------------
    |
    | This is where laravel's packages are defined.
    | You might almost never need to change anything here. Ensure your User-defined prefix doesn't clash with Laravels'.
    |
    */

    'Facades' => [

        'App' => Illuminate\Support\Facades\App::class,
        'Artisan' => Illuminate\Support\Facades\Artisan::class,
        'Auth' => Illuminate\Support\Facades\Auth::class,
        'Blade' => Illuminate\Support\Facades\Blade::class,
        'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
        'Bus' => Illuminate\Support\Facades\Bus::class,
        'Cache' => Illuminate\Support\Facades\Cache::class,
        'Config' => Illuminate\Support\Facades\Config::class,
        'Cookie' => Illuminate\Support\Facades\Cookie::class,
        'Crypt' => Illuminate\Support\Facades\Crypt::class,
        'DB' => Illuminate\Support\Facades\DB::class,
        'Eloquent' => Illuminate\Database\Eloquent\Model::class,
        'Event' => Illuminate\Support\Facades\Event::class,
        'File' => Illuminate\Support\Facades\File::class,
        'Gate' => Illuminate\Support\Facades\Gate::class,
        'Hash' => Illuminate\Support\Facades\Hash::class,
        'Lang' => Illuminate\Support\Facades\Lang::class,
        'Log' => Illuminate\Support\Facades\Log::class,
        'Mail' => Illuminate\Support\Facades\Mail::class,
        'Notification' => Illuminate\Support\Facades\Notification::class,
        'Password' => Illuminate\Support\Facades\Password::class,
        'Queue' => Illuminate\Support\Facades\Queue::class,
        'Redirect' => Illuminate\Support\Facades\Redirect::class,
        'Redis' => Illuminate\Support\Facades\Redis::class,
        'Request' => Illuminate\Support\Facades\Request::class,
        'Response' => Illuminate\Support\Facades\Response::class,
        'Route' => Illuminate\Support\Facades\Route::class,
        'Schema' => Illuminate\Support\Facades\Schema::class,
        'Session' => Illuminate\Support\Facades\Session::class,
        'Storage' => Illuminate\Support\Facades\Storage::class,
        'URL' => Illuminate\Support\Facades\URL::class,
        'Validator' => Illuminate\Support\Facades\Validator::class,
        'View' => Illuminate\Support\Facades\View::class,

    ],

    'Support' => [

          'AggregateServiceProvider' => Illuminate\Support\AggregateServiceProvider::class,
          'Arr' => Illuminate\Support\Arr::class,
          'Carbon' => Illuminate\Support\Carbon::class,
          'Collection' => Illuminate\Support\Collection::class,
          'Composer' => Illuminate\Support\Composer::class,
          'Fluent' => Illuminate\Support\Fluent::class,
          'HigherOrderCollectionProxy' => Illuminate\Support\HigherOrderCollectionProxy::class,
          'HigherOrderTapProxy' => Illuminate\Support\HigherOrderTapProxy::class,
          'HtmlString' => Illuminate\Support\HtmlString::class,
          'InteractsWithTime' => Illuminate\Support\InteractsWithTime::class,
          'Manager' => Illuminate\Support\Manager::class,
          'MessageBag' => Illuminate\Support\MessageBag::class,
          'NamespacedItemResolver' => Illuminate\Support\NamespacedItemResolver::class,
          'Optional' => Illuminate\Support\Optional::class,
          'Pluralizer' => Illuminate\Support\Pluralizer::class,
          'ProcessUtils' => Illuminate\Support\ProcessUtils::class,
          'ServiceProvider' => Illuminate\Support\ServiceProvider::class,
          'Str' => Illuminate\Support\Str::class,

    ],

    /*
    |--------------------------------------------------------------------------
    | LaravelCustoms Aliases & Packages
    |--------------------------------------------------------------------------
    |
    | This is where LaravelCustoms aliases and packages are defined.
    | DO NOT OVERWRITE.
    |
    */

    'LC_APP_NAMESPACE' => $APP_NAME,

];

注意:LC_APP_NAMESPACE是一个保留的键名,不得被覆盖。

自动解析

如果您调用了在cusfiguration.php中未导入的类。LaravelCustoms将自动扫描app目录以找到该类并动态导入。如果类不存在,将抛出异常。

这种做法在大型项目中不推荐使用。

致谢

萨迪克·卢克曼,Artinict。
https://twitter.com/28thsly

许可证

LaravelCustoms库是开源软件,遵循MIT许可协议