PHP code example of crastlin / laravel-annotation_v2

1. Go to this page and download the library: Download crastlin/laravel-annotation_v2 library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

crastlin / laravel-annotation_v2 example snippets


namespace App\Http\Controllers\Portal;
use \Illuminate\Routing\Controller;
use Crastlin\LaravelAnnotation\Annotation\Attributes\Route;

#[Controller]
class IndexController extends \Illuminate\Routing\Controller
{
     #[Route("index")]
     function home()
     {
        // todo
     }
}

Route::controller(App\Http\Controllers\Portal\IndexController::class)->group(function(){
  Route::any('index', 'home')->name('index');
});

namespace App\Http\Controllers\Portal;
use \Illuminate\Routing\Controller;
use Crastlin\LaravelAnnotation\Annotation\Attributes\Route;
use Crastlin\LaravelAnnotation\Enum\Method;

#[Controller]
class IndexController extends \Illuminate\Routing\Controller
{
     #[Route("index", method: Method::POST)]
     function home()
     {
        // todo
     }
}


#[Controller]
class IndexController extends \Illuminate\Routing\Controller
{
     #[PostMapping("index")]
     function home()
     {
        // todo
     }
}

Route::controller(App\Http\Controllers\Portal\IndexController::class)->group(function(){
  Route::post('index', 'home')->name('index');
});

 #[Group("api")]
 #[Controller]
 class IndexController extends \Illuminate\Routing\Controller
{
     #[PostMapping("index")]
     function home()
     {
        // todo
     }
     
     #[PostMapping("article")]
     function news()
     {
        // todo
     }
}

Route::prefix('api')
 ->controller(App\Http\Controllers\Portal\IndexController::class)->group(function(){
  Route::post('index', 'home')->name('api.home');
  Route::post('article', 'news')->name('api.news');
 });

 #[Group("api", middleware: "checker")]
 #[Controller]
 class IndexController extends \Illuminate\Routing\Controller
{
     #[PostMapping("index")]
     function home()
     {
        // todo
     }
     
     #[PostMapping("article")]
     function news()
     {
        // todo
     }
}

// 在App\Http\Kernel.php中的属性:$routeMiddleware 配置 中间件映射
protected $routeMiddleware = [
  'checker' => \App\Http\Middleware\Checker::class,
];

Route::prefix('api')
->middleware(array (
  0 => 'checker',
))
 ->controller(App\Http\Controllers\Portal\IndexController::class)->group(function(){
  Route::post('index', 'home')->name('api.home');
  Route::post('article', 'news')->name('api.news');
 });

 #[Group("api")]
 #[Middleware([\App\Http\Middleware\Check::class, \App\Http\Middleware\ParamFilter::class])]
 #[Controller]
 class IndexController extends \Illuminate\Routing\Controller
{
     #[PostMapping("index")]
     function home()
     {
        // todo
     }
     
     #[PostMapping("article")]
     function news()
     {
        // todo
     }
}


 #[Group("api", middleware: "checker")]
 #[Domain("xxx.com")]
 #[Controller]
 class IndexController extends \Illuminate\Routing\Controller
{
     #[PostMapping("index")]
     function home()
     {
        // todo
     }
     
     #[PostMapping("article")]
     function news()
     {
        // todo
     }
}


return [
  'route' => [ 
      // .....
      'root_group' => [
         // 用户模块
         'User' => ['prefix' => 'user', 'domain' => 'user.xxx.com', 'middleware' => 'user.check'],          
         // 管理后台
         'Admin' => ['prefix' => 'admin', 'domain' => 'admin.xxx.com', 'middleware' => 'admin.check']
         ], 
         // ... 更多模块
     ],
     // ....
];

 #[ResourceMapping("product")]
 #[Controller]
 class IndexController extends \Illuminate\Routing\Controller implements ResourceInterface
{
     function index()
    {

        var_dump("=== is index cate ===");
    }

    function create()
    {
        var_dump("=== is create cate ===");
    }

    function store()
    {
        var_dump("=== is store cate ===");
    }

    function show(int $id)
    {
        var_dump("=== is show cate {$id} ===");
    }

    function edit(int $id)
    {
        var_dump("=== is edit cate {$id} ===");
    }

    function update(int $id)
    {
        var_dump("=== is update cate {$id} ===");
    }

    function destroy(int $id)
    {
        var_dump("=== is destroy cate {$id} ===");
    }
}



#[Tree("首页")]
#[Controller]
class IndexController
{

     #[Node("数据")]
     #[PostMapping("data_list")]
     function dataList()
     {
        // todo
     }
     
     #[Node("新闻")]
     #[PostMapping("articles")]
     function newsList()
     {
        // todo
     } 
}

#[Tree("首页")]
#[Controller]
class IndexController extends \Illuminate\Routing\Controller
{

     #[Node("数据")]
     #[PostMapping("data")]
     function dataList()
     {
        // todo
     }
     
     #[Node(name: "数据详情", parent: "dataList")]
     #[PostMapping]
     function detail()
     {
      // todo
     }
     
     #[Node("新闻")]
     #[PostMapping("articles")]
     function newsList()
     {
        // todo
     } 
     
     #[Node("新闻详情", parent: "newsList")]
     #[PostMapping("article")]
     function news()
     {
        // todo
     } 
}

 #[Tree("动物园")]
 abstract class Animal extends \Illuminate\Routing\Controller
 {
   #[Node("主页", isMenuNode: true)] 
   #[PostMapping] 
   function index()
   {
     // todo
   }
   
   #[Node("观看时间", isMenuNode: true)]
   #[PostMapping]
   function schedule()
   {
     // todo
   }
 }
 
 #[Tree("长颈鹿", preNamedSubMethods: "index,schedule")]
 #[Controller]
 class GiraffeController extends Animal
 {

 }

 #[Tree("老虎", preNamedSubMethods: "index,schedule")]
 #[Controller]
 class TigerController extends Animal
 {

 }

#[Tree("首页")]
#[Controller]
class IndexController extends \Illuminate\Routing\Controller
{

     #[Node("数据")]
     #[PostMapping("data_list")]
     function dataList()
     {
        // todo
     }
     
     #[Node("新闻")]
     #[PostMapping("articles")]
     function newsList()
     {
        // todo
     } 
     
     #[SyncLock(suffix: "{post.id}")]
     #[Node("更新", parent: "newsList")]
     #[PostMapping]
     function updateNews()
     {
        // todo
     }
}

#[Controller]
class IndexController extends \Illuminate\Routing\Controller
{

    #[Validation(field: "message",rule: "

namespace App\Http\Controllers\Portal;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
 #[Controller]
 class IndexController extends \Illuminate\Routing\Controller
 { 
    #[PostMapping("submitMsg")]
    function saveMessage(Request $request)
    {
       $validator = Validator::make($request->all(), [
         'message' => '

#[Controller]
class IndexController extends \Illuminate\Routing\Controller
{

    #[Validation(rules: [
        "username" => [".alpha_dash' => ":attribute只能是大小写字母、数字或下划线",
        'message.

namespace App\Validate;
use Crastlin\LaravelAnnotation\Extra\Validate;
class MessageCheck extends Validate
{
   protected array $rules = [
        "username" => ["   
   protected function checkSafeTags() :bool
   {
      if(str_contains($this->data['message'],'<script'))
        return false;
      return true;  
   }
}

namespace App\Http\Controllers\Portal;
use Crastlin\LaravelAnnotation\Extra\Validate;
#[Controller]
class IndexController extends \Illuminate\Routing\Controller
{

    #[Validation(class: \App\Validate\MessageCheck::class)]
    #[PostMapping("submitMsg")]
    function saveMessage()
    {
       // todo
    }
}

namespace App\Http\Controllers\Portal;
use Crastlin\LaravelAnnotation\Extra\Validate;
#[Controller]
class IndexController extends \Illuminate\Routing\Controller
{
    #[PostMapping("submitMsg")]
    function saveMessage(Request $request)
    {
       $validate = Validate::make(\App\Validate\MessageCheck::class, $request->all());
       if($validate->fails())
         return ['code' => 500, 'msg' => $validate->errors()->first()];
         
         // todo
    }
}

namespace App\Http\Controllers\Portal;
use Crastlin\LaravelAnnotation\Extra\Validate;
#[Controller]
class IndexController extends \Illuminate\Routing\Controller
{
    #[PostMapping("submitMsg")]
    function saveMessage(Request $request)
    {
       $validate = new class extends Validate{
          protected array $rules = [
            "username" => [";  
          }
       };
       $validator = $validate->setData($request->all())->validate();
       if($validator->fails())
         return ['code' => 500, 'msg' => $validator->errors()->first()];
         
         // todo 
    }
}

namespace App\Http\Controllers\Portal;

use Crastlin\LaravelAnnotation\Attributes\Validation\Required;
use Crastlin\LaravelAnnotation\Attributes\Validation\Regex;
#[Controller]
class IndexController extends \Illuminate\Routing\Controller
{

    #[Required("username", attribute: "用户名")]
    #[Regex("username", ruleValue: "~^\w+$~", attribute: "用户名")]
    #[Required("message", attribute: "留言")]
    #[PostMapping("submitMsg")]
    function saveMessage()
    {
       // todo
    }
}

namespace App\Http\Controllers\Portal;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
 #[Controller]
 class IndexController extends \Illuminate\Routing\Controller
 { 
    #[PostMapping("submitMsg")]
    function saveMessage(Request $request)
    {
       $validator = Validator::make($request->all(), [
         'username' => ['    
         // todo
    }
}

namespace App\Http\Controllers\Portal;
 
use Crastlin\LaravelAnnotation\Annotation\Attributes\Validation\Between;
use Crastlin\LaravelAnnotation\Extra\BaseController;
 #[Controller]
 class IndexController extends BaseController
 { 
    #[PostMapping("submitMsg/{id}")]
    function saveMessage(#[Between(ruleValue: "1,2")] int $id)
    {
         // todo
    }
}

namespace App\Http\Controllers\Portal;
 
use Crastlin\LaravelAnnotation\Annotation\Attributes\Env;
use Crastlin\LaravelAnnotation\Annotation\Attributes\Value;
use Crastlin\LaravelAnnotation\Annotation\Attributes\Input\All; 
use Crastlin\LaravelAnnotation\Extra\BaseController;
 #[Controller]
 class IndexController extends BaseController
 { 
    // 环境配置注入
    #[Env("APP_ENV")]
    protected string env;
    
    // config注入
    #[Value("app.debug")]
    protected bool $debug;
    
    // 请求参数注入,还可以使用Input/Get/Post/Query等
    #[All]
    protected array $params;
 
    #[PostMapping("submitMsg/{id}")]
    function saveMessage()
    {
         // todo
    }
}

namespace App\Http\Middleware;

use Crastlin\LaravelAnnotation\Facades\Injection;
use Closure;
use Illuminate\Http\Request;

class TokenCheck
{

    function handle(Request $request, Closure $next)
    {
       // var_dump('===== is Token Middleware ====');
        Injection::bind('params', $request->all());
        Injection::bind('header.token', $request->header("token"));
 
        return $next($request);
    }
}

namespace App\Http\Controllers\Portal;
  
use Crastlin\LaravelAnnotation\Annotation\Attributes\Autowired;
use Crastlin\LaravelAnnotation\Extra\BaseController;
use Crastlin\LaravelAnnotation\Annotation\Attributes\Inject;
 #[Controller]
 class IndexController extends BaseController
 {  
    #[Autowired]
    protected array $params;
    
    #[Inject("header.token")]
    protected string $token
    
    #[PostMapping("submitMsg/{id}")]
    function saveMessage()
    {
         // todo
    }
}

namespace App\Http\Controllers\Portal;
  
use Crastlin\LaravelAnnotation\Annotation\Attributes\Autowired;
use Crastlin\LaravelAnnotation\Extra\BaseController;
use Crastlin\LaravelAnnotation\Annotation\Attributes\Inject;
 #[Controller]
 class IndexController extends BaseController
 {   
    
    #[PostMapping("submitMsg/{id}")]
    function saveMessage(#[Autowired] array $params, #[Inject("header.token")] string $token)
    {
         // todo
    }
}

namespace App\Http\Middleware;

use Crastlin\LaravelAnnotation\Facades\Injection;
use Closure;
use Illuminate\Http\Request;

class TokenCheck
{

    function handle(Request $request, Closure $next)
    {
       // var_dump('===== is Token Middleware ====');
        Injection::bind('params', $request->all());
        $token = $request->header("token");
        Injection::bind('header.token', $token);
        $userId = TokenAuth::getUserId($token);
        $user = User::find($userId);
        if(!$user)
         return response()->json(['code' => 400, 'msg' => '用户不存在']);
         
        Injection::bind('model.user', $user);
 
        return $next($request);
    }
}

 namespace App\Service;
 
 use Crastlin\LaravelAnnotation\Annotation\Attributes\Autowired;
 use Crastlin\LaravelAnnotation\Annotation\Attributes\Inject;
 use Crastlin\LaravelAnnotation\Extra\ResponseCode;
 use Crastlin\LaravelAnnotation\Utils\Traits\SingletonTrait;
 use Crastlin\LaravelAnnotation\Utils\Traits\InvokeTrait;
 use App\Model\User;
 class UserService
 {
   use SingletonTrait, InvokeTrait;
   
   #[Inject("model.user")]
   protected ?User $user;
   
   function updateAvatar(#[Autowired] string $avatar): bool
   {
      var_dump($this->user);
      $this->user->avatar = $avatar;
      $this->user->save();
      
      $this->resCode = ResponseCode::SUCCESS;
      return true;
   }
 }

namespace App\Http\Controllers\Portal;
  
use Crastlin\LaravelAnnotation\Annotation\Attributes\Autowired;
use Crastlin\LaravelAnnotation\Annotation\Attributes\Validation\Numeric;
use Crastlin\LaravelAnnotation\Annotation\Attributes\Validation\Required;
use Crastlin\LaravelAnnotation\Extra\BaseController;
use Crastlin\LaravelAnnotation\Facades\Injection;
use App\Service\UserService;
 #[Controller]
 class UserController extends BaseController
 {   
 
    #[Autowired]
    protected array $params;
    
    
    #[Required("user_id")]
    #[Numeric("user_id")]
    #[PostMapping("updateAvatar")]
    function updateAvatar()
    {  
       return $this->callService(UserService::class, 'updateAvatar');
    }
}

namespace App\Service;

use Crastlin\LaravelAnnotation\Extra\BaseService;
/**
 * @mixin App\Service\Impl\User
 */
interface UserService extends BaseService
{
   function updateAvatar(string $avatar = ''): bool;
    
}

namespace App\Service\Impl;

use App\Service\UserService;
use Crastlin\LaravelAnnotation\Annotation\Attributes\Autowired;
use Crastlin\LaravelAnnotation\Annotation\Attributes\Service;
use Crastlin\LaravelAnnotation\Extra\BaseImplement;
#[Service]
class User extends BaseImplement implements UserService
{

    #[Inject("model.user")]
    protected ?User $user;

    function updateAvatar(#[Autowired] string $avatar = ''): bool
    {
      var_dump($this->user);
      $this->user->avatar = $avatar;
      $this->user->save();
      
      $this->resCode = ResponseCode::SUCCESS;
      return true;
    }
   
    function myOrders(): bool
    {
        // todo
        return true;
    }
}

namespace App\Http\Controllers\Portal;
  
use Crastlin\LaravelAnnotation\Annotation\Attributes\Autowired;
use Crastlin\LaravelAnnotation\Annotation\Attributes\Validation\Numeric;
use Crastlin\LaravelAnnotation\Annotation\Attributes\Validation\Required;
use Crastlin\LaravelAnnotation\Extra\BaseController;
use Crastlin\LaravelAnnotation\Facades\Injection;
use App\Service\UserService;
 #[Controller]
 class UserController extends BaseController
 {   
 
    #[Autowired]
    protected UserService $userService;
    
    
    #[Required("user_id")]
    #[Numeric("user_id")]
    #[PostMapping("updateAvatar")]
    function updateAvatar()
    {  
       if(!$this->userService->updateAvatar()){
          var_dump($this->userService->getError());
          var_dump($this->userService->getResCode());
       }else{
         var_dump($this->userService->getResult());  
       }
    }
}

namespace App\Http\Controllers\Portal;
  
use Crastlin\LaravelAnnotation\Annotation\Attributes\Autowired;
use Crastlin\LaravelAnnotation\Annotation\Attributes\Qualifier;
use Crastlin\LaravelAnnotation\Annotation\Attributes\Validation\Numeric;
use Crastlin\LaravelAnnotation\Annotation\Attributes\Validation\Required;
use Crastlin\LaravelAnnotation\Extra\BaseController;
use Crastlin\LaravelAnnotation\Facades\Injection;
use App\Service\UserService;
 #[Controller]
 class UserController extends BaseController
 {   
 
    #[Autowired]
    #[Qualifier(\App\Service\Impl\User::class)]
    protected UserService $userService;
    
    
    #[Required("user_id")]
    #[Numeric("user_id")]
    #[PostMapping("updateAvatar")]
    function updateAvatar()
    {  
       if(!$this->userService->updateAvatar()){
          var_dump($this->userService->getError());
          var_dump($this->userService->getResCode());
       }else{
         var_dump($this->userService->getResult());  
       }
    }
}
`shell
sudo -u www php artisan annotation:config
`shell
sudo -u www php artisan annotation:route 
`shell
sudo -u www php artisan annotation:node
`shell
sudo -u www php artisan annotation:node_store