PDA

View Full Version : سوال: تعریف رویداد داخل مدل



bestirani2
سه شنبه 27 اسفند 1392, 15:24 عصر
سلام
میخواستم ببینم چطوری یه رویداد رو داخل مدل تعریف کنم؟
مثلاْ یه متد beforeInsert رو تعریف کنم و که قبل از insert کردن اطلاعات در پایگاه داده فراخوانی بشه؟
نحوه تعریف رویداد در سطح برنامه چیه؟ مثلا یک رویداد تعریف کنم که قبل از انجام عملیات مربوط به routing اجرا بشه؟

bestirani2
یک شنبه 03 فروردین 1393, 13:06 عصر
کسی نمیتونه کمک کنه؟

Cybersilent
دوشنبه 04 فروردین 1393, 12:27 عصر
صفحه 18 این کتاب (http://www.dotnet-tricks.com/Home/DotNetInterviewBook)رو مطالعه کنید که به تشریح چرخه کار MVC پرداخته.
سوال اولتون رو درست متوجه نشدم. یعنی می خواید چیزی شبیه Trigger درست کنید؟
سوال دوم هم یک راه میتونه استفاده از custom Route Constraint باشه که در اینجا (https://www.simple-talk.com/dotnet/.net-framework/asp.net-mvc-routing-extensibility/)نحوه پیاده سازی اون توضیح داده شده.

مهدی کرامتی
دوشنبه 04 فروردین 1393, 12:56 عصر
معمولا چنین کدی در کنترلر در جایی که قرار است دستور Insert انجام شود نوشته می شود، مگر اینکه عمل مورد نظر را با استفاده از یک تریگر در سمت دیتابیس انجام دهید.

bestirani2
دوشنبه 04 فروردین 1393, 13:24 عصر
صفحه 18 این کتاب (http://www.dotnet-tricks.com/Home/DotNetInterviewBook)رو مطالعه کنید که به تشریح چرخه کار MVC پرداخته.
سوال اولتون رو درست متوجه نشدم. یعنی می خواید چیزی شبیه Trigger درست کنید؟
سوال دوم هم یک راه میتونه استفاده از custom Route Constraint باشه که در اینجا (https://www.simple-talk.com/dotnet/.net-framework/asp.net-mvc-routing-extensibility/)نحوه پیاده سازی اون توضیح داده شده.


معمولا چنین کدی در کنترلر در جایی که قرار است دستور Insert انجام شود نوشته می شود، مگر اینکه عمل مورد نظر را با استفاده از یک تریگر در سمت دیتابیس انجام دهید.

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

درسته ولی داخل برنامه ام نه سمت دیتابیس مثلاً در داخل سیمفونی میشه همچین کدی نوشت که قبل از Insert کردن createdAt را مقدار دهی کنه. توجه کنید این فقط به عنوان مثال ساده هست و میشه با Get و Set هم پیاده سازی کرد.

/**
* @ORM\PrePersist
*/
public function setCreatedAtValue()
{
$this->createdAt = new \DateTime();
}


یا حتی پا رو فراتر گذاشت و یه باندل نوشت (معادل پکیج در Asp.net Mvc) که این باندل به طور خودکار هنگام اتفاق افتادن یه رویداد فعالیتی رو انجام بده. مثل


services:
my.listener:
class: Acme\SearchBundle\EventListener\SearchIndexer
tags:
- { name: doctrine.event_listener, event: postPersist }



// src/Acme/SearchBundle/EventListener/SearchIndexer.php
namespace Acme\SearchBundle\EventListener;


use Doctrine\ORM\Event\LifecycleEventArgs;
use Acme\StoreBundle\Entity\Product;


class SearchIndexer
{
public function postPersist(LifecycleEventArgs $args)
{
$entity = $args->getEntity();
$entityManager = $args->getEntityManager();


// perhaps you only want to act on some "Product" entity
if ($entity instanceof Product) {
// ... do something with the Product
}
}
}


البته تعریف رویداد فقط مربوط به مدل نمیشه و میشه واسه هر قسمت event listener اش رو قرار داد. مثلا قبل از ساخت کنترل، ساخت مسیریابی برنامه و ...

قسمت دوم هم یه مثال بود فقط و اینطوری حالت زیبایی نداره.

کلا دنبال چیزی مثل Event Listener هستم که توی سی شارپ هم Delegate و Event هست. فقط نمیدونم Event مربوط به هر چیزی کجا هست و چطوری میتونم فراخوانیش کنم.

امکان اضافه یک ویژگی هم به مدل نداری؟. توی فریم ورک های دیگه بهش میگند Behavier. مثلاً من یه پکیج Sluggable اضافه کنم. بعد توی قسمتی از مدلم با کمک Attribute بگم که این فیلد Slug هست و قبل از ذخیره کردن داخل دیتابیس به صورت خودکار عنوان رو برداره و یه Slug ازش بسازه.
به بیانی لازم نباشه هر بار قبل از ذخیره کردن اینکار رو انجام بدم و یه بار این کد رو بنویسیم و توی همه پروژه هام استفاده کنم.