{"id":855,"date":"2025-06-12T01:14:29","date_gmt":"2025-06-11T17:14:29","guid":{"rendered":"https:\/\/www.zhaozhao123.cn\/php\/php-application-manual\/laravel\/855.html"},"modified":"2025-06-12T01:14:29","modified_gmt":"2025-06-11T17:14:29","slug":"laravel%e4%b8%ad%e7%9a%84%e6%8e%88%e6%9d%83%e8%a7%92%e8%89%b2%ef%bc%9a%e5%ae%9e%e7%94%a8%e6%8c%87%e5%8d%97","status":"publish","type":"my1js","link":"https:\/\/www.zhaozhao123.cn\/php\/my1js\/855.html","title":{"rendered":"Laravel\u4e2d\u7684\u6388\u6743\u89d2\u8272\uff1a\u5b9e\u7528\u6307\u5357"},"content":{"rendered":"<div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--1\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/dyA-1-400x300.jpg\" alt=\"Bug&#32534;&#35793;&#29422;\" class=\"wp-image-1842\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">Bug&#32534;&#35793;&#29422;<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<p>&#12298;Laravel&#20013;&#30340;&#25480;&#26435;&#35282;&#33394;&#65306;&#23454;&#29992;&#25351;&#21335;&#12299;<\/p>\n<p>&#22312;&#29616;&#20195;&#30340;Web&#24320;&#21457;&#20013;&#65292;&#26435;&#38480;&#25511;&#21046;&#26159;&#30830;&#20445;&#23433;&#20840;&#24615;&#21644;&#29992;&#25143;&#28385;&#24847;&#24230;&#30340;&#20851;&#38190;&#22240;&#32032;&#20043;&#19968;&#12290;Laravel&#26159;&#19968;&#20010;&#38750;&#24120;&#27969;&#34892;&#30340;PHP&#26694;&#26550;&#65292;&#23427;&#25552;&#20379;&#20102;&#24378;&#22823;&#30340;&#26435;&#38480;&#31649;&#29702;&#21151;&#33021;&#12290;&#26412;&#25991;&#23558;&#24110;&#21161;&#20320;&#22312;Laravel&#39033;&#30446;&#20013;&#20351;&#29992;&#25480;&#26435;&#35282;&#33394;&#26469;&#23454;&#29616;&#29992;&#25143;&#35748;&#35777;&#21644;&#35775;&#38382;&#25511;&#21046;&#12290;<\/p>\n<h3>1. &#23433;&#35013;Laravel<\/h3>\n<p>&#39318;&#20808;&#65292;&#20320;&#38656;&#35201;&#23433;&#35013;Laravel&#12290;&#20320;&#21487;&#20197;&#36890;&#36807;Composer&#26469;&#23436;&#25104;&#36825;&#20010;&#36807;&#31243;&#65306;<\/p>\n<pre><code class=\"language-bash\">composer create-project --prefer-dist laravel\/laravel my-laravel-app\ncd my-laravel-app<\/code><\/pre>\n<h3>2. &#21019;&#24314;&#19968;&#20010;&#35282;&#33394;&#27169;&#22411;<\/h3>\n<p>&#25509;&#19979;&#26469;&#65292;&#25105;&#20204;&#38656;&#35201;&#21019;&#24314;&#19968;&#20010;&#35282;&#33394;&#27169;&#22411;&#26469;&#34920;&#31034;&#29992;&#25143;&#30340;&#26435;&#38480;&#12290;&#22312;<code>app\/Models<\/code>&#30446;&#24405;&#19979;&#21019;&#24314;&#19968;&#20010;&#21517;&#20026;<code>Role.php<\/code>&#30340;&#25991;&#20214;&#65292;&#24182;&#28155;&#21152;&#20197;&#19979;&#20195;&#30721;&#65306;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\n\nuse IlluminateDatabaseEloquentModel;\nuse IlluminateSupportFacadesGate;\n\nclass Role extends Model\n{\n    protected $fillable = ['name', 'description'];\n\n    public function users()\n    {\n        return $this-&gt;belongsToMany(User::class);\n    }\n\n    public function authorize($ability, $arguments = [])\n    {\n        if (Gate::check($ability . '.' . $arguments[0], $arguments[1])) {\n            return true;\n        }\n\n        abort(403);\n    }\n}<\/code><\/pre>\n<h3>3. &#21019;&#24314;&#19968;&#20010;&#29992;&#25143;&#27169;&#22411;<\/h3>\n<p>&#21516;&#26679;&#65292;&#22312;<code>app\/Models<\/code>&#30446;&#24405;&#19979;&#21019;&#24314;&#19968;&#20010;&#21517;&#20026;<code>User.php<\/code>&#30340;&#25991;&#20214;&#65292;&#24182;&#28155;&#21152;&#20197;&#19979;&#20195;&#30721;&#65306;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppModels;\n\nuse IlluminateFoundationAuthUser as Authenticatable;\nuse IlluminateNotificationsNotifiable;\nuse LaravelSoftDeletes;\nuse SpatiePermissionTraitsHasRoles;\n\nclass User extends Authenticatable\n{\n    use Notifiable, SoftDeletes, HasRoles;\n\n    protected $fillable = [\n        'name', 'email', 'password',\n    ];\n\n    protected $hidden = [\n        'password', 'remember_token',\n    ];\n\n    public function roles()\n    {\n        return $this-&gt;belongsToMany(Role::class);\n    }\n\n    public function authorize($ability, $arguments = [])\n    {\n        if (Gate::check($ability . '.' . $arguments[0], $arguments[1])) {\n            return true;\n        }\n\n        abort(403);\n    }\n}<\/code><\/pre>\n<h3>4. &#37197;&#32622;&#36335;&#30001;&#21644;&#25511;&#21046;&#22120;<\/h3>\n<p>&#22312;<code>routes\/web.php<\/code>&#25991;&#20214;&#20013;&#37197;&#32622;&#36335;&#30001;&#21644;&#25511;&#21046;&#22120;&#65306;<\/p>\n<pre><code class=\"language-php\">use AppHttpControllersAuthController;\nuse AppHttpControllersPostController;\nuse AppHttpControllersRoleController;\nuse AppHttpControllersUserController;\n\nRoute::get('\/login', [AuthController::class, 'showLoginForm'])-&gt;name('login');\nRoute::post('\/login', [AuthController::class, 'authenticate']);\nRoute::get('\/register', [AuthController::class, 'showRegistrationForm'])-&gt;name('register');\nRoute::post('\/register', [AuthController::class, 'store']);\n\nRoute::middleware(['auth:sanctum'])-&gt;group(function () {\n    Route::apiResource('posts', PostController::class);\n    Route::apiResource('roles', RoleController::class);\n    Route::apiResource('users', UserController::class);\n});<\/code><\/pre>\n<h3>5. &#21019;&#24314;&#25511;&#21046;&#22120;<\/h3>\n<p>&#22312;<code>app\/Http\/Controllers<\/code>&#30446;&#24405;&#19979;&#21019;&#24314;&#20197;&#19979;&#25511;&#21046;&#22120;&#65306;<\/p>\n<ul>\n<li><code>AuthController<\/code><\/li>\n<li><code>PostController<\/code><\/li>\n<li><code>RoleController<\/code><\/li>\n<li><code>UserController<\/code><\/li>\n<\/ul>\n<h4>AuthController<\/h4>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppHttpControllers;\n\nuse AppModelsUser;\nuse IlluminateHttpRequest;\nuse IlluminateSupportFacadesAuth;\nuse IlluminateSupportFacadesValidator;\n\nclass AuthController extends Controller\n{\n    public function showLoginForm()\n    {\n        return view('auth.login');\n    }\n\n    public function authenticate(Request $request)\n    {\n        $validator = Validator::make($request-&gt;all(), [\n            'email' =&gt; 'required|email',\n            'password' =&gt; 'required',\n        ]);\n\n        if ($validator-&gt;fails()) {\n            return redirect()-&gt;back()-&gt;withErrors($validator)-&gt;withInput();\n        }\n\n        if (!Auth::attempt(['email' =&gt; $request['email'], 'password' =&gt; $request['password']])) {\n            return redirect()-&gt;back()-&gt;withErrors(['message' =&gt; 'Invalid credentials'])-&gt;withInput();\n        }\n\n        return redirect()-&gt;intended('\/');\n    }\n\n    public function logout()\n    {\n        Auth::logout();\n\n        return redirect()-&gt;route('login');\n    }\n}<\/code><\/pre>\n<h4>PostController<\/h4>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppHttpControllers;\n\nuse AppModelsPost;\nuse IlluminateHttpRequest;\n\nclass PostController extends Controller\n{\n    public function index()\n    {\n        $posts = Post::all();\n        return view('posts.index', compact('posts'));\n    }\n\n    public function store(Request $request)\n    {\n        $validator = Validator::make($request-&gt;all(), [\n            'title' =&gt; 'required|max:255',\n            'content' =&gt; 'required',\n        ]);\n\n        if ($validator-&gt;fails()) {\n            return redirect()-&gt;back()-&gt;withErrors($validator)-&gt;withInput();\n        }\n\n        $post = new Post();\n        $post-&gt;title = $request['title'];\n        $post-&gt;content = $request['content'];\n        $post-&gt;save();\n\n        return redirect()-&gt;route('posts.index');\n    }\n}<\/code><\/pre>\n<h4>RoleController<\/h4>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppHttpControllers;\n\nuse AppModelsRole;\nuse IlluminateHttpRequest;\n\nclass RoleController extends Controller\n{\n    public function index()\n    {\n        $roles = Role::all();\n        return view('roles.index', compact('roles'));\n    }\n\n    public function store(Request $request)\n    {\n        $validator = Validator::make($request-&gt;all(), [\n            'name' =&gt; 'required|unique:roles,name',\n            'description' =&gt; 'required',\n        ]);\n\n        if ($validator-&gt;fails()) {\n            return redirect()-&gt;back()-&gt;withErrors($validator)-&gt;withInput();\n        }\n\n        $role = new Role();\n        $role-&gt;name = $request['name'];\n        $role-&gt;description = $request['description'];\n        $role-&gt;save();\n\n        return redirect()-&gt;route('roles.index');\n    }\n\n    public function update(Request $request, $id)\n    {\n        $validator = Validator::make($request-&gt;all(), [\n            'name' =&gt; 'required|unique:roles,name,' . $id,\n            'description' =&gt; 'required',\n        ]);\n\n        if ($validator-&gt;fails()) {\n            return redirect()-&gt;back()-&gt;withErrors($validator)-&gt;withInput();\n        }\n\n        $role = Role::find($id);\n        $role-&gt;name = $request['name'];\n        $role-&gt;description = $request['description'];\n        $role-&gt;save();\n\n        return redirect()-&gt;route('roles.index');\n    }\n\n    public function destroy($id)\n    {\n        $role = Role::find($id);\n        $role-&gt;delete();\n\n        return redirect()-&gt;route('roles.index');\n    }\n}<\/code><\/pre>\n<h4>UserController<\/h4>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppHttpControllers;\n\nuse AppModelsUser;\nuse IlluminateHttpRequest;\n\nclass UserController extends Controller\n{\n    public function index()\n    {\n        $users = User::all();\n        return view('users.index', compact('users'));\n    }\n\n    public function store(Request $request)\n    {\n        $validator = Validator::make($request-&gt;all(), [\n            'name' =&gt; 'required|max:255',\n            'email' =&gt; 'required|email|unique:users,email',\n            'password' =&gt; 'required|min:8',\n        ]);\n\n        if ($validator-&gt;fails()) {\n            return redirect()-&gt;back()-&gt;withErrors($validator)-&gt;withInput();\n        }\n\n        $user = new User();\n        $user-&gt;name = $request['name'];\n        $user-&gt;email = $request['email'];\n        $user-&gt;password = bcrypt($request['password']);\n        $user-&gt;save();\n\n        return redirect()-&gt;route('users.index');\n    }\n\n    public function update(Request $request, $id)\n    {\n        $validator = Validator::make($request-&gt;all(), [\n            'name' =&gt; 'required|max:255',\n            'email' =&gt; 'required|email|unique:users,email,' . $id,\n        ]);\n\n        if ($validator-&gt;fails()) {\n            return redirect()-&gt;back()-&gt;withErrors($validator)-&gt;withInput();\n        }\n\n        $user = User::find($id);\n        $user-&gt;name = $request['name'];\n        $user-&gt;email = $request['email'];\n        if ($request-&gt;has('password')) {\n            $user-&gt;password = bcrypt($request['password']);\n        }\n        $user-&gt;save();\n\n        return redirect()-&gt;route('users.index');\n    }\n\n    public function destroy($id)\n    {\n        $user = User::find($id);\n        $user-&gt;delete();\n\n        return redirect()-&gt;route('users.index');\n    }\n\n    public function assignRole(Request $request, $userId)\n    {\n        $roleId = $request-&gt;input('role_id');\n        $user = User::find($userId);\n        $user-&gt;assignRole($roleId);\n\n        return redirect()-&gt;route('users.show', $userId);\n    }\n\n    public function removeRole(Request $request, $userId, $roleId)\n    {\n        $user = User::find($userId);\n        $user-&gt;removeRole($roleId);\n\n        return redirect()-&gt;route('users.show', $userId);\n    }\n}<\/code><\/pre>\n<h3>6. &#36171;&#20104;&#29992;&#25143;&#35282;&#33394;<\/h3>\n<p>&#29616;&#22312;&#65292;&#20320;&#21487;&#20197;&#20026;&#29992;&#25143;&#20998;&#37197;&#35282;&#33394;&#12290;&#22312;<code>app\/Console\/Kernel.php<\/code>&#25991;&#20214;&#20013;&#36816;&#34892;&#20197;&#19979;&#21629;&#20196;&#65306;<\/p>\n<pre><code class=\"language-bash\">php artisan make:command AssignRole<\/code><\/pre>\n<p>&#32534;&#36753;&#29983;&#25104;&#30340;<code>AssignRole<\/code>&#31867;&#65292;&#28155;&#21152;&#20197;&#19979;&#20195;&#30721;&#65306;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppConsoleCommands;\n\nuse AppModelsRole;\nuse AppModelsUser;\nuse IlluminateConsoleCommand;\n\nclass AssignRole extends Command\n{\n    \/**\n     * The name and signature of the console command.\n     *\n     * @var string\n     *\/\n    protected $signature = 'assign-role {user} {role}';\n\n    \/**\n     * The console command description.\n     *\n     * @var string\n     *\/\n    protected $description = 'Assign a role to a user';\n\n    \/**\n     * Execute the console command.\n     *\n     * @return int\n     *\/\n    public function handle()\n    {\n        $user = User::find($this-&gt;argument('user'));\n        $role = Role::find($this-&gt;argument('role'));\n\n        if (!$user || !$role) {\n            $this-&gt;error('User or role not found.');\n            return 1;\n        }\n\n        $user-&gt;assignRole($role-&gt;name);\n\n        $this-&gt;info('Role assigned successfully.');\n        return 0;\n    }\n}<\/code><\/pre>\n<p>&#28982;&#21518;&#65292;&#20320;&#21487;&#20197;&#20351;&#29992;&#20197;&#19979;&#21629;&#20196;&#20026;&#29992;&#25143;&#20998;&#37197;&#35282;&#33394;&#65306;<\/p>\n<pre><code class=\"language-bash\">php artisan assign-role 1 admin<\/code><\/pre>\n<p>&#36825;&#26679;&#65292;&#20320;&#23601;&#25104;&#21151;&#22320;&#20026;&#29992;&#25143;&#20998;&#37197;&#20102;&#35282;&#33394;&#65292;&#24182;&#19988;&#21487;&#20197;&#36890;&#36807;Gates&#36827;&#34892;&#26435;&#38480;&#26816;&#26597;&#12290;<\/p>\n<p>&#36890;&#36807;&#20197;&#19978;&#27493;&#39588;&#65292;&#20320;&#21487;&#20197;&#22312;Laravel&#39033;&#30446;&#20013;&#20351;&#29992;&#25480;&#26435;&#35282;&#33394;&#26469;&#23454;&#29616;&#29992;&#25143;&#35748;&#35777;&#21644;&#35775;&#38382;&#25511;&#21046;&#12290;&#24076;&#26395;&#36825;&#31687;&#25351;&#21335;&#23545;&#20320;&#26377;&#25152;&#24110;&#21161;&#65281;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div><div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--2\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/zp-400x300.jpg\" alt=\"&#40657;&#26495;Bug&#35762;&#24072;\" class=\"wp-image-1849\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">&#40657;&#26495;Bug&#35762;&#24072;<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<body><h2>&#20171;&#32461;<\/h2><p>&#25480;&#26435;&#26159;&#20219;&#20309;Web&#24212;&#29992;&#31243;&#24207;&#30340;&#20851;&#38190;&#32452;&#25104;&#37096;&#20998;&#65292;&#30830;&#20445;&#29992;&#25143;&#20855;&#26377;&#25191;&#34892;&#29305;&#23450;&#25805;&#20316;&#30340;&#36866;&#24403;&#26435;&#38480;&#12290;Laravel&#65292;&#19990;&#30028;&#19978;&#26368;&#27969;&#34892;&#30340;PHP&#26694;&#26550;&#20043;&#19968;&#65292;&#36890;&#36807;&#20869;&#32622;&#21151;&#33021;&#20197;&#21450;&#22914;Spatie&#30340;Role &amp; Permission&#31561;&#21253;&#25552;&#20379;&#20102;&#19968;&#31181;&#20248;&#38597;&#19988;&#31616;&#21333;&#30340;&#22788;&#29702;&#25480;&#26435;&#30340;&#26041;&#24335;&#12290;&#22312;&#36825;&#31687;&#25351;&#21335;&#20013;&#65292;&#25105;&#20204;&#23558;&#20174;&#22522;&#30784;&#21040;&#26356;&#39640;&#32423;&#30340;&#27010;&#24565;&#20171;&#32461;&#22914;&#20309;&#22312;Laravel&#20013;&#23454;&#29616;&#22522;&#20110;&#35282;&#33394;&#30340;&#25480;&#26435;&#12290;<\/p><h2>&#22312;Laravel&#20013;&#35774;&#32622;&#35282;&#33394;&#65288;roles&#65289;&#30340;&#25805;&#20316;&#12290;<\/h2><p>&#39318;&#20808;&#65292;&#25105;&#20204;&#38656;&#35201;&#22312;&#25105;&#20204;&#30340;Laravel&#24212;&#29992;&#31243;&#24207;&#20013;&#23450;&#20041;&#35282;&#33394;&#22522;&#30784;&#35774;&#26045;&#12290;&#34429;&#28982;Laravel&#26412;&#36523;&#27809;&#26377;&#20869;&#32622;&#30340;&#35282;&#33394;&#21151;&#33021;&#65292;&#20294;&#36890;&#36807;&#20351;&#29992;Gates&#21644;Policies&#65292;&#25105;&#20204;&#21487;&#20197;&#25163;&#21160;&#23450;&#20041;&#35282;&#33394;&#21644;&#26435;&#38480;&#65292;&#25110;&#32773;&#38598;&#25104;&#31532;&#19977;&#26041;&#21253;&#26469;&#23454;&#29616;&#36825;&#19968;&#28857;&#12290;<\/p><p>&#39318;&#20808;&#65292;&#20351;&#29992;&#36801;&#31227;&#21019;&#24314;&#35282;&#33394;&#21644;&#26435;&#38480;&#34920;&#65306;<\/p><pre><code>php artisan make:migration create_roles_table\nphp artisan make:migration create_permissions_table\n<\/code><\/pre><p>&#24744;&#30340;&#36801;&#31227;&#25991;&#20214;&#24212;&#23450;&#20041;&#35282;&#33394;&#21644;&#26435;&#38480;&#25152;&#38656;&#30340;&#21015;&#12290;&#19968;&#26086;&#21019;&#24314;&#20102;&#36825;&#20123;&#36801;&#31227;&#65292;&#23601;&#36816;&#34892;&#23427;&#20204;&#65306;<\/p><pre><code>php artisan migrate\n<\/code><\/pre><p>&#25509;&#19979;&#26469;&#65292;&#35774;&#32622;&#27169;&#22411;&#65306;<\/p><pre><code>php artisan make:model Role\nphp artisan make:model Permission\n<\/code><\/pre><p>&#28982;&#21518;&#65292;&#32534;&#36753;&#12290;<code>Role<\/code>and &#26159;&ldquo;&#24182;&#19988;&rdquo;&#30340;&#24847;&#24605;&#12290;<code>Permission<\/code>&#27169;&#22411;&#29992;&#20110;&#23450;&#20041;&#20851;&#31995;&#12290;<\/p><h2>&#20026;&#29992;&#25143;&#20998;&#37197;&#35282;&#33394;&#12290;<\/h2><p>&#35282;&#33394;&#38656;&#35201;&#19982;&#29992;&#25143;&#20851;&#32852;&#12290;&#25105;&#20204;&#21487;&#20197;&#20026;&#25105;&#20204;&#30340;User&#27169;&#22411;&#28155;&#21152;&#19968;&#20010;&#26041;&#27861;&#65292;&#20363;&#22914;&#65306;<\/p><pre><code>public function roles()\n{\n    return $this-&gt;belongsToMany(Role::class);\n}\n<\/code><\/pre><p>&#25105;&#20204;&#20063;&#38656;&#35201;&#20026;&#29992;&#25143;&#20998;&#37197;&#35282;&#33394;&#65292;&#21487;&#20197;&#36890;&#36807;&#20197;&#19979;&#26041;&#24335;&#23454;&#29616;&#65306;<\/p><pre><code>$user-&gt;roles()-&gt;attach($roleId);\n<\/code><\/pre><h2>&#20351;&#29992;Gates&#36827;&#34892;&#25480;&#26435;<\/h2><p>Laravel&#30340;Gate&#26159;&#38381;&#21253;&#65292;&#29992;&#20110;&#30830;&#23450;&#29992;&#25143;&#26159;&#21542;&#34987;&#25480;&#26435;&#25191;&#34892;&#29305;&#23450;&#30340;&#25805;&#20316;&#12290;&#20197;&#19979;&#26159;&#19968;&#20010;&#31616;&#21333;&#30340;&#31034;&#20363;&#65306;<\/p><pre><code>Gate::define('edit-article', function ($user, $article) {\n    return $user-&gt;id === $article-&gt;user_id;\n});\n<\/code><\/pre><p>&#20026;&#20102;&#26816;&#26597;&#27492;&#25480;&#26435;&#65292;&#25105;&#20204;&#20351;&#29992;&#65306;<\/p><pre><code>if (Gate::allows('edit-article', $article)) {\n    \/\/ The user can edit the article\n}\n<\/code><\/pre><h2>&#23450;&#20041;&#25919;&#31574;<\/h2><p>&#25919;&#31574;&#26159;&#19968;&#32452;&#32452;&#32455;&#22260;&#32469;&#29305;&#23450;&#27169;&#22411;&#25110;&#36164;&#28304;&#30340;&#25480;&#26435;&#36923;&#36753;&#30340;&#31867;&#12290;&#35201;&#21019;&#24314;&#19968;&#20010;&#31574;&#30053;&#65306;<\/p><pre><code>php artisan make:policy ArticlePolicy --model=Article\n<\/code><\/pre><p>&#36825;&#20250;&#20135;&#29983;&#21253;&#21547;&#22810;&#20010;&#27169;&#26495;&#26041;&#27861;&#30340;&#31574;&#30053;&#12290;&#20320;&#21487;&#20197;&#23450;&#20041;&#31867;&#20284;&#20110;&#30340;&#26041;&#27861;&#12290;<code>update()<\/code>&#21738;&#20010;&#21487;&#20197;&#26816;&#26597;&#29992;&#25143;&#26159;&#21542;&#26377;&#24517;&#35201;&#30340;&#26435;&#38480;&#20197;&#25191;&#34892;&#35282;&#33394;&#65306;<\/p><pre><code>public function update(User $user, Article $article)\n{\n    return $user-&gt;roles-&gt;contains('editor');\n}\n<\/code><\/pre><p>&#35813;&#26041;&#27861;&#29616;&#22312;&#21487;&#20197;&#22312;&#20351;&#29992;&#25511;&#21046;&#22120;&#26102;&#20351;&#29992;&#20102;&#12290;<code>authorize<\/code>&#26041;&#27861;&#65306;<\/p><pre><code>$this-&gt;authorize('update', $article);\n<\/code><\/pre><h2>&#39640;&#32423;&#35282;&#33394;&#21644;&#26435;&#38480;&#35774;&#32622;&#30340;Spatie&#21253;<\/h2><p>&#23545;&#20110;&#26356;&#22797;&#26434;&#30340;&#24212;&#29992;&#65292;&#36890;&#24120;&#20351;&#29992;Spatie&#30340;Laravel-Permission&#21253;&#20250;&#26356;&#23481;&#26131;&#19968;&#20123;&#12290;&#36890;&#36807;composer&#23433;&#35013;&#35813;&#21253;&#24182;&#21457;&#24067;&#20854;&#36164;&#20135;&#21518;&#65292;&#20320;&#21487;&#20197;&#29992;&#31616;&#21333;&#30340;&#21629;&#20196;&#28155;&#21152;&#35282;&#33394;&#21644;&#26435;&#38480;&#65306;<\/p><pre><code>use SpatiePermissionModelsRole;\nuse SpatiePermissionModelsPermission;\n\n$role = Role::create(['name' =&gt; 'editor']);\n$permission = Permission::create(['name' =&gt; 'edit articles']);\n<\/code><\/pre><p>&#23427;&#36824;&#25552;&#20379;&#20102;&#29992;&#20110;&#20351;&#29992;&#35282;&#33394;&#21644;&#26435;&#38480;&#20445;&#25252;&#36335;&#30001;&#30340;&#20013;&#38388;&#20214;&#65306;<\/p><pre><code>Route::group(['middleware' =&gt; ['role:editor']], function () {\n    \/\/ Routes here will require the 'editor' role\n});\n<\/code><\/pre><h2>&#25480;&#26435;&#25480;&#26435;&#25351;&#24341; Blade<\/h2><p>&#22312;&#25105;&#30340;&#35266;&#28857;&#20013;&#65292;&#20320;&#21487;&#20197;&#21033;&#29992;Laravel&#20869;&#32622;&#30340;Blade&#25351;&#20196;&#26469;&#26681;&#25454;&#29992;&#25143;&#30340;&#35282;&#33394;&#25110;&#26435;&#38480;&#26174;&#31034;&#20869;&#23481;&#65306;<\/p><pre><code>@role('editor')\n    &lt;!-- Content for editors --&gt;\n@endrole\n\n@can('edit articles')\n    &lt;!-- Content for users who can edit articles --&gt;\n@endcan\n<\/code><\/pre><h2>&#27979;&#35797;&#25480;&#26435;<\/h2><p>&#27979;&#35797;&#22312;&#30830;&#20445;&#24212;&#29992;&#25480;&#26435;&#21151;&#33021;&#27491;&#30830;&#36816;&#34892;&#26041;&#38754;&#33267;&#20851;&#37325;&#35201;&#12290;Laravel &#36890;&#36807;&#20869;&#32622;&#29305;&#24615;&#25552;&#20379;&#20102;&#20889;&#27979;&#35797;&#30340;&#20415;&#21033;&#65306;<\/p><pre><code>$response = $this-&gt;actingAs($user)-&gt;get('\/article\/edit\/1');\n$response-&gt;assertStatus(403);\n<\/code><\/pre><p>&#27492;&#26816;&#26597;&#26159;&#21542;&#27491;&#30830;&#38459;&#27490;&#26410;&#32463;&#25480;&#26435;&#30340;&#29992;&#25143;&#35775;&#38382;&#21463;&#20445;&#25252;&#30340;&#36335;&#30001;&#12290;<\/p><h2>&#32467;&#35770;&#12290;<\/h2><p>&#32508;&#19978;&#25152;&#36848;&#65292;&#29702;&#35299;&#24182;&#23454;&#26045;Laravel&#20013;&#30340;&#35282;&#33394;&#25480;&#26435;&#23545;&#20110;&#30830;&#20445;&#24212;&#29992;&#20869;&#25805;&#20316;&#30340;&#23433;&#20840;&#33267;&#20851;&#37325;&#35201;&#12290;&#36890;&#36807;&#35774;&#32622;&#35282;&#33394;&#21644;&#26435;&#38480;&#12289;&#20351;&#29992;Gate&#21644;Policy&#31561;&#26041;&#27861;&#65292;&#20197;&#21450;&#21033;&#29992;&#22914;Spatie&#36825;&#26679;&#30340;&#22797;&#26434;&#22330;&#26223;&#21253;&#65292;Laravel&#24320;&#21457;&#20154;&#21592;&#21487;&#20197;&#26377;&#25928;&#22320;&#31649;&#29702;&#35775;&#38382;&#25511;&#21046;&#12290;<\/p><\/body>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div><div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--3\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/xygcfznnzczhsdmwydzhsmzzzmddnq-400x300.jpg\" alt=\"&#38271;&#24037;&#30721;&#22900;1523\" class=\"wp-image-2906\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">&#38271;&#24037;&#30721;&#22900;1523<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<p>Laravel &#26159;&#19968;&#20010;&#38750;&#24120;&#27969;&#34892;&#30340; PHP &#24320;&#21457;&#26694;&#26550;&#65292;&#23427;&#25552;&#20379;&#20102;&#20016;&#23500;&#30340;&#21151;&#33021;&#21644;&#24378;&#22823;&#30340; API&#12290;&#20854;&#20013;&#30340;&#19968;&#20010;&#20851;&#38190;&#29305;&#24615;&#26159;&#26435;&#38480;&#31649;&#29702;&#65292;&#36890;&#36807;&#25480;&#26435;&#35282;&#33394;&#65288;roles&#65289;&#26469;&#25511;&#21046;&#29992;&#25143;&#23545;&#36164;&#28304;&#30340;&#35775;&#38382;&#12290;<\/p>\n<p>&#22312; Laravel &#20013;&#65292;&#21019;&#24314;&#21644;&#31649;&#29702;&#35282;&#33394;&#38750;&#24120;&#31616;&#21333;&#12290;&#19979;&#38754;&#26159;&#19968;&#20123;&#22522;&#26412;&#30340;&#27493;&#39588;&#21644;&#31034;&#20363;&#20195;&#30721;&#65306;<\/p>\n<h3>1. &#21019;&#24314;&#35282;&#33394;<\/h3>\n<p>&#39318;&#20808;&#65292;&#20320;&#38656;&#35201;&#23450;&#20041;&#19968;&#20010;&#26032;&#30340;&#35282;&#33394;&#12290;&#36825;&#20010;&#35282;&#33394;&#23558;&#29992;&#20110;&#25351;&#23450;&#21738;&#20123;&#29992;&#25143;&#21487;&#20197;&#35775;&#38382;&#21738;&#20123;&#29305;&#23450;&#30340;&#36164;&#28304;&#12290;&#20320;&#21487;&#20197;&#20351;&#29992; <code>Role<\/code> &#31867;&#26469;&#23450;&#20041;&#35282;&#33394;&#12290;<\/p>\n<pre><code class=\"language-php\">use IlluminateSupportFacadesGate;\n\nclass Role {\n    public $name;\n    public $guard_name;\n\n    \/**\n     * Create a new role instance.\n     *\n     * @param string $name\n     * @param string $guard_name\n     *\/\n    public function __construct($name, $guard_name)\n    {\n        $this-&gt;name = $name;\n        $this-&gt;guard_name = $guard_name;\n    }\n\n    \/**\n     * Determine if the user has the role.\n     *\n     * @param IlluminateContractsAuthAuthenticatable $user\n     * @return bool\n     *\/\n    public function can($ability, $guard = null)\n    {\n        return Gate::allows($this-&gt;name . '.' . $ability, $guard);\n    }\n}<\/code><\/pre>\n<h3>2. &#20351;&#29992;&#35282;&#33394;<\/h3>\n<p>&#19968;&#26086;&#20320;&#21019;&#24314;&#20102;&#35282;&#33394;&#65292;&#23601;&#21487;&#20197;&#20026;&#19981;&#21516;&#30340;&#25511;&#21046;&#22120;&#35774;&#32622;&#36825;&#20123;&#35282;&#33394;&#12290;&#36825;&#26679;&#65292;&#21482;&#26377;&#20855;&#26377;&#30456;&#24212;&#35282;&#33394;&#30340;&#29992;&#25143;&#25165;&#33021;&#35775;&#38382;&#23427;&#20204;&#12290;<\/p>\n<pre><code class=\"language-php\">\/\/ controller.php\npublic function index()\n{\n    \/\/ ...\n\n    foreach (config('auth.roles') as $role =&gt; $guards) {\n        if ($this-&gt;hasRole($role)) {\n            $this-&gt;authorize($role, $guards);\n        } else {\n            abort(403);\n        }\n    }\n\n    \/\/ ...\n}\n\nprotected function hasRole($role)\n{\n    return in_array($role, config('auth.role_names'));\n}<\/code><\/pre>\n<h3>&#31034;&#20363;&#20195;&#30721;<\/h3>\n<p>&#20197;&#19979;&#26159;&#19968;&#20010;&#31616;&#21333;&#30340;&#20363;&#23376;&#65292;&#23637;&#31034;&#20102;&#22914;&#20309;&#22312;&#25511;&#21046;&#22120;&#20013;&#26816;&#26597;&#29992;&#25143;&#26159;&#21542;&#20855;&#26377;&#26576;&#20010;&#35282;&#33394;&#65292;&#24182;&#26681;&#25454;&#38656;&#35201;&#36827;&#34892;&#26435;&#38480;&#39564;&#35777;&#65306;<\/p>\n<pre><code class=\"language-php\">public function index(Request $request)\n{\n    \/\/ ...\n\n    if ($request-&gt;hasRole('admin')) {\n        \/\/ &#29992;&#25143;&#20855;&#26377;&#31649;&#29702;&#21592;&#26435;&#38480;&#65292;&#20801;&#35768;&#35775;&#38382;\n    } elseif ($request-&gt;hasRole('editor')) {\n        \/\/ &#29992;&#25143;&#20855;&#26377;&#32534;&#36753;&#26435;&#38480;&#65292;&#20801;&#35768;&#35775;&#38382;\n    } else {\n        \/\/ &#20854;&#20182;&#29992;&#25143;&#34987;&#25298;&#32477;&#35775;&#38382;\n    }\n\n    \/\/ ...\n}<\/code><\/pre>\n<p>&#22312;&#36825;&#20010;&#20363;&#23376;&#20013;&#65292;&#25105;&#20204;&#26816;&#26597; <code>$request-&gt;hasRole('admin')<\/code> &#26469;&#21028;&#26029;&#29992;&#25143;&#26159;&#21542;&#20855;&#26377;&#31649;&#29702;&#21592;&#26435;&#38480;&#65292;&#28982;&#21518;&#26681;&#25454;&#32467;&#26524;&#20915;&#23450;&#26159;&#21542;&#20801;&#35768;&#35775;&#38382;&#12290;<\/p>\n<p>&#36825;&#23601;&#26159; Laravel &#35282;&#33394;&#31995;&#32479;&#30340;&#22522;&#26412;&#29992;&#27861;&#12290;&#20320;&#21487;&#20197;&#26681;&#25454;&#38656;&#35201;&#25193;&#23637;&#21644;&#23450;&#21046;&#36825;&#20010;&#31995;&#32479;&#65292;&#20197;&#28385;&#36275;&#19981;&#21516;&#22330;&#26223;&#30340;&#38656;&#27714;&#12290;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bug&#32534;&#35793;&#29422; &#12298;Laravel&#20013;&#30340;&#25480;&#26435;&#35282;&#33394;&#65306;&#23454;&#29992;&#25351;&#21335;&#12299; &#22312;&#29616;&#038;#20..<\/p>\n","protected":false},"author":1,"featured_media":0,"menu_order":0,"template":"","meta":{"_acf_changed":false},"tags":[],"my1js2nav":[44],"tuisongtax":[],"class_list":["post-855","my1js","type-my1js","status-publish","hentry","my1js2nav-laravel"],"acf":{"qian_art_seotitle":"","qian_art_seotitle_source":{"label":"SEO\u6807\u9898","type":"text","formatted_value":""},"qian_art_seokws":"","qian_art_seokws_source":{"label":"SEO\u5173\u952e\u8bcd","type":"text","formatted_value":""},"qian_art_stzhong":"","qian_art_stzhong_source":{"label":"\u4e2d | \u77ed\u6807\u9898","type":"text","formatted_value":""}},"_links":{"self":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js\/855","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js"}],"about":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/types\/my1js"}],"author":[{"embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/users\/1"}],"wp:attachment":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/media?parent=855"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tags?post=855"},{"taxonomy":"my1js2nav","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js2nav?post=855"},{"taxonomy":"tuisongtax","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tuisongtax?post=855"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}