رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
گیجی پس از مهاجرت از Codeigniter به Laravel
#1
سلام

من تصمیم گرفتم از Codeigniter بیام سمت Laravel و الآن دارم سعی می کنم یک پروژه کوچیک رو با Laravel بسازم.
آموزش های زیادی از لاراول دیدم ولی هنوز خیلی کارا رو نم دونم چطور انجام بدم. امیدوارم توی این پروژه تمرینی کمکم کنید تا راه بیفتم.
ببخشید که سوالاتم زیادی مبتری به نظر می رسند.
متشکرم

پروژه من یه سایت ثبت نام هست. کاربرا ثبت نام می کنند و پس از ورود می تونند درخواست های خودشون رو ثبت کنند.

سوالای من:

۱. چطور فرم رو پردازش کنم؟‌توی Codeigniter فرم رو به آدرس همین صفحه submit می کردم و اگه مقدار post براش ارسال شده بود وردازش می کردمش. اینجوری:

کد:
if ($this->input->post() != '') {
{
// Do something
}
else
// Show Form

۲. فرم ثبت نام رو باید طور خاصی بسازم که بتونم ازauth استفاده کنم؟ فرم Login رو چطور بسازم؟ قبلا دستی Session ها رو ست می کردم و بالای صفحه های لازم چک می کردم.

۳. توی Codeigniter هر Controller کار Route رو هم می کرد. ولی اینجا از هم جدا هستند. با این شرایط ایده خوبی هست که به ازای هر Route یک Controller بسازیم؟ یا مثلا کار خوبیه که چند تا Route رو به یک Controller ارجاع بدیم؟

۴. ساخت یک بانک اطلاعاتی بزرگ که توی MysqlWorkbench طراحی شده با migration خیلی پیچیده و مشکل به نظر می رسه. برای بانک های بزرگ این مورد رو توصیه می کنید؟ راهی برای ساده تر شدنش وجود داره؟

۵. اگه برای ساخت بانک اطلاعاتی از migration استفاده نکنم چطور ساختار جداول رو به لاراول بگم؟ داخل Model یا جای دیگه؟

متشکرم
پاسخ
#2
درود کاربر گرامی ، در مورد این که از Codeigniter به لاراول مهاجرت کردید کارتون کمی راحت تر هست چون با مفهوم MVC  آشنایی لازم رو دارید و استانداردهاش رو رعایت میکنید اما در مورد 5 موردی که فرمودید باید بگم که  :

1- برای پردازش فرم و ارسال اطلاعات اون باید یک اکشن از کنترلر رو بهش پاس بدید که در یک روت خاصی اون رو تعریف کردید بدین شکل :

کد فرم :

کد:
<form action="/foo/bar" method="POST">
   <input type="hidden" name="_method" value="PUT">
   <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>


Route تعریف شده براش پردازش : ذخیره کردن اطلاعات :

کد:
Route::post('foo/bar','FooController@store');


کد اکشن مربوط به کنترلر :

کد:
public function store(Request $request)
   {
       $input=Request::all();
       FOO::create($input);
       return redirect('home');
   }

نکته :  برای ولید کردن فرمتون هم میتونید از rule ها کمک بگیرید و یک rule  تعریف کنید و فیلد هایی که قرار پر بشوند رو تعیین کنید

نمونه کد :
کد:
$validator = Validator::make($request->all(), [
           'title' => 'required|unique:posts|max:255',
           'body' => 'required',
       ]);

       if ($validator->fails()) {
           return redirect('post/create')
                       ->withErrors($validator)
                       ->withInput();
       }


2-  برای ساخت فرم لاگین و ثبت نام لطفا این لینک رو دنبال کنید  چون نیازی به توضیح نیست و کاملا شیوا بیان شده . در رابطه با سشن و کوکی هم خود لاراول این ها رو هندل میکنه و میتونید از طریق کلاس Auth::check() لاگین کاربر رو چک کنید .


3- ببینید ساختار کلی کنترلر ها بدین گونه است که شما به عنوان مثال چند عملیات مانند :  درج ، حذف ، ویرایش دارید برای این سه مورد نیازی نیست کنترلر جدا بسازید میتونید یک کنترلر داشته باشید و چند روت که به اکشن های مختلف آن کنترلر Call میشود .


4- بنده هم اوایل سختم بود ولی کمی که با migration  ها کار کنید میبینید که چقدر سرعت شما رو بالا میبره و همچنین اگر زمانی به فایل sql مورد نظر دسترسی نداشته باشی با یک migrate  ساده میتونید کلیه جداول دیتابیس تون رو ایجاد کنید .


5 - اصلا قانونی نیست که شما حتما از migration  ها استفاده کنید شما میتونید دستی از phpmyadmin  جداول رو ایجاد و استفاده کنید و داخل مدل هم میتونید یک سری تنظیمات رو داشته باشید و کافیه فقط یک مدل به نام جدولتون تون بسازید و اون رو در کنترلر تون use کنید .



امیدوارم اندوخته نچندان بنده به درتون خورده باشه .


با تشکر
کد آن است که خود ببوید نه آن که برنامه نویس بگوید  Cool
پاسخ
#3
دوباره سلام
خیلی توضیحات خوبی داده بودید. واقعا متشکرم.
ولی باز به مشکل خوردم و امیدوارم این دفعه هم بتونید کمکم کنید.
از دیروز می خوام چهار تا جدول با migration بسازم ولی هنوز موفق نشدم. واقعا ساختن چهار تا جدول نباید اینقدر دردسر داشته باشه. اینجوری برای ئروژه های بزرگ چکار میشه کرد؟ راه راحت تری داره؟
خب من بانک اطلاعاتی خودمو توی MySQL Workbenck طراحی کردم و جدول ها رو یکی یکی توی سایت adolfocuadros.com/sql_to_laravel کپی می کردم و به Migration اضافه می کردم. ولی در مورد ارتباط بین جداول به مشکل برخوردم.

متشکرم

تصویر بانک اطلاعاتی رو ضمیمه کردم.
این خطای Artisan :
کد:
php artisan migrate


 [Illuminate\Database\QueryException]
 SQLSTATE[HY000]: General error: 1005 Can't create table `tour`.`#sql-2068_20` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: a
 lter table `tours` add constraint tours_hotel_id_foreign foreign key (`hotel_id`) references `hotels` (`id`))



 [PDOException]
 SQLSTATE[HY000]: General error: 1005 Can't create table `tour`.`#sql-2068_20` (errno: 150 "Foreign key constraint is incorrectly formed")
اینم کد migration با اندکی تصرف:

کد:
<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateAllTables extends Migration
{
   /**
    * Run the migrations.
    *
    * @return void
    */
   public function up()
   {
       Schema::create('hotels', function(Blueprint $table) {
           $table->engine = 'InnoDB';

           $table->integer('id');
           $table->integer('City')->nullable();
           $table->string('Address', 500)->nullable();
           $table->string('Tel', 200)->nullable();
           $table->string('Name', 100)->nullable();
           $table->tinyInteger('Stars')->nullable();
           $table->timestamps();

       });

       Schema::create('tours', function(Blueprint $table) {
           $table->engine = 'InnoDB';

           $table->integer('id');
           $table->integer('hotel_id')->unsigned();
           $table->string('Name', 200)->nullable();
           $table->date('StartDate')->nullable();
           $table->date('EndDate')->nullable();
           $table->tinyInteger('Eghamat')->nullable();
           $table->tinyInteger('Haml')->nullable();
           $table->integer('Days')->nullable();
           $table->string('Food', 200)->nullable();
           $table->string('tourcol1', 45)->nullable();
           $table->timestamps();

           $table->foreign('hotel_id')
               ->references('id')->on('hotels');

       });

       Schema::create('users', function(Blueprint $table) {
           $table->engine = 'InnoDB';

           $table->integer('id');
           $table->string('FirstName', 200)->nullable();
           $table->string('LastName', 200)->nullable();
           $table->string('email')->unique();
           $table->string('password', 60);
           $table->string('FatherName', 200)->nullable();
           $table->string('CodeMelli', 45)->nullable();
           $table->string('Mobile', 45)->nullable();
           $table->string('Phone', 45)->nullable();
           $table->string('Address', 500)->nullable();
           $table->tinyInteger('Jensiat')->nullable();
           $table->string('Age', 45)->nullable();
           $table->tinyInteger('Alayegh')->nullable();
           $table->string('Job', 45)->nullable();
           $table->tinyInteger('Savad')->nullable();
           $table->string('Hamrahan', 1000)->nullable();
           $table->rememberToken();
           $table->timestamps();

       });

       Schema::create('membership', function(Blueprint $table) {
           $table->engine = 'InnoDB';

           $table->integer('user_id')->unsigned();
           $table->integer('tour_id')->unsigned();
           $table->timestamps();

           $table->foreign('user_id')
               ->references('id')->on('users');
           $table->foreign('tour_id')
               ->references('id')->on('tours');
       });

       Schema::create('password_resets', function (Blueprint $table) {
           $table->string('email')->index();
           $table->string('token')->index();
           $table->timestamp('created_at');
       });
   }

   /**
    * Reverse the migrations.
    *
    * @return void
    */
   public function down()
   {
       Schema::drop('tours');
       Schema::drop('hotels');
       Schema::drop('users');
       Schema::drop('membership');
   }
}


فایل‌های پیوست تصاویر بندانگشتی
   
پاسخ
#4
(01-17-2016, 05:51 AM)rostamiani نوشته:  دوباره سلام
خیلی توضیحات خوبی داده بودید. واقعا متشکرم.
ولی باز به مشکل خوردم و امیدوارم این دفعه هم بتونید کمکم کنید.
از دیروز می خوام چهار تا جدول با migration بسازم ولی هنوز موفق نشدم. واقعا ساختن چهار تا جدول نباید اینقدر دردسر داشته باشه. اینجوری برای ئروژه های بزرگ چکار میشه کرد؟ راه راحت تری داره؟
خب من بانک اطلاعاتی خودمو توی MySQL Workbenck طراحی کردم و جدول ها رو یکی یکی توی سایت adolfocuadros.com/sql_to_laravel کپی می کردم و به Migration اضافه می کردم. ولی در مورد ارتباط بین جداول به مشکل برخوردم.

متشکرم

تصویر بانک اطلاعاتی رو ضمیمه کردم.
این خطای Artisan :

کد:
php artisan migrate


 [Illuminate\Database\QueryException]
 SQLSTATE[HY000]: General error: 1005 Can't create table `tour`.`#sql-2068_20` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: a
 lter table `tours` add constraint tours_hotel_id_foreign foreign key (`hotel_id`) references `hotels` (`id`))



 [PDOException]
 SQLSTATE[HY000]: General error: 1005 Can't create table `tour`.`#sql-2068_20` (errno: 150 "Foreign key constraint is incorrectly formed")
اینم کد migration با اندکی تصرف:


کد:
<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateAllTables extends Migration
{
   /**
    * Run the migrations.
    *
    * @return void
    */
   public function up()
   {
       Schema::create('hotels', function(Blueprint $table) {
           $table->engine = 'InnoDB';

           $table->integer('id');
           $table->integer('City')->nullable();
           $table->string('Address', 500)->nullable();
           $table->string('Tel', 200)->nullable();
           $table->string('Name', 100)->nullable();
           $table->tinyInteger('Stars')->nullable();
           $table->timestamps();

       });

       Schema::create('tours', function(Blueprint $table) {
           $table->engine = 'InnoDB';

           $table->integer('id');
           $table->integer('hotel_id')->unsigned();
           $table->string('Name', 200)->nullable();
           $table->date('StartDate')->nullable();
           $table->date('EndDate')->nullable();
           $table->tinyInteger('Eghamat')->nullable();
           $table->tinyInteger('Haml')->nullable();
           $table->integer('Days')->nullable();
           $table->string('Food', 200)->nullable();
           $table->string('tourcol1', 45)->nullable();
           $table->timestamps();

           $table->foreign('hotel_id')
               ->references('id')->on('hotels');

       });

       Schema::create('users', function(Blueprint $table) {
           $table->engine = 'InnoDB';

           $table->integer('id');
           $table->string('FirstName', 200)->nullable();
           $table->string('LastName', 200)->nullable();
           $table->string('email')->unique();
           $table->string('password', 60);
           $table->string('FatherName', 200)->nullable();
           $table->string('CodeMelli', 45)->nullable();
           $table->string('Mobile', 45)->nullable();
           $table->string('Phone', 45)->nullable();
           $table->string('Address', 500)->nullable();
           $table->tinyInteger('Jensiat')->nullable();
           $table->string('Age', 45)->nullable();
           $table->tinyInteger('Alayegh')->nullable();
           $table->string('Job', 45)->nullable();
           $table->tinyInteger('Savad')->nullable();
           $table->string('Hamrahan', 1000)->nullable();
           $table->rememberToken();
           $table->timestamps();

       });

       Schema::create('membership', function(Blueprint $table) {
           $table->engine = 'InnoDB';

           $table->integer('user_id')->unsigned();
           $table->integer('tour_id')->unsigned();
           $table->timestamps();

           $table->foreign('user_id')
               ->references('id')->on('users');
           $table->foreign('tour_id')
               ->references('id')->on('tours');
       });

       Schema::create('password_resets', function (Blueprint $table) {
           $table->string('email')->index();
           $table->string('token')->index();
           $table->timestamp('created_at');
       });
   }

   /**
    * Reverse the migrations.
    *
    * @return void
    */
   public function down()
   {
       Schema::drop('tours');
       Schema::drop('hotels');
       Schema::drop('users');
       Schema::drop('membership');
   }
}


درود دوست گرامی ، خواهش میکنم ، در مورد مشکل جدیدی که برای شما رخ داده باید عرض کنم که کار با Migration خیلی ساده است اگر اصولش رو رعایت کنید .

برای Relation و ارتباط بین جداول باید حتما ابتدا جداول اصلی رو migrate کنید سپس جداولی که قرار است به آن ها ارتباط داشته باشد را ایجاد کنید . توصیه من به شما این هست که برای هر جدول یک migration جدا ایجاد و استفاده کنید اینجوری در آینده متوجه میشوید که چقدر کار شما راحت تر است و همچنین همچین خطاهایی کمتر رخ میدهد .


دوتا لینک براتون قرار میدم که کمکتون میکنه :

Migration : https://laravel.com/docs/5.1/migrations

RelationShips : https://laravel.com/docs/5.1/eloquent-relationships
کد آن است که خود ببوید نه آن که برنامه نویس بگوید  Cool
پاسخ
#5
سلام
خیلی متشکرم.
یعنی اگه برای هر جدول یک فایل جدید درست کنم خود Artisan به ترتیب درستی اونا رو اجرا می کنه؟

Update:
نشد!
هر جدول رو توی یک فایل جدا نوشتم ولی بازم خطا نشون میده!
اگه هر جدول رو جدا بسازم به چه ترتیبی به بانک اطلاعاتی اضافه میشن؟ به ترتیب ساخته شدن فایل؟  Undecided

کد:
 [Illuminate\Database\QueryException]
 SQLSTATE[HY000]: General error: 1005 Can't create table `tour`.`#sql-2068_a6` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: a
 lter table `tours` add constraint tours_hotel_id_foreign foreign key (`hotel_id`) references `hotels` (`id`))



 [PDOException]
 SQLSTATE[HY000]: General error: 1005 Can't create table `tour`.`#sql-2068_a6` (errno: 150 "Foreign key constraint is incorrectly formed")

Update:
فهمیدم به ترتیب تاریخ اجرا میشن. یعنی به همون ترتیب لازم باید بسازمشون و اگه اشتباه کنم کلی دردسر داره :-(
ولی ظاهرا توی Eloquent هم میشه ارتباط ها رو ساخت. اینا با هم چه فرقی دارند. البته می دونم تو حاالت دوم روابط توی بانک اطلاعاتی ذخیره نیمشن ولی بازم توی برنامه اعمال میشن.

شایدم آخرش از خیر Relationship بگذرم. به نظرم این Migration خیلی ار رو سخت کرده.

شما واقعا برای بانک اطلاعاتی با بیش از 10 جدول از Migrations استفاده می کند؟
یک سوال دیگه:
اگه قرار باشه بعدا توی بانک اطلاعاتی تغییری به وجود بیارم برای آپدیت کردنش Artisan می تونه فقط اون تغییر رو اعمال کنه یا باید از اول بانک اطلااتی رو بسازم یا مثلا برای یک تغییر نام ساده باید یک فایل Migration جدید بسازم؟

متشکرم
پاسخ
#6
درود ، دوست عزیز باید خدمتتون عرض کنم که درست متوجه شدید بر اساس تاریخ کار میکنه migration  ها و دقیقا مزیت آن اینجاست که شما با Command  های مختلفی از جمله : reset , refresh ,rollback,... میتونید روی جدول هاتون مانور بدید .

- درمورد RelationShipهم شما باید به این صورت عمل کنید :

برای ایجاد جدول از این کد :


کد پی‌اچ‌پی:
Schema::create('hotels', function(Blueprint $table) {
 
          $table->engine 'InnoDB';

 
          $table->integer('id');
 
          $table->integer('City')->nullable();
 
          $table->string('Address'500)->nullable();
 
          $table->string('Tel'200)->nullable();
 
          $table->string('Name'100)->nullable();
 
          $table->tinyInteger('Stars')->nullable();
 
          $table->timestamps();

 
      }); 

کد پی‌اچ‌پی:
Schema::create('tours', function(Blueprint $table) {
 
          $table->engine 'InnoDB';

 
          $table->integer('id');
 
          $table->integer('hotel_id')->unsigned();
 
          $table->string('Name'200)->nullable();
 
          $table->date('StartDate')->nullable();
 
          $table->date('EndDate')->nullable();
 
          $table->tinyInteger('Eghamat')->nullable();
 
          $table->tinyInteger('Haml')->nullable();
 
          $table->integer('Days')->nullable();
 
          $table->string('Food'200)->nullable();
 
          $table->string('tourcol1'45)->nullable();
 
          $table->timestamps(); 
برای برقرای ارتباط (relation) بین جداول این کد رو امتحان کنید  : (در یک میگریشن جدا و بعد از میگریت جدول بالا)

کد پی‌اچ‌پی:
Schema::table('tours', function (Blueprint $table) {
 
   
           $table
->foreign('hotel_id')
 
              ->references('id')->on('hotels');
 
       }); 


- بله بنده در پروژه هام از migration  استفاده میکنم و خیلی هم ساده و کاربردی هست .

-برای ایجاد تغییرات در جدولتون میتونید از دو روش استفاده کنید :

1 - اگر هنوز اطلاعاتی درون بانک قرار ندادید و یا اینکه اطلاعات براتون مهم نیست از Command های Reset , Refresh , Rollback بسته به نیازتون استفاده کنید فقط قبلش تغییراتتون رو در migration  اضافه کنید و این دستور رو مثلا اجرا کنید :
کد:
php artisan migrate:refresh


2- یک میگریشن جدید ایجاد کنید و این دستور رو در انتها بنویسید :
کد:
php artisan make:migration add_filde_image_table --table=hotels

و از این کد استفاده کنید : (با این کار ما یک فیلد جدید در جدولمون ایجاد کردیم و در اصل تغییرات دادیم)

کد پی‌اچ‌پی:
Schema::table('tours', function (Blueprint $table) {
 
   $table->string('image');
 
       }); 
کد آن است که خود ببوید نه آن که برنامه نویس بگوید  Cool
پاسخ
#7
خیلی متشکرم... تست می کنم و جوابشو بهتون میگم...
چند تا سوال دیگه هم دارم که خوشحال میشم راهنماییم کنید:

1. در مورد روش استفاده از کنترلز ها روش انتانداردی وجود داره؟ مثلا ایم مسیر های من هست. برای فرم هایی که قبل و بعد از submit  شدن نیازمند داده هستند. ئیشنهاد شما چیه؟ با اینطوری کتار کردن به مشکل نمی خورم؟
کد:
// User Routes
Route::get('tour', 'tour@user');
Route::post('tour', 'tour@user_submit');

Route::get('history', 'history@user');
Route::post('history', 'history@user_submit');

// Admin Routes
Route::get('admin/tour', 'tour@admin');
Route::post('admin/tour', 'tour@admin_submit');

Route::get('admin/hotel', 'hotel@admin');
Route::post('admin/hotel', 'hotel@admin_submit');

Route::get('admin/report', 'report@admin');
Route::post('admin/report', 'report@admin_submit');

2. سوال دیگه اینه که از کجا باید بفهمم حرف اول کلاس باید بزرگ باشه یا کوچک؟ توی اینترنت چیزی پیدا نکردم.
به عنوان مثال اسم فایل مدل کوچک هست. نام کلاس هم کوچکه. ولی وقت استفاده حرف اول بزرگ هست!

3. من یک کلاس کنترلر به اسم tour دارم و همینطور یک مدل به اسم tour. هم نا م بودن این دو کلاس مشکلی ایجاد نمی کنه؟

متشکرم
پاسخ
#8
درود ، اگه یک سرچی در انجمن میزدید بد نبود : آموزش کار با کنترلرها

جواب همه سوالاتتون در این تاپیک هست .


پاینده باشید.
کد آن است که خود ببوید نه آن که برنامه نویس بگوید  Cool
پاسخ
 


موضوعات مشابه ...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  مهاجرت از Codeigniter به Laravel برام مشکله! rostamiani 0 10 10-29-2016, 02:44 AM
آخرین ارسال: rostamiani
  CMS by Laravel sharifonline 0 82 09-27-2016, 06:08 PM
آخرین ارسال: sharifonline
  پیکربندی laravel leila 1 115 04-16-2016, 03:58 PM
آخرین ارسال: alihossein
  مشکل در نصب laravel , composer bahar213 1 169 01-27-2016, 09:19 AM
آخرین ارسال: tuytoosh

پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان

درباره انجمن فریم ورک لاراول

انجمن لاراولیستا به عشق توسعه دهنده ها و علاقمندان به این فریم ورک محبوب ایجاد شده و امیدواریم با نظرات خوبتون ما رو در بهبود کار یاری کنید. در ضمن خیلی هم خوشحال میشیم شما هم در توسعه این انجمن سهمی داشته باشید.