{"id":24897,"date":"2024-11-21T08:19:39","date_gmt":"2024-11-21T00:19:39","guid":{"rendered":"https:\/\/fwq.ai\/blog\/24897\/"},"modified":"2024-11-21T08:19:39","modified_gmt":"2024-11-21T00:19:39","slug":"%e5%a6%82%e4%bd%95%e4%bd%bf%e7%94%a8laravel%e5%bc%80%e5%8f%91%e4%b8%80%e4%b8%aa%e5%9c%a8%e7%ba%bf%e6%8b%bc%e5%9b%a2%e5%b9%b3%e5%8f%b0","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/24897\/","title":{"rendered":"\u5982\u4f55\u4f7f\u7528Laravel\u5f00\u53d1\u4e00\u4e2a\u5728\u7ebf\u62fc\u56e2\u5e73\u53f0"},"content":{"rendered":"<p><img decoding=\"async\" src=\"https:\/\/img.php.cn\/upload\/article\/000\/465\/014\/169901029547335.jpg\" class=\"aligncenter\" title=\"\u5982\u4f55\u4f7f\u7528Laravel\u5f00\u53d1\u4e00\u4e2a\u5728\u7ebf\u62fc\u56e2\u5e73\u53f0\u63d2\u56fe\" alt=\"\u5982\u4f55\u4f7f\u7528Laravel\u5f00\u53d1\u4e00\u4e2a\u5728\u7ebf\u62fc\u56e2\u5e73\u53f0\u63d2\u56fe\" \/><\/p>\n<p>\u8fd1\u5e74\u6765\uff0c\u968f\u7740\u79fb\u52a8\u4e92\u8054\u7f51\u7684\u5feb\u901f\u53d1\u5c55\uff0c\u5404\u79cd\u57fa\u4e8e\u56e2\u8d2d\u7684\u7535\u5546\u5e73\u53f0\u5982\u96e8\u540e\u6625\u7b0b\u822c\u6d8c\u73b0\uff0c\u5176\u4e2d\u4ee5\u62fc\u56e2\u4e3a\u4e3b\u6253\u7684\u7535\u5546\u5e73\u53f0\u66f4\u662f\u8d8a\u6765\u8d8a\u53d7\u5230\u6d88\u8d39\u8005\u7684\u6b22\u8fce\u3002\u672c\u6587\u5c06\u4ecb\u7ecd\u5982\u4f55\u4f7f\u7528Laravel\u6846\u67b6\u5f00\u53d1\u4e00\u4e2a\u5728\u7ebf\u62fc\u56e2\u5e73\u53f0\uff0c\u5e76\u63d0\u4f9b\u5177\u4f53\u7684\u4ee3\u7801\u793a\u4f8b\u3002<\/p>\n<p>\u4e00\u3001\u9700\u6c42\u5206\u6790<\/p>\n<p>\u5728\u5f00\u59cb\u5f00\u53d1\u4e4b\u524d\uff0c\u6211\u4eec\u9700\u8981\u5148\u8fdb\u884c\u9700\u6c42\u5206\u6790\uff0c\u660e\u786e\u9700\u8981\u5f00\u53d1\u54ea\u4e9b\u529f\u80fd\u6a21\u5757\u3002\u4e00\u4e2a\u5b8c\u6574\u7684\u62fc\u56e2\u5e73\u53f0\u4e00\u822c\u9700\u8981\u5305\u542b\u4ee5\u4e0b\u6a21\u5757\uff1a<\/p>\n<p>1.\u7528\u6237\u7ba1\u7406\u6a21\u5757<\/p>\n<p>\u7528\u6237\u6ce8\u518c\u3001\u767b\u5f55\u3001\u4e2a\u4eba\u4fe1\u606f\u7ba1\u7406\u7b49\u3002<\/p>\n<p>2.\u5546\u54c1\u7ba1\u7406\u6a21\u5757<\/p>\n<p>\u7ba1\u7406\u5458\u53ef\u4ee5\u6dfb\u52a0\u5546\u54c1\u4fe1\u606f\uff0c\u5305\u62ec\u5546\u54c1\u540d\u79f0\u3001\u4ef7\u683c\u3001\u5e93\u5b58\u7b49\u3002<\/p>\n<p>3.\u8ba2\u5355\u7ba1\u7406\u6a21\u5757<\/p>\n<p>\u7528\u6237\u53ef\u4ee5\u9009\u62e9\u5546\u54c1\u8fdb\u884c\u62fc\u56e2\uff0c\u4e0b\u5355\u8d2d\u4e70\uff0c\u7ba1\u7406\u5458\u53ef\u4ee5\u67e5\u770b\u5e76\u5904\u7406\u8ba2\u5355\u3002<\/p>\n<p>4.\u62fc\u56e2\u7ba1\u7406\u6a21\u5757<\/p>\n<p>\u7528\u6237\u53ef\u4ee5\u521b\u5efa\u62fc\u56e2\u6d3b\u52a8\u6216\u53c2\u52a0\u5df2\u6709\u7684\u62fc\u56e2\u6d3b\u52a8\u3002<\/p>\n<p>5.\u652f\u4ed8\u6a21\u5757<\/p>\n<p>\u652f\u6301\u591a\u79cd\u652f\u4ed8\u65b9\u5f0f\uff0c\u7528\u6237\u53ef\u4ee5\u9009\u62e9\u9002\u5408\u81ea\u5df1\u7684\u652f\u4ed8\u65b9\u5f0f\u8fdb\u884c\u652f\u4ed8\u3002<\/p>\n<p>\u4e8c\u3001\u73af\u5883\u642d\u5efa<\/p>\n<p>\u642d\u5efa\u5f00\u53d1\u73af\u5883\u4e4b\u524d\uff0c\u9700\u8981\u5148\u5b89\u88c5\u597dComposer\uff0c\u7136\u540e\u5728\u547d\u4ee4\u884c\u4e2d\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a<\/p>\n<pre>composer create-project --prefer-dist laravel\/laravel pin-tuan<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>\u8fd9\u4e2a\u547d\u4ee4\u4f1a\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a\u201cpin-tuan\u201d\u7684Laravel\u9879\u76ee\u3002<\/p>\n<p>\u63a5\u7740\uff0c\u6211\u4eec\u9700\u8981\u914d\u7f6e\u4e00\u4e0b\u6570\u636e\u5e93\uff0c\u7f16\u8f91\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u201c.env\u201d\u6587\u4ef6\uff0c\u5c06\u6570\u636e\u5e93\u76f8\u5173\u4fe1\u606f\u586b\u5199\u5b8c\u6574\u3002<\/p>\n<pre>DB_CONNECTION=mysql\nDB_HOST=127.0.0.1\nDB_PORT=3306\nDB_DATABASE=pin-tuan\nDB_USERNAME=root\nDB_PASSWORD=root<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>\u5b8c\u6210\u4ee5\u4e0a\u6b65\u9aa4\u540e\uff0c\u5c31\u53ef\u4ee5\u5f00\u59cb\u7f16\u5199\u7a0b\u5e8f\u4ee3\u7801\u4e86\u3002<\/p>\n<p>\u4e09\u3001\u7f16\u5199\u7a0b\u5e8f\u4ee3\u7801<\/p>\n<p>1.\u7528\u6237\u7ba1\u7406\u6a21\u5757<\/p>\n<p>\uff081\uff09\u7528\u6237\u6ce8\u518c<\/p>\n<p>\u9996\u5148\uff0c\u6211\u4eec\u9700\u8981\u5728\u8def\u7531\u6587\u4ef6\u4e2d\u6dfb\u52a0\u6ce8\u518c\u8def\u7531\uff1a<\/p>\n<pre>Route::get('\/register', 'AuthRegisterController@showRegistrationForm')-&amp;gt;name('register');\nRoute::post('\/register', 'AuthRegisterController@register');<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>\u8fd9\u91cc\u6211\u4eec\u4f7f\u7528Laravel\u81ea\u5e26\u7684\u7528\u6237\u8ba4\u8bc1\u7cfb\u7edf\u6765\u5b9e\u73b0\u7528\u6237\u6ce8\u518c\u529f\u80fd\u3002\u5728\u63a7\u5236\u5668\u6587\u4ef6\u4e2d\uff0c\u6211\u4eec\u53ea\u9700\u8981\u91cd\u5199showRegistrationForm()\u548cregister()\u65b9\u6cd5\u3002\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre>class RegisterController extends Controller\n{\n    use RegistersUsers;\n\n    protected $redirectTo = '\/dashboard';\n\n    public function __construct()\n    {\n        $this-&amp;gt;middleware('guest');\n    }\n\n    public function showRegistrationForm()\n    {\n        return view('auth.register');\n    }\n\n    protected function register(Request $request)\n    {\n        $this-&amp;gt;validator($request-&amp;gt;all())-&amp;gt;validate();\n\n        event(new Registered($user = $this-&amp;gt;create($request-&amp;gt;all())));\n\n        $this-&amp;gt;guard()-&amp;gt;login($user);\n\n        return redirect($this-&amp;gt;redirectPath());\n    }\n}<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>\uff082\uff09\u7528\u6237\u767b\u5f55<\/p>\n<p>\u5728\u8def\u7531\u6587\u4ef6\u4e2d\u6dfb\u52a0\u767b\u5f55\u8def\u7531\uff1a<\/p>\n<pre>Route::get('\/login', 'AuthLoginController@showLoginForm')-&amp;gt;name('login');\nRoute::post('\/login', 'AuthLoginController@login');\nRoute::post('\/logout', 'AuthLoginController@logout')-&amp;gt;name('logout');<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>\u540c\u6837\u5730\uff0c\u6211\u4eec\u4f7f\u7528Laravel\u81ea\u5e26\u7684\u7528\u6237\u8ba4\u8bc1\u7cfb\u7edf\u6765\u5b9e\u73b0\u7528\u6237\u767b\u5f55\u529f\u80fd\u3002\u5728\u63a7\u5236\u5668\u6587\u4ef6\u4e2d\uff0c\u6211\u4eec\u53ea\u9700\u8981\u91cd\u5199showLoginForm()\u3001login()\u548clogout()\u65b9\u6cd5\u3002\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre>class LoginController extends Controller\n{\n    use AuthenticatesUsers;\n\n    protected $redirectTo = '\/dashboard';\n\n    public function __construct()\n    {\n        $this-&amp;gt;middleware('guest')-&amp;gt;except('logout');\n    }\n\n    public function showLoginForm()\n    {\n        return view('auth.login');\n    }\n\n    protected function authenticated(Request $request, $user)\n    {\n        if (!$user-&amp;gt;is_activated) {\n            $this-&amp;gt;guard()-&amp;gt;logout();\n\n            return redirect('\/login')-&amp;gt;withError('\u8bf7\u5148\u6fc0\u6d3b\u60a8\u7684\u8d26\u53f7');\n        }\n    }\n\n    public function logout(Request $request)\n    {\n        $this-&amp;gt;guard()-&amp;gt;logout();\n\n        $request-&amp;gt;session()-&amp;gt;invalidate();\n\n        return redirect('\/login');\n    }\n}<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>\uff083\uff09\u4e2a\u4eba\u4fe1\u606f\u7ba1\u7406<\/p>\n<p>\u5728\u63a7\u5236\u5668\u6587\u4ef6\u4e2d\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5199\u4e00\u4e2aupdate()\u65b9\u6cd5\u6765\u5904\u7406\u4e2a\u4eba\u4fe1\u606f\u66f4\u65b0\u7684\u8bf7\u6c42\u3002\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre>public function update(Request $request)\n{\n    $user = Auth::user();\n\n    $this-&amp;gt;validate($request, [\n        'name' =&amp;gt; 'required|string|max:255|unique:users,name,' . $user-&amp;gt;id,\n        'email' =&amp;gt; 'required|string|email|max:255|unique:users,email,' . $user-&amp;gt;id,\n        'password' =&amp;gt; 'nullable|string|min:6|confirmed',\n    ]);\n\n    $user-&amp;gt;name = $request-&amp;gt;input('name');\n    $user-&amp;gt;email = $request-&amp;gt;input('email');\n    if ($request-&amp;gt;has('password')) {\n        $user-&amp;gt;password = bcrypt($request-&amp;gt;input('password'));\n    }\n    $user-&amp;gt;save();\n\n    return redirect()-&amp;gt;back()-&amp;gt;withSuccess('\u66f4\u65b0\u6210\u529f');\n}<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>2.\u5546\u54c1\u7ba1\u7406\u6a21\u5757<\/p>\n<p>\uff081\uff09\u5546\u54c1\u5217\u8868<\/p>\n<p>\u9996\u5148\uff0c\u5728\u6a21\u578b\u6587\u4ef6\u4e2d\u5b9a\u4e49\u5546\u54c1\u6a21\u578b\uff1a<\/p>\n<pre>class Product extends Model\n{\n    protected $fillable = ['name', 'price', 'stock', 'description', 'image'];\n\n    public function getAvatarAttribute($value)\n    {\n        return asset('storage\/' . $value);\n    }\n}<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>\u63a5\u7740\uff0c\u5728\u63a7\u5236\u5668\u6587\u4ef6\u4e2d\uff0c\u6211\u4eec\u5199\u4e00\u4e2aindex()\u65b9\u6cd5\u6765\u5c55\u793a\u5546\u54c1\u5217\u8868\u3002\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre>public function index()\n{\n    $products = Product::all();\n\n    return view('product.index', compact('products'));\n}<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>\u5728\u89c6\u56fe\u6587\u4ef6\u4e2d\uff0c\u6211\u4eec\u53ea\u9700\u8981\u904d\u5386\u51fa\u6240\u6709\u7684\u5546\u54c1\uff0c\u5e76\u5c55\u793a\u51fa\u6765\u5373\u53ef\u3002\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre>@foreach ($products as $product)\n    &lt;div class=\"col-md-4\"&gt;\n        &lt;div class=\"card mb-4 shadow-sm\"&gt;\n            @@##@@image }}\" width=\"100%\"&amp;gt;\n            &lt;div class=\"card-body\"&gt;\n                &lt;h5 class=\"card-title\"&gt;{{ $product-&amp;gt;name }}&lt;\/h5&gt;\n                &lt;p class=\"card-text\"&gt;{{ $product-&amp;gt;description }}&lt;\/p&gt;\n                &lt;div class=\"d-flex justify-content-between align-items-center\"&gt;\n                    &lt;div class=\"btn-group\"&gt;\n                        &lt;a href=\"%7B%7B%20route('product.show',%20%24product-&amp;gt;id)%20%7D%7D\" class=\"btn btn-sm btn-outline-secondary\"&gt;\u67e5\u770b&lt;\/a&gt;\n                    &lt;\/div&gt;\n                    &lt;small class=\"text-muted\"&gt;{{ $product-&amp;gt;price }}\u5143&lt;\/small&gt;\n                &lt;\/div&gt;\n            &lt;\/div&gt;\n        &lt;\/div&gt;\n    &lt;\/div&gt;\n@endforeach<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>\uff082\uff09\u5546\u54c1\u8be6\u60c5<\/p>\n<p>\u5728\u63a7\u5236\u5668\u6587\u4ef6\u4e2d\uff0c\u6211\u4eec\u5199\u4e00\u4e2ashow()\u65b9\u6cd5\u6765\u5c55\u793a\u5546\u54c1\u8be6\u60c5\u3002\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre>public function show($id)\n{\n    $product = Product::findOrFail($id);\n\n    return view('product.show', compact('product'));\n}<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>\u5728\u89c6\u56fe\u6587\u4ef6\u4e2d\uff0c\u6211\u4eec\u53ea\u9700\u8981\u5c55\u793a\u51fa\u5546\u54c1\u7684\u8be6\u7ec6\u4fe1\u606f\u5373\u53ef\u3002\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre>&lt;div class=\"row\"&gt;\n    &lt;div class=\"col-md-6\"&gt;\n        @@##@@image }}\" width=\"100%\"&amp;gt;\n    &lt;\/div&gt;\n    &lt;div class=\"col-md-6\"&gt;\n        &lt;h2&gt;{{ $product-&amp;gt;name }}&lt;\/h2&gt;\n        &lt;p&gt;\u4ef7\u683c\uff1a{{ $product-&amp;gt;price }}\u5143&lt;\/p&gt;\n        &lt;p&gt;\u5e93\u5b58\uff1a{{ $product-&amp;gt;stock }}\u4ef6&lt;\/p&gt;\n        &lt;form action=\"%7B%7B%20route('product.buy',%20%24product-&amp;gt;id)%20%7D%7D\" method=\"post\"&gt;\n            @csrf\n            &lt;div class=\"form-group\"&gt;\n                &lt;label for=\"quantity\"&gt;\u6570\u91cf&lt;\/label&gt;\n                &lt;input type=\"number\" name=\"quantity\" class=\"form-control\" min=\"1\" max=\"{{ $product-&amp;gt;stock }}\" required&gt;\n&lt;\/div&gt;\n            &lt;button type=\"submit\" class=\"btn btn-primary\"&gt;\u7acb\u5373\u8d2d\u4e70&lt;\/button&gt;\n        &lt;\/form&gt;\n    &lt;\/div&gt;\n&lt;\/div&gt;<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>3.\u8ba2\u5355\u7ba1\u7406\u6a21\u5757<\/p>\n<p>\uff081\uff09\u8ba2\u5355\u5217\u8868<\/p>\n<p>\u5728\u63a7\u5236\u5668\u6587\u4ef6\u4e2d\uff0c\u6211\u4eec\u5199\u4e00\u4e2aindex()\u65b9\u6cd5\u6765\u5c55\u793a\u8ba2\u5355\u5217\u8868\u3002\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre>public function index()\n{\n    $orders = Order::where('user_id', Auth::id())-&amp;gt;get();\n\n    return view('order.index', compact('orders'));\n}<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>\u5728\u89c6\u56fe\u6587\u4ef6\u4e2d\uff0c\u6211\u4eec\u53ea\u9700\u8981\u904d\u5386\u51fa\u6240\u6709\u7684\u8ba2\u5355\uff0c\u5e76\u5c55\u793a\u51fa\u6765\u5373\u53ef\u3002\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre>@foreach ($orders as $order)\n    &lt;tr&gt;\n&lt;td&gt;{{ $order-&amp;gt;id }}&lt;\/td&gt;\n        &lt;td&gt;{{ $order-&amp;gt;product-&amp;gt;name }}&lt;\/td&gt;\n        &lt;td&gt;{{ $order-&amp;gt;quantity }}&lt;\/td&gt;\n        &lt;td&gt;{{ $order-&amp;gt;price }}&lt;\/td&gt;\n        &lt;td&gt;{{ $order-&amp;gt;status }}&lt;\/td&gt;\n    &lt;\/tr&gt;\n@endforeach<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>\uff082\uff09\u4e0b\u5355\u8d2d\u4e70<\/p>\n<p>\u5728\u63a7\u5236\u5668\u6587\u4ef6\u4e2d\uff0c\u6211\u4eec\u5199\u4e00\u4e2abuy()\u65b9\u6cd5\u6765\u5b9e\u73b0\u4e0b\u5355\u8d2d\u4e70\u7684\u529f\u80fd\u3002\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre>public function buy(Request $request, $id)\n{\n    $product = Product::findOrFail($id);\n\n    $this-&amp;gt;validate($request, [\n        'quantity' =&amp;gt; 'required|integer|min:1|max:' . $product-&amp;gt;stock,\n    ]);\n\n    $total_price = $product-&amp;gt;price * $request-&amp;gt;input('quantity');\n\n    $order = new Order;\n    $order-&amp;gt;user_id = Auth::id();\n    $order-&amp;gt;product_id = $product-&amp;gt;id;\n    $order-&amp;gt;quantity = $request-&amp;gt;input('quantity');\n    $order-&amp;gt;price = $total_price;\n    $order-&amp;gt;status = '\u5f85\u652f\u4ed8';\n    $order-&amp;gt;save();\n\n    \/\/ \u8df3\u8f6c\u5230\u7b2c\u4e09\u65b9\u652f\u4ed8\u9875\u9762\n    return redirect()-&amp;gt;to('https:\/\/example.com\/pay\/' . $total_price);\n}<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>4.\u62fc\u56e2\u7ba1\u7406\u6a21\u5757<\/p>\n<p>\uff081\uff09\u521b\u5efa\u62fc\u56e2\u6d3b\u52a8<\/p>\n<p>\u5728\u63a7\u5236\u5668\u6587\u4ef6\u4e2d\uff0c\u6211\u4eec\u5199\u4e00\u4e2acreate()\u65b9\u6cd5\u6765\u5b9e\u73b0\u521b\u5efa\u62fc\u56e2\u6d3b\u52a8\u7684\u529f\u80fd\u3002\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre>public function create(Request $request)\n{\n    $product = Product::findOrFail($request-&amp;gt;input('product_id'));\n\n    $this-&amp;gt;validate($request, [\n        'group_size' =&amp;gt; 'required|integer|min:2|max:' . $product-&amp;gt;stock,\n        'group_price' =&amp;gt; 'required|numeric|min:0',\n        'expired_at' =&amp;gt; 'required|date|after:now',\n    ]);\n\n    $order = new Order;\n    $order-&amp;gt;user_id = Auth::id();\n    $order-&amp;gt;product_id = $product-&amp;gt;id;\n    $order-&amp;gt;quantity = $request-&amp;gt;input('group_size');\n    $order-&amp;gt;price = $request-&amp;gt;input('group_price') * $request-&amp;gt;input('group_size');\n    $order-&amp;gt;status = '\u5f85\u6210\u56e2';\n    $order-&amp;gt;save();\n\n    $group = new Group;\n    $group-&amp;gt;order_id = $order-&amp;gt;id;\n    $group-&amp;gt;size = $request-&amp;gt;input('group_size');\n    $group-&amp;gt;price = $request-&amp;gt;input('group_price');\n    $group-&amp;gt;expired_at = $request-&amp;gt;input('expired_at');\n    $group-&amp;gt;save();\n\n    return redirect()-&amp;gt;route('product.show', $product-&amp;gt;id)-&amp;gt;withSuccess('\u62fc\u56e2\u521b\u5efa\u6210\u529f');\n}<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>\uff082\uff09\u53c2\u52a0\u62fc\u56e2\u6d3b\u52a8<\/p>\n<p>\u5728\u63a7\u5236\u5668\u6587\u4ef6\u4e2d\uff0c\u6211\u4eec\u5199\u4e00\u4e2ajoin()\u65b9\u6cd5\u6765\u5b9e\u73b0\u53c2\u52a0\u62fc\u56e2\u6d3b\u52a8\u7684\u529f\u80fd\u3002\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre>public function join(Request $request, $id)\n{\n    $group = Group::findOrFail($id);\n\n    $user_id = Auth::id();\n    $product_id = $group-&amp;gt;order-&amp;gt;product_id;\n\n    \/\/ \u68c0\u67e5\u7528\u6237\u662f\u5426\u5df2\u53c2\u52a0\u8be5\u62fc\u56e2\u6d3b\u52a8\n    $order = Order::where('user_id', $user_id)-&amp;gt;where('product_id', $product_id)-&amp;gt;where('status', '\u5f85\u6210\u56e2')-&amp;gt;first();\n    if ($order) {\n        return redirect()-&amp;gt;route('product.show', $product_id)-&amp;gt;withError('\u60a8\u5df2\u53c2\u52a0\u8be5\u62fc\u56e2\u6d3b\u52a8');\n    }\n\n    \/\/ \u68c0\u67e5\u62fc\u56e2\u6d3b\u52a8\u662f\u5426\u5df2\u8fc7\u671f\n    if ($group-&amp;gt;expired_at route('product.show', $product_id)-&amp;gt;withError('\u8be5\u62fc\u56e2\u6d3b\u52a8\u5df2\u8fc7\u671f');\n    }\n\n    \/\/ \u68c0\u67e5\u62fc\u56e2\u4eba\u6570\u662f\u5426\u5df2\u6ee1\n    $count = Order::where('product_id', $product_id)-&amp;gt;where('status', '\u5f85\u6210\u56e2')-&amp;gt;count();\n    if ($count &amp;gt;= $group-&amp;gt;size) {\n        return redirect()-&amp;gt;route('product.show', $product_id)-&amp;gt;withError('\u8be5\u62fc\u56e2\u6d3b\u52a8\u5df2\u6ee1\u5458');\n    }\n\n    $order = new Order;\n    $order-&amp;gt;user_id = $user_id;\n    $order-&amp;gt;product_id = $product_id;\n    $order-&amp;gt;quantity = 1;\n    $order-&amp;gt;price = $group-&amp;gt;price;\n    $order-&amp;gt;status = '\u5f85\u652f\u4ed8';\n    $order-&amp;gt;group_id = $group-&amp;gt;id;\n    $order-&amp;gt;save();\n\n    \/\/ \u8df3\u8f6c\u5230\u7b2c\u4e09\u65b9\u652f\u4ed8\u9875\u9762\n    return redirect()-&amp;gt;to('https:\/\/example.com\/pay\/' . $group-&amp;gt;price);\n}<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>5.\u652f\u4ed8\u6a21\u5757<\/p>\n<p>\u7531\u4e8e\u672c\u6587\u53ea\u662f\u4e00\u4e2aDemo\uff0c\u6240\u4ee5\u6211\u4eec\u4e0d\u4f7f\u7528\u771f\u5b9e\u7684\u7b2c\u4e09\u65b9\u652f\u4ed8\u63a5\u53e3\uff0c\u76f4\u63a5\u8df3\u8f6c\u5230\u652f\u4ed8\u6210\u529f\u9875\u9762\u5373\u53ef\u3002<\/p>\n<p>\u56db\u3001\u603b\u7ed3<\/p>\n<p>\u4ee5\u4e0a\u5c31\u662f\u4f7f\u7528Laravel\u6846\u67b6\u5f00\u53d1\u4e00\u4e2a\u5728\u7ebf\u62fc\u56e2\u5e73\u53f0\u7684\u5168\u90e8\u6d41\u7a0b\u3002\u5f53\u7136\uff0c\u672c\u6587\u4ec5\u63d0\u4f9b\u4e86\u57fa\u672c\u7684\u529f\u80fd\u5b9e\u73b0\uff0c\u5b9e\u9645\u5f00\u53d1\u4e2d\u8fd8\u9700\u8981\u6839\u636e\u5177\u4f53\u9700\u6c42\u8fdb\u884c\u6269\u5c55\u548c\u6539\u8fdb\u3002\u5e0c\u671b\u8bfb\u8005\u80fd\u591f\u901a\u8fc7\u672c\u7bc7\u6587\u7ae0\uff0c\u66f4\u52a0\u719f\u6089Laravel\u6846\u67b6\u7684\u5e94\u7528\uff0c\u4e5f\u5e0c\u671b\u8bfb\u8005\u5728\u5b9e\u9645\u5f00\u53d1\u4e2d\u80fd\u591f\u4e0d\u65ad\u63a2\u7d22\u548c\u5c1d\u8bd5\u3002<\/p>\n<p><img><img> <\/p>\n<p>\u4ee5\u4e0a\u5c31\u662f\u5982\u4f55\u4f7f\u7528Laravel\u5f00\u53d1\u4e00\u4e2a\u5728\u7ebf\u62fc\u56e2\u5e73\u53f0\u7684\u8be6\u7ec6\u5185\u5bb9\uff0c\u66f4\u591a\u8bf7\u5173\u6ce8\u7c73\u4e91\u5176\u5b83\u76f8\u5173\u6587\u7ae0\uff01<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u8fd1\u5e74\u6765\uff0c\u968f\u7740\u79fb\u52a8\u4e92\u8054\u7f51\u7684\u5feb\u901f\u53d1\u5c55\uff0c\u5404\u79cd\u57fa\u4e8e\u56e2\u8d2d\u7684\u7535\u5546\u5e73\u53f0\u5982\u96e8\u540e\u6625\u7b0b\u822c\u6d8c\u73b0\uff0c\u5176\u4e2d\u4ee5\u62fc\u56e2\u4e3a\u4e3b\u6253\u7684\u7535\u5546\u5e73\u53f0\u66f4\u662f\u8d8a\u6765\u8d8a\u53d7\u5230\u6d88\u8d39\u8005\u7684\u6b22\u8fce\u3002\u672c\u6587\u5c06\u4ecb\u7ecd\u5982\u4f55\u4f7f\u7528Laravel\u6846\u67b6\u5f00\u53d1\u4e00\u4e2a\u5728\u7ebf\u62fc\u56e2\u5e73\u53f0\uff0c\u5e76\u63d0\u4f9b\u5177\u4f53\u7684\u4ee3\u7801\u793a\u4f8b\u3002 \u4e00\u3001\u9700\u6c42\u5206\u6790 \u5728\u5f00\u59cb\u5f00\u53d1\u4e4b\u524d\uff0c\u6211\u4eec\u9700\u8981\u5148\u8fdb\u884c\u9700\u6c42\u5206\u6790\uff0c\u660e\u786e\u9700\u8981\u5f00\u53d1\u54ea\u4e9b\u529f\u80fd\u6a21\u5757\u3002\u4e00\u4e2a\u5b8c\u6574\u7684\u62fc\u56e2\u5e73\u53f0\u4e00\u822c\u9700\u8981\u5305\u542b\u4ee5\u4e0b\u6a21\u5757\uff1a 1.\u7528\u6237\u7ba1\u7406\u6a21\u5757 \u7528\u6237\u6ce8\u518c\u3001\u767b\u5f55\u3001\u4e2a\u4eba\u4fe1\u606f\u7ba1\u7406\u7b49\u3002 2.\u5546\u54c1\u7ba1\u7406\u6a21\u5757 \u7ba1\u7406\u5458\u53ef\u4ee5\u6dfb\u52a0\u5546\u54c1\u4fe1\u606f\uff0c\u5305\u62ec\u5546\u54c1\u540d\u79f0\u3001\u4ef7\u683c\u3001\u5e93\u5b58\u7b49\u3002 3.\u8ba2\u5355\u7ba1\u7406\u6a21\u5757 \u7528\u6237\u53ef\u4ee5\u9009\u62e9\u5546\u54c1\u8fdb\u884c\u62fc\u56e2\uff0c\u4e0b\u5355\u8d2d\u4e70\uff0c\u7ba1\u7406\u5458\u53ef\u4ee5\u67e5\u770b\u5e76\u5904\u7406\u8ba2\u5355\u3002 4.\u62fc\u56e2\u7ba1\u7406\u6a21\u5757 \u7528\u6237\u53ef\u4ee5\u521b\u5efa\u62fc\u56e2\u6d3b\u52a8\u6216\u53c2\u52a0\u5df2\u6709\u7684\u62fc\u56e2\u6d3b\u52a8\u3002 5.\u652f\u4ed8\u6a21\u5757 \u652f\u6301\u591a\u79cd\u652f\u4ed8\u65b9\u5f0f\uff0c\u7528\u6237\u53ef\u4ee5\u9009\u62e9\u9002\u5408\u81ea\u5df1\u7684\u652f\u4ed8\u65b9\u5f0f\u8fdb\u884c\u652f\u4ed8\u3002 \u4e8c\u3001\u73af\u5883\u642d\u5efa \u642d\u5efa\u5f00\u53d1\u73af\u5883\u4e4b\u524d\uff0c\u9700\u8981\u5148\u5b89\u88c5\u597dComposer\uff0c\u7136\u540e\u5728\u547d\u4ee4\u884c\u4e2d\u8fd0\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a composer create-project &#8211;prefer-dist laravel\/laravel pin-tuan \u767b\u5f55\u540e\u590d\u5236 \u8fd9\u4e2a\u547d\u4ee4\u4f1a\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a\u201cpin-tuan\u201d\u7684Laravel\u9879\u76ee\u3002 \u63a5\u7740\uff0c\u6211\u4eec\u9700\u8981\u914d\u7f6e\u4e00\u4e0b\u6570\u636e\u5e93\uff0c\u7f16\u8f91\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u201c.env\u201d\u6587\u4ef6\uff0c\u5c06\u6570\u636e\u5e93\u76f8\u5173\u4fe1\u606f\u586b\u5199\u5b8c\u6574\u3002 DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=pin-tuan DB_USERNAME=root DB_PASSWORD=root \u767b\u5f55\u540e\u590d\u5236 \u5b8c\u6210\u4ee5\u4e0a\u6b65\u9aa4\u540e\uff0c\u5c31\u53ef\u4ee5\u5f00\u59cb\u7f16\u5199\u7a0b\u5e8f\u4ee3\u7801\u4e86\u3002 \u4e09\u3001\u7f16\u5199\u7a0b\u5e8f\u4ee3\u7801 1.\u7528\u6237\u7ba1\u7406\u6a21\u5757 \uff081\uff09\u7528\u6237\u6ce8\u518c \u9996\u5148\uff0c\u6211\u4eec\u9700\u8981\u5728\u8def\u7531\u6587\u4ef6\u4e2d\u6dfb\u52a0\u6ce8\u518c\u8def\u7531\uff1a Route::get(&#8216;\/register&#8217;, &#8216;AuthRegisterController@showRegistrationForm&#8217;)-&amp;gt;name(&#8216;register&#8217;); Route::post(&#8216;\/register&#8217;, &#8216;AuthRegisterController@register&#8217;); \u767b\u5f55\u540e\u590d\u5236 \u8fd9\u91cc\u6211\u4eec\u4f7f\u7528Laravel\u81ea\u5e26\u7684\u7528\u6237\u8ba4\u8bc1\u7cfb\u7edf\u6765\u5b9e\u73b0\u7528\u6237\u6ce8\u518c\u529f\u80fd\u3002\u5728\u63a7\u5236\u5668\u6587\u4ef6\u4e2d\uff0c\u6211\u4eec\u53ea\u9700\u8981\u91cd\u5199showRegistrationForm()\u548cregister()\u65b9\u6cd5\u3002\u5177\u4f53\u4ee3\u7801\u5982\u4e0b\uff1a class RegisterController extends Controller { use RegistersUsers; protected $redirectTo = &#8216;\/dashboard&#8217;; public function __construct() [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[16],"tags":[],"class_list":["post-24897","post","type-post","status-publish","format-standard","hentry","category-16"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/24897","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/comments?post=24897"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/24897\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=24897"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=24897"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=24897"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}