artinict / laravel-customs
以更简洁的方式导入Laravel中的类。
Requires
- php: ^5.5.9 || ^7.0
- illuminate/auth: 5.1.* || 5.2.* || 5.3.* || 5.4.* || 5.5.* || 5.6.* || 5.7.* || 5.8.*
- illuminate/contracts: 5.1.* || 5.2.* || 5.3.* || 5.4.* || 5.5.* || 5.6.* || 5.7.* || 5.8.*
- illuminate/http: 5.1.* || 5.2.* || 5.3.* || 5.4.* || 5.5.* || 5.6.* || 5.7.* || 5.8.*
- illuminate/support: 5.1.* || 5.2.* || 5.3.* || 5.4.* || 5.5.* || 5.6.* || 5.7.* || 5.8.*
This package is not auto-updated.
Last update: 2024-10-02 20:46:10 UTC
README
Laravel Customs
LaravelCustoms (LC) 是一个提供更简洁方式导入您的类和第三方包的包。您可以这样理解:Composer管理您的依赖项,Customs规范您的导入。
LC 使用了一个名为 IOCA(一次性导入,任何地方调用)的概念。
如果您不想使用这个概念,LC 将会自动在运行时导入类。(见下文“自动解析”)
目录
安装
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)😬
通用用法示例:
- 对于非静态方法
LC::Prefix_Classname(['methodName'], [args]);
Example:
LC::Services_AirAPI('getDiscountedPrice', $flight, 'NGN');
is equivalent to:
(new App\Services\AirAPI)->getDiscountedPrice($flight, 'NGN');
- 对于静态方法,将
::放在 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');
- 不使用“前缀”调用非静态方法
LC::Classname(['methodName'], [args]);
Example:
LC::User('getName');
is equivalent to:
(new App\User)->getName();
- 获取类的非静态属性
$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😁*/
- 获取类的静态属性
LC::Classname()::$staticProperty;
Example:
LC::Flight()::$category;
is equivalent to:
App\Flight::$category;
- 最后,如果不传递任何参数,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许可协议。